読者です 読者をやめる 読者になる 読者になる

劣等コンプレックス500%

身動きとれねえ 絵・プログラミング(C/C++/Java/Perl/PHP/Mysql)

【C/C++/WINAPI】 (GUI画面)ウィンドウ表示するための最小コード

僕がいつもVC++2010で使ってる、C++/WINAPIでの真っ白なウィンドウを表示する
GUIの最小コードです。
マウス入力、キーボード入力、WM_PAINT処理も付いてます
dprintf関数を使ってデバッグウィンドウに文字列出力も可能。

#include <windows.h>
#include <stdio.h>

//デバッグ出力用関数。printf()のフォーマットで使える。
#define dprintf( str, ... ) \
	{ \
		TCHAR c[2560]; \
		_stprintf( c, str, __VA_ARGS__ ); \
		OutputDebugString( c ); \
	}
	
HWND hwnd;
HINSTANCE hInstance;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp){
	static HDC hdc;
	static PAINTSTRUCT ps;
	
	switch(msg){
		case WM_KEYDOWN:{
			switch(wp){
				case 'A':{
					
					break;
				}
			}
			return 0;
		}
		case WM_LBUTTONDOWN:{
			int x = (lp & 0xFFFF);
			int y = ((lp >> 16) & 0xFFFF);
			
			return 0;
		}
		case WM_MOUSEMOVE:{
			int x = (lp & 0xFFFF);
			int y = ((lp >> 16) & 0xFFFF);
			
			return 0;
		}
		case WM_LBUTTONUP:{
			int x = (lp & 0xFFFF);
			int y = ((lp >> 16) & 0xFFFF);
			
			return 0;
		}
		case WM_PAINT: {
			hdc = BeginPaint(hwnd , &ps);
			
			//
			/*
			SetDIBitsToDevice(
				hdc , 0 , 0 ,
				srcBit_Info.bmiHeader.biWidth , srcBit_Info.bmiHeader.biHeight ,
				0 , 0 , 0 , srcBit_Info.bmiHeader.biHeight ,
				drawPixelBits , &srcBit_Info , DIB_PAL_COLORS);
			*/
				
			EndPaint(hwnd , &ps);
			return 0;
		}
		case WM_DESTROY: {
			PostQuitMessage(0);
			return 0;
		}
		case WM_CREATE: {
			return 0;
		}
	}
return DefWindowProc(hwnd, msg, wp, lp);
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow){
	WNDCLASSEX wc;                                 // 定義用の構造体
	LPTSTR pClassName = TEXT("MWIN");      // クラス名
	hInstance = hInst;

	wc.cbSize        = sizeof(WNDCLASSEX);         // 構造体サイズ
	wc.style         = CS_HREDRAW | CS_VREDRAW;    // クラススタイル
	wc.lpfnWndProc   = (WNDPROC)WndProc;       // プロシージャ
	wc.cbClsExtra    = 0;                          // 補足メモリブロック
	wc.cbWndExtra    = 0;                          //   のサイズ
	wc.hInstance     = hInst;                      // インスタンス
	wc.hIcon         = NULL;   // アイコン
	wc.hCursor       = LoadCursor(NULL,IDC_ARROW); // カーソル
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);   // 背景色
	wc.lpszMenuName  = NULL;                   // メニュー
	wc.lpszClassName = pClassName;                 // クラス名
	wc.hIconSm       = NULL;    // 小さいアイコン
	if (!RegisterClassEx(&wc)){
		MessageBox(NULL,TEXT("RegisterClass Error."),TEXT(""),MB_OK|MB_ICONWARNING);
		return -1;
	}
	
	hwnd = CreateWindow(pClassName, TEXT("タイトル"),
		WS_OVERLAPPEDWINDOW ,
		CW_USEDEFAULT, CW_USEDEFAULT,
		640, 480,
		NULL , NULL ,hInst , NULL);
	if(!hwnd){
		MessageBox(NULL,TEXT("CreateWindow Error."),TEXT(""),MB_OK|MB_ICONWARNING);
		return -1;
	}
	
	ShowWindow(hwnd, SW_SHOW);
	MSG msg;
	while(GetMessage(&msg , NULL , 0 , 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}