visualstudioのリソースファイルについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
教えてboy

visualstudioのリソースファイルについて

#1

投稿記事 by 教えてboy » 8年前

今WinAPIを使用してbitmapを表示しようとしています。
自分でリソーススクリプトを書いてコマンドプロンプトでリンクするとうまくいきます。
ですが面倒になったのでvisualstudio community2015を使用したいのですが
コンパイルは通りウィンドウ表示までは行くのですが
ウィンドウに表示されるはずの画像が表示されません。
公式のリファレンスを見てもよくわからないので
やり方を教えてほしいのです。

リソースは別のディレクトリの物をインポートして
リソースシンボルに表示されたIDとLoadBitmap(),BitBlt()
を使用して表示しようとしています。
リソースの追加以外はリソース関係の設定はいじっていません。

Math

Re: visualstudioのリソースファイルについて

#2

投稿記事 by Math » 8年前

http://dixq.net/board/board.htmlフォーラムルールを一度お読み下さい。
ルールのテンプレートです。(皆さんこういう感じに書かれています)
[1] 質問文
 [1.1] 自分が今行いたい事は何か
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
 [1.4] 今何がわからないのか、知りたいのか

[2] 環境  
 [2.1] OS : Windows, Linux等々
 [2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々

[3] その他
 ・どの程度C言語を理解しているか
 ・ライブラリを使っている場合は何を使っているか
------------------------------------------------------------------------------------
コードは[album] ボタンの上のコードボタンをおしてcode...../code(カッコ付き)で囲んでください。

教えてboy

Re: visualstudioのリソースファイルについて

#3

投稿記事 by 教えてboy » 8年前

1.1 winapiを使ってbitmapを表示したい。
1.2 まずコマンドプロンプトでbitmapを表示するプログラムを作成した。
次にコマンドを打つのが面倒なのでvisualstudioを使っておなじことをやろうとした。
ソースは下記の通りです。
//コマンドプロンプト版
resource.rc

コード:

KITTY BITMAP "test.bmp"
main.cpp

コード:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc , hBuffer;
	PAINTSTRUCT ps;
	static HBITMAP hBitmap;

	switch (msg) {
	case WM_DESTROY:
		DeleteObject(hBitmap);
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		hBitmap = LoadBitmap(
			((LPCREATESTRUCT)lp)->hInstance ,
			TEXT("KITTY")
		);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd , &ps);
		hBuffer = CreateCompatibleDC(hdc);
		SelectObject(hBuffer , hBitmap);

		BitBlt(hdc , 0 , 0 , 400 , 120 , hBuffer , 70 , 80 , SRCCOPY);

		DeleteDC(hBuffer);
		EndPaint(hwnd , &ps);
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL ,
			hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
//visualstudio版

コード:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc , hBuffer;
	PAINTSTRUCT ps;
	static HBITMAP hBitmap;

	switch (msg) {
	case WM_DESTROY:
		DeleteObject(hBitmap);
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		hBitmap = LoadBitmap(
			((LPCREATESTRUCT)lp)->hInstance ,
			TEXT("リソースビューでリソースシンボルを見たときに表示されたもの")
		);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd , &ps);
		hBuffer = CreateCompatibleDC(hdc);
		SelectObject(hBuffer , hBitmap);

		BitBlt(hdc , 0 , 0 , 400 , 120 , hBuffer , 70 , 80 , SRCCOPY);

		DeleteDC(hBuffer);
		EndPaint(hwnd , &ps);
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL ,
			hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
.rcはリソースの追加、.bmpはインポートを使った。
設定は特にいじってない。

上記のコードは
http://wisdom.sakura.ne.jp/system/winap ... in104.html
のコードをそのまま使いました。
1.3 画像が表示されずウィンドウだけになる。
1.4 visualstudioのリソースの使い方が分からない。公式のリファレンス
https://msdn.microsoft.com/ja-jp/library/7zxb70x7.aspx
を読んでもわからなかったので
より簡単な説明が知りたい。


2.1 OS:windows10
2.2 VC++ 2015community

教えてboy

Re: visualstudioのリソースファイルについて

#4

投稿記事 by 教えてboy » 8年前

すいません
3が抜けていました。
3.1 c言語は入門書を読んだ程度です。
私はc++を勉強しているのですがこれも入門書を読んだ程度です。
習熟度の参考になるかはわかりませんが作成したプログラムを書きます。
:コンソールとDXライブラリを使用したGUIの両方でライフゲーム ---cとc++両方で作った。
:コンソール用にwinapiを使用した簡単な描画ライブラリ ---c++
:CUIランチャー ---c++
:探索アルゴリズムの勉強,テスト用の完全グラフを自動で作成するプログラム ---c++
これらと簡単な再帰を使ったものなどで
大きなプログラムは作ったことがないので
classを使っても継承とかは使ったことがないです。
3.2 ライブラリはwinapiを使うのに必要なものです。
user32とか。

Math

Re: visualstudioのリソースファイルについて

#5

投稿記事 by Math » 8年前

ここ”プログラムからBitmap画像を扱う(VC++) 1回目 ”http://fa11enprince.hatenablog.com/entr ... /24/023546
詳しい説明があるのでご覧ください。
詳しい作動追跡を行うには次の様にDebugコンソールを追加すれば簡単です。

コード:

#include <windows.h>
#include <stdio.h>
 
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
    HDC hdc , hBuffer;
    PAINTSTRUCT ps;
    static HBITMAP hBitmap;
 
    switch (msg) {
    case WM_DESTROY:
        DeleteObject(hBitmap);
        PostQuitMessage(0);
        return 0;
    case WM_CREATE:
        hBitmap = LoadBitmap(
            ((LPCREATESTRUCT)lp)->hInstance ,
            TEXT("KITTY")
        );
printf("@--LoadBitmap(---->>\n\n");
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hwnd , &ps);
        hBuffer = CreateCompatibleDC(hdc);
        SelectObject(hBuffer , hBitmap);
 
        BitBlt(hdc , 0 , 0 , 400 , 120 , hBuffer , 70 , 80 , SRCCOPY);
 
        DeleteDC(hBuffer);
        EndPaint(hwnd , &ps);
        return 0;
    }
    return DefWindowProc(hwnd , msg , wp , lp);
}
 
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
            PSTR lpCmdLine , int nCmdShow ) {
//----------------------------------------Debug printf用-----------
AllocConsole(); FILE* out = 0; freopen_s(&out, "CON", "w", stdout); 
    HWND hwnd;printf("Start-------------------------------->>>\n\n");
    MSG msg;
    WNDCLASS winc;
 
    winc.style      = CS_HREDRAW | CS_VREDRAW;
    winc.lpfnWndProc    = WndProc;
    winc.cbClsExtra = winc.cbWndExtra   = 0;
    winc.hInstance      = hInstance;
    winc.hIcon      = LoadIcon(NULL , IDI_APPLICATION);
    winc.hCursor        = LoadCursor(NULL , IDC_ARROW);
    winc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
    winc.lpszMenuName   = NULL;
    winc.lpszClassName  = TEXT("KITTY");
 
    if (!RegisterClass(&winc)) return -1;
 
    hwnd = CreateWindow(
            TEXT("KITTY") , TEXT("Kitty on your lap") ,
            WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
            CW_USEDEFAULT , CW_USEDEFAULT ,
            CW_USEDEFAULT , CW_USEDEFAULT ,
            NULL , NULL ,
            hInstance , NULL
    );
 
    if (hwnd == NULL) return -1;
 
    while(GetMessage(&msg , NULL , 0 , 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }//-----Free--Debug--------------------------
    fclose(out); FreeConsole();return msg.wParam;
}

教えてboy

Re: visualstudioのリソースファイルについて

#6

投稿記事 by 教えてboy » 8年前

無事表示に成功しました。
ありがとうございました。
デバッグコンソールのやり方まで教えていただき大変助かります。
わたしはいろいろ調べるためによくprintfデバッグをするので
windowsプログラミングでもできるととてもたすかります。

visualstudioを使うのは結構難しいですね。
visualstudioを起動するのが面倒なのでいつもプロンプトでやっていたのですが
windowsプログラミングではこっちのほうが楽かなと思いやってみたのですが
そううまくはいかないようです。
でもプログラムの雛型ができているのはすごい楽なのでうれしいです。

Math

Re: visualstudioのリソースファイルについて

#7

投稿記事 by Math » 8年前

良かったですね!
私もコマンドプロンプト派でTeraPadとNoEditorがあれば殆どは間に合います!

閉鎖

“C言語何でも質問掲示板” へ戻る