Version 10.12
コード全体
「えーっと、ごめんなさい」
『ごめんなさい?』
「たぶん、前回までで、 Main.cpp はこういう感じのコードになってると思
います」
#include <stdio.h>
#include <Windows.h>
#include "resource.h"
// ウィンドウプロシージャ。
LRESULT CALLBACK WndProc
( HWND p_hWnd
, UINT p_uiMessage
, WPARAM p_wParam
, LPARAM p_lParam
)
{
if( p_uiMessage == WM_DESTROY )
{
// ×ボタンが押されました。
PostQuitMessage( 0 );
return 0;
}
else if( p_uiMessage == WM_COMMAND )
{
if( LOWORD( p_wParam ) == ID_MENU_TEST )
{
// ID_MENU_TEST メニュー。
OutputDebugString( "ID_MENU_TEST : 終了します。\n" );
PostQuitMessage( 0 );
return 0;
}
}
// 標準的な処理をします。
return DefWindowProc( p_hWnd, p_uiMessage, p_wParam, p_lParam );
}
// メッセージループ。
int MessageLoop( HINSTANCE p_hInstance )
{
BOOL bRes;
MSG stMsg;
int iAclTranslated;
// アクセラレーターをリソースから読み込みます。
HACCEL hAccel
= LoadAccelerators
( p_hInstance
, MAKEINTRESOURCE( IDA_MAIN )
);
// メッセージループです。
while( 1 )
{
// メッセージをキューから取り出します。
bRes = GetMessage( &stMsg, NULL, 0, 0 );
if (
( bRes == 0 )
||
( bRes == -1 )
)
{
// 終了するのでループから抜けます。
break;
}
iAclTranslated
= TranslateAccelerator( stMsg.hwnd, hAccel, &stMsg );
if( iAclTranslated != FALSE )
{
// 変換したのでメッセージ変換とディスパッチはしません。
continue;
}
// メッセージを変換します。
TranslateMessage( &stMsg );
// ウィンドウプロシージャに送ります。
DispatchMessage( &stMsg );
}
return stMsg.wParam;
}
// ウィンドウクラスを登録します。
bool RegistWndClass
( const char *const p_pchWndClassName
, HINSTANCE p_hInstance
)
{
// ウィンドウクラス登録用構造体。
WNDCLASSEX stWndClassEx;
stWndClassEx.cbSize = sizeof( stWndClassEx );
stWndClassEx.style
= CS_BYTEALIGNWINDOW | CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
stWndClassEx.lpfnWndProc = WndProc;
stWndClassEx.cbClsExtra = 0;
stWndClassEx.cbWndExtra = 0;
stWndClassEx.hInstance = p_hInstance;
stWndClassEx.hIcon = LoadIcon( NULL, IDI_EXCLAMATION );
stWndClassEx.hCursor = LoadCursor( NULL, IDC_ARROW );
stWndClassEx.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
stWndClassEx.lpszMenuName = NULL;
stWndClassEx.lpszClassName = p_pchWndClassName;
stWndClassEx.hIconSm = LoadIcon( NULL, IDI_EXCLAMATION );
// ウィンドウクラスを登録します。
if( RegisterClassEx( &stWndClassEx ) == 0 )
{
// 失敗しました。
return false;
}
return true;
}
// ウィンドウを作ります。
bool CreateAndShowWnd
( const char *const p_pchWndClassName
, HINSTANCE p_hInstance
, int p_iCmdShow
)
{
// ウィンドウを作ります。
HWND hWnd = CreateWindow
( p_pchWndClassName
, "テスト"
, WS_OVERLAPPEDWINDOW
, CW_USEDEFAULT
, 0
, CW_USEDEFAULT
, 0
, NULL
, LoadMenu( p_hInstance, MAKEINTRESOURCE( IDM_MAIN ) )
, p_hInstance
, NULL
);
if( hWnd == NULL )
{
// ウィンドウの作成に失敗しました。
return false;
}
// ウィンドウを表示します。
ShowWindow( hWnd, p_iCmdShow );
UpdateWindow( hWnd );
return true;
}
// 最初に呼ばれる関数です。
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
const char pchWndClassName[] = "SimpleWindowClass";
bool bRes
= RegistWndClass( pchWndClassName, p_hInstance );
if( bRes == false )
{
return -1;
}
bRes
= CreateAndShowWnd
( pchWndClassName
, p_hInstance
, p_iCmdShow
);
if( bRes == false )
{
return -1;
}
return MessageLoop( p_hInstance );
}
「……以上」
『げ、今回これだけ???』
「全体のコードを一度まとめておこうと思って。それに、これからはあまり
変える部分はないから」
『どういうこと?』
「ウィンドウクラスを作ったり、ウィンドウを作ったり、メッセージループ
でディスパッチしたり、っていう部分は今回のである程度完成形」
『特に何かしない限り、このまま使えるってことね』
「そういうこと。逆に色々変えるのがウィンドウプロシージャ」
『いろんなメッセージに対応しなきゃいけないんだもんね』
「というわけで、次回からはメッセージの処理について見ていきます」
/*
Preview Next Story!
*/
『確かにまー、メールマガジンだとこーゆーの難しいよね』
「来週からはちゃんと関数単位だから」
『それはそれでよくなくない?』
「うん、その号だけで試すことはできないんだよね」
『やたら長いのもアレだし、難しいよね』
「難しいね……」
『というわけで次回』
< Version 10.13 ポップアップメニューふたたび >
「につづく!」
『でもその〈ポップアップメニュー〉も前の続きなんだし』
「続き物ってことでいいってこと?」
『そう割り切っちゃおうってこと』