■SDKのテンプレートとして作成しました。

リソースなしでコードからボタンやウインドウを生成しています。
ボタンを押したり、終了しようとするとメッセージボックスによりメッセージが表示されます。



#include <windows.h>

#define ID_BUTTON_1 1011
#define ID_BUTTON_2 1012
#define ID_BUTTON_3 1013

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

char szClassName[]="sample01"; //ウインドウクラス

HINSTANCE hInst;
HWND hWnd;

int WINAPI WinMain(HINSTANCE hCurInst,HINSTANCE hPrevInst,
					LPSTR lpsCmdLine,int nCmdShow ){
	MSG msg;
	BOOL bRet;

	hInst = hCurInst;
	if(!InitApp(hCurInst)) return FALSE;
	if(!InitInstance(hCurInst,nCmdShow)) return FALSE;
	while((bRet = GetMessage(&msg,NULL,0,0)) != 0){
		if(bRet == -1){
			MessageBox(NULL,"GetMessage ERR","Error",MB_OK);
			break;
		}else{
			if(!IsDialogMessage(hWnd,&msg)){//タブキーでコントロールを移動したくない場合はこの行をコメントする
				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 = (LPCSTR)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 = CreateWindow(szClassName,
		"タイトルバーにこの名前が表示されます",
		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;
}

//描画メソッド
//-------------------------------
//再描画したい時は次のように書く
//InvalidateRect(hWnd, NULL,1);
//UpdateWindow(hWnd);
//-------------------------------
COLORREF bkColor=RGB(200,255,255);//背景色を規定する
HBRUSH bkColorBrush=CreateSolidBrush(bkColor);//背景色のブラシを用意する

void paint(HWND hWnd){
	RECT rc;
	GetClientRect(hWnd,&rc);//ウインドウの範囲を取得

	PAINTSTRUCT ps;
	HDC hdc = BeginPaint(hWnd,&ps);

	//背景色の変更
	SetBkColor(hdc,bkColor);
	FillRect(hdc,&rc,bkColorBrush);

	SetTextColor(hdc,RGB(255,0,0));//テキストの色
	//フォントの作成          ↓フォントのサイズ
	HFONT font = CreateFont(100,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,
	CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_DONTCARE,"MS ゴジック");

	HFONT oldFont = (HFONT)SelectObject(hdc,font);//フォントの適用
	HPEN pen=CreatePen(PS_SOLID,3,RGB(255,0,0));//ペンの作成 PS_SOLID(実線)	PS_DASH(破線)	PS_DOT(点線)	PS_DASHDOT(1点鎖線)
							//PS_DASHDOTDOT(2点鎖線)	PS_NULL(空のペン)	PS_INSIDEFRAME(実線)
	
	HPEN oldPen = (HPEN)SelectObject(hdc,pen);//ペンの適用
	HBRUSH brush = CreateSolidBrush(RGB(0,0,255));//ブラシの作成 CreateHatchBrush ハッチ模様のブラシ
	HBRUSH oldBrush = (HBRUSH)SelectObject(hdc,brush);//ブラシの適用
	
	char* str="abcd\ntest";
	//TextOut(hdc,10,10,(LPCTSTR)str,(int)strlen(str));//字を書き込みます(マイナス座標の設定も可能)
	DrawText(hdc,(LPCTSTR)str,(int)strlen(str),&rc,DT_CENTER | DT_WORDBREAK);//字を書き込みます\nなどにも対応
	//SetPixel(hdc,10,10,RGB(255,0,0));//指定座標に点を打ちます
	//MoveToEx(hdc,10,10,NULL);LineTo(hdc,100,100);//線を引きます
	//Rectangle(hdc,10,10,100,100);//四角に塗りつぶし

	SelectObject(hdc,oldBrush);//ブラシを元に戻す
	SelectObject(hdc,oldPen);//ペンを元にもどす
	SelectObject(hdc,oldFont);//フォントを元に戻す
	DeleteObject(brush);//ブラシの破棄
	DeleteObject(pen);//ペンの破棄
	DeleteObject(font);//フォントの破棄

	EndPaint(hWnd,&ps);
}

//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp){
	switch(msg){
		case WM_CREATE:

			//ボタンの生成
			CreateWindow("BUTTON", "ボタン1",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,5,5,100,50, hWnd, (HMENU)ID_BUTTON_1, hInst ,NULL);
			CreateWindow("BUTTON", "ボタン2",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,5,55,100,50, hWnd, (HMENU)ID_BUTTON_2, hInst ,NULL);
			CreateWindow("BUTTON", "ボタン3",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,5,105,100,50, hWnd, (HMENU)ID_BUTTON_3, hInst ,NULL);

			SetTimer(hWnd,1000,500,NULL);//ID:1000 500msのタイマーを作成
			break;
		case WM_PAINT:
			paint(hWnd);
			break;
		case WM_TIMER:
			if(wp == 1000){
				OutputDebugString("a");//デバッグ出力
			}
			else return (DefWindowProc(hWnd,msg,wp,lp));//自分と関係のないタイマーは戻す
			break;
		case WM_COMMAND:
			switch (LOWORD(wp)){
				case ID_BUTTON_1:
					MessageBox(hWnd,"BUTTON1が押されました","",0);
					break;
				case ID_BUTTON_2:
					MessageBox(hWnd,"BUTTON2が押されました","",0);
					break;
				case ID_BUTTON_3:
					MessageBox(hWnd,"BUTTON3が押されました","",0);
					break;
			}
			break;

		case WM_CLOSE:
			if(IDYES==MessageBox(hWnd,"終了してもよろしいですか?","終了確認", MB_YESNO | MB_ICONQUESTION)){
				KillTimer(hWnd,1000);//タイマーを破棄
				DestroyWindow(hWnd);//ウインドウを破棄
			}
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return (DefWindowProc(hWnd,msg,wp,lp));
	}
	return 0;
}


■上記プログラムを改造するときに使う方法など

▼タイトルバーのテキストの変更方法

SetWindowText(hWnd,"testtest");//タイトルバーのテキストを変更


▼メニューの追加方法

@リソースの追加(リソーススクリプトの追加)
リソースファイルを追加して、リソースを追加でMenuを選択
プロパティにて ID : "TESTMENU" に変更
メニュ項目を追加 この時 メニュ項目(&A) ←ショートカットキーが登録できます。

Aメニューを作成した必要なヘッダを準備
#include "resource.h" 追加して作成したリソースを読み込む

ATOM InitApp(HINSTANCE hInst)を編集してメニュー名を追加します

wc.lpszMenuName = "TESTMENU";//MAKEINTRESOURCE(IDR_MENU1); //メニュー名を追加

Bプロシージャーに追加することで動作するようになります

case WM_COMMAND:
	switch(LOWORD(wp)){
		case ID_****:
				MessageBox(hWnd,"****","debug",MB_OK);
			break;
		case ID_*****:
				MessageBox(hWnd,"*****","debug",MB_OK);
			break;
		default:
			return (DefWindowProc(hWnd,msg,wp,lp));
	}


▼ダイアログの追加方法

@リソースの追加(リソーススクリプトの追加)
リソースファイルを追加して、リソースを追加でDialogを選択
プロパティにて ID : "TESTDLG" に変更
Buttonを2個 EditControlを1個貼り付ける

Aダイアログを作成した必要なヘッダを準備
#include "resource.h" を追加

Bダイアログプロシージャーをコードに追加

BOOL CALLBACK TestDlgProc(HWND hDlg,UINT msg,WPARAM wp,LPARAM lp){
	switch (msg){
		case WM_COMMAND:
			switch (LOWORD(wp)){
				case IDC_BUTTON1:
					OutputDebugString("button1");//デバッグ出力
					SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),"button1");//ダイアログに貼り付けたテキストに文字を入れる
					return TRUE;
				case IDC_BUTTON2:
					OutputDebugString("button2");//デバッグ出力
					SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),"button2");//ダイアログに貼り付けたテキストに文字を入れる
					return TRUE;
			}
			return FALSE;
		case WM_CLOSE:
			EndDialog(hDlg,WM_CLOSE);//モーダル
			//DestroyWindow(hDlg);//モードレス
			return TRUE;
	}
	return FALSE;
}

Cダイアログの表示 必要なタイミングで呼び出します

▽モーダル
DialogBox(hInst,MAKEINTRESOURCE(TESTDLG),hWnd,(DLGPROC)TestDlgProc);

▽モードレス
・方法その1 モーダルと同じ呼び方で第3引数にNULLを入れるとモードレスになります。
DialogBox(hInst,MAKEINTRESOURCE(TESTDLG),NULL,(DLGPROC)TestDlgProc);

・方法その2
HWND hDlg;
hDlg=CreateDialog(hInst,MAKEINTRESOURCE(TESTDLG),hWnd,(DLGPROC)TestDlgProc);
ShowWindow(hDlg,SW_NORMAL);

・TABSTOPを動作するようにする
モードレスの場合はメッセージがダイアログまで来ないため、メイン関数のループの中を以下のように変更する必要があります
if(!(IsDialogMessage(hWnd,&msg)||IsDialogMessage(hDlg,&msg))){//タブキーでコントロールを移動したくない場合はこの行をコメントする
	TranslateMessage(&msg); 
	DispatchMessage(&msg); 
}
しかし、このままコンパイルすると hDlg が無いとエラーがでますので、HWND hDlg; の変数を関数の外で宣言して(0で初期化されるので好都合)、ダイアログを作成した時に保存するのが良いと思います。


▼時間の取得方法

SYSTEMTIME st;
GetLocalTime(&st);
char str[10];
wsprintf(str,"%d\n",st.wSecond);
OutputDebugString(str);//デバッグ出力




▲トップページ > Windows と C++