Win32APIで
BMP画像ファイル読み込みがわからなくて困っている人がいたので

参考までにソースあげ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
関数の中身を見るよろし
ちなみにWin32APIの関数は文字コード関係がうるさいので
初心者は

プロジェクト→[プロジェクト名]のプロパティ→構成プロパティ→全般
の文字セットの項目をUnicodeからマルチバイト文字に変更するとよいかも
適当な画像、test.bmpを読み込んで表示する

// template.cpp

#define BMPFILE TEXT("test.bmp")

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

TCHAR szClassName[] = TEXT("template");	//ウィンドウクラス


#pragma region InitWindow

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
				   LPSTR lpsCmdLine, int nCmdShow)
{
	MSG msg;
	BOOL bRet;
	
	if (!InitApp(hCurInst))
		return FALSE;
	if (!InitInstance(hCurInst, nCmdShow)) 
		return FALSE;
	while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
		if (bRet == -1) {
			break;
		} else {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	return (int)msg.wParam;
}

//ウィンドウ・クラスの登録

ATOM InitApp(HINSTANCE hInst)
{
	WNDCLASSEX wc;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WndProc;	//プロシージャ名
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInst;//インスタンス
	wc.hIcon = (HICON)LoadImage(NULL,
		MAKEINTRESOURCE(IDI_APPLICATION),
		IMAGE_ICON,
		0,
		0,
		LR_DEFAULTSIZE | LR_SHARED);
	wc.hCursor = (HCURSOR)LoadImage(NULL,
		MAKEINTRESOURCE(IDC_ARROW),
		IMAGE_CURSOR,
		0,
		0,
		LR_DEFAULTSIZE | LR_SHARED);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;	//メニュー名
	wc.lpszClassName = (LPCTSTR)szClassName;
	wc.hIconSm = (HICON)LoadImage(NULL,
		MAKEINTRESOURCE(IDI_APPLICATION),
		IMAGE_ICON,
		0,
		0,
		LR_DEFAULTSIZE | LR_SHARED);

	return (RegisterClassEx(&wc));
}

//ウィンドウの生成

BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
	HWND hWnd;

	hWnd = CreateWindow(szClassName,
			TEXT("Windowsプログラミング"), //タイトルバーにこの名前が表示されます
			WS_OVERLAPPEDWINDOW, //ウィンドウの種類
			CW_USEDEFAULT,	//X座標
			CW_USEDEFAULT,	//Y座標
			CW_USEDEFAULT,	//幅
			CW_USEDEFAULT,	//高さ
			NULL, //親ウィンドウのハンドル、親を作るときはNULL
			NULL, //メニューハンドル、クラスメニューを使うときはNULL
			hInst, //インスタンスハンドル
			NULL);
	if (!hWnd)
		return FALSE;
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	return TRUE;
}

#pragma endregion

//ウィンドウプロシージャ

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	int id;

	HDC hdc;					// デバイスコンテキストハンドル(描画の出力先(ディスプレイ)へのハンドル)
	PAINTSTRUCT ps;				// 描画構造体
	static HDC hMemDC;			
	static HBITMAP hBitmap;		// ビットマップハンドル
	static BITMAP bitmap;		// ビットマップ

	switch (msg) {
		case WM_CREATE:
			{
				hMemDC = CreateCompatibleDC(NULL);	
				hBitmap = (HBITMAP)LoadImage(
					(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),
					BMPFILE,IMAGE_BITMAP,
					0,0,LR_LOADFROMFILE);

				SelectObject(hMemDC,hBitmap);
				GetObject(hBitmap,sizeof(BITMAP),&bitmap);
			}
			break;
		case WM_PAINT:
			{
				hdc = BeginPaint(hWnd,&ps);
				BitBlt(hdc,0,0,bitmap.bmWidth,bitmap.bmHeight,hMemDC,0,0,SRCCOPY);
				EndPaint(hWnd,&ps);
			}
			break;
		case WM_CLOSE:
			{
				id = MessageBox(hWnd,
					TEXT("終了してもよろしいですか"),
					TEXT("確認"),
					MB_YESNO | MB_ICONQUESTION);
				if (id == IDYES)
					DestroyWindow(hWnd);
			}
			break;
		case WM_DESTROY:
			{
				DeleteDC(hMemDC);		// デバイスコンテキストの削除
				DeleteObject(hBitmap);	// ビットマップの消去
				PostQuitMessage(0);
			}
			break;
		default:
			return (DefWindowProc(hWnd, msg, wp, lp));
	}
	return 0;
}

添付ファイル: filetest.bmp 445件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-09-22 (水) 00:20:45