サンプル
=======
// メッセージ・プロシージャを作ろう
//==============================================================================
#include <tchar.h>
#include <Windows.h>
//------------------------------------------------
// break付きのキーワード
//------------------------------------------------
#define CASE break;case
#define DEFAULT break;default
//------------------------------------------------
// このファイルで使用する関数
//------------------------------------------------
#define apiLoadImage(h,id,type,cast) ((cast)LoadImage(h,MAKEINTRESOURCE(id),type,0,0,(LR_DEFAULTSIZE | LR_SHARED)))
#define apiLoadIcon(h,id) apiLoadImage(h,id,IMAGE_ICON,HICON)
#define apiLoadCursor(h,id) apiLoadImage(h,id,IMAGE_CURSOR,HCURSOR)
//------------------------------------------------
// ウインドウ・プロシージャの関数
//------------------------------------------------
extern LRESULT CALLBACK mainWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch ( uMsg ){
CASE WM_CREATE:
MessageBox( hWnd, TEXT("ウインドウが作成された。"), TEXT("WM_CREATE"), (MB_ICONINFORMATION|MB_OK) );
CASE WM_CLOSE:
MessageBox( hWnd, TEXT("ウインドウが閉じる。"), TEXT("WM_CLOSE"), (MB_ICONINFORMATION|MB_OK) );
DestroyWindow( hWnd );
CASE WM_DESTROY:
MessageBox( hWnd, TEXT("ウインドウが破棄された。"), TEXT("WM_DESTROY"), (MB_ICONINFORMATION|MB_OK) );
PostQuitMessage( 0 );
CASE WM_LBUTTONDOWN:
MessageBox( hWnd, TEXT("左クリックの検出。"), TEXT("WM_LBUTTONDOWN"), (MB_ICONWARNING|MB_OK) );
CASE WM_RBUTTONDOWN:
MessageBox( hWnd, TEXT("右クリックの検出。"), TEXT("WM_RBUTTONDOWN"), (MB_ICONWARNING|MB_OK) );
CASE WM_DROPFILES:
MessageBox( hWnd, TEXT("ドロップ・ファイルの検出。"), TEXT("WM_DROPFILES"), (MB_ICONWARNING|MB_OK) );
DEFAULT:return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
return 0;
}
//------------------------------------------------
// ワークエリア領域の取得
//------------------------------------------------
#define GetMonitorRect(rc) SystemParametersInfo(SPI_GETWORKAREA,0,rc,0)
//------------------------------------------------
// デスクトップの画面中央に移動
//------------------------------------------------
static BOOL funcCenterWindow( HWND hWnd )
{
RECT rc1; // デスクトップ領域
RECT rc2; // ウインドウ領域
INT cx, cy; // ウインドウ位置
INT sx, sy; // ウインドウサイズ
// サイズの取得
GetMonitorRect( &rc1 ); // デスクトップのサイズ
GetWindowRect( hWnd, &rc2 ); // ウインドウのサイズ
// いろいろと計算
sx = (rc2.right - rc2.left); // ウインドウの横幅
sy = (rc2.bottom - rc2.top); // ウインドウの高さ
cx = (((rc1.right - rc1.left) - sx) / 2 + rc1.left); // 横方向の中央座標軸
cy = (((rc1.bottom - rc1.top) - sy) / 2 + rc1.top); // 縦方向の中央座標軸
// 画面中央に移動
return SetWindowPos( hWnd, NULL, cx, cy, 0, 0, (SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSIZE) );
}
//------------------------------------------------
// ウインドウ・クラスの登録
//------------------------------------------------
static ATOM funcWindowClass( HINSTANCE hInstance, LPCTSTR lpClassName )
{
WNDCLASSEX wcex = { 0 };
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = (CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS);
wcex.lpfnWndProc = mainWindowProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = apiLoadIcon( NULL, IDI_APPLICATION );
wcex.hIconSm = apiLoadIcon( NULL, IDI_APPLICATION );
wcex.hCursor = apiLoadCursor( NULL, IDC_ARROW );
wcex.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
wcex.lpszMenuName = NULL;
wcex.lpszClassName = lpClassName;
return RegisterClassEx( &wcex );
}
//------------------------------------------------
// ウインドウの作成
//------------------------------------------------
static HWND funcCreateWindow( HINSTANCE hInstance, LPCTSTR lpClassName, LPCTSTR lpTitleName, int nCmdShow )
{
HWND hWnd = CreateWindowEx(
WS_EX_ACCEPTFILES, // 拡張ウインドウ・スタイル
lpClassName, // クラス名
lpTitleName, // タイトル名
WS_OVERLAPPEDWINDOW, // ウインドウ・スタイル
CW_USEDEFAULT, // 横座標
CW_USEDEFAULT, // 縦座標
640, // 横幅
480, // 高さ
NULL, // 親ウインドウのハンドル
NULL, // メニューのハンドル
hInstance, // インスタンスのハンドル
NULL ); // ウインドウ作成のデータ
if ( hWnd != NULL ){
funcCenterWindow( hWnd );
ShowWindow( hWnd, nCmdShow );
UpdateWindow( hWnd );
}
return hWnd;
}
//------------------------------------------------
// メイン関数
//------------------------------------------------
extern int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow )
{
LPCTSTR lpClassName = TEXT("DefWindowProcWndClass");
LPCTSTR lpTitleName = TEXT("第1話 メッセージ・プロシージャ関数");
MSG Msg;
if ( funcWindowClass(hInstance,lpClassName) == 0 ){
return -1;
}
if ( funcCreateWindow(hInstance,lpClassName,lpTitleName,nCmdShow) == NULL ){
return -2;
}
while ( GetMessage(&Msg,NULL,0,0) > 0 ){
TranslateMessage( &Msg );
DispatchMessage( &Msg );
}
UNREFERENCED_PARAMETER( hPrevInstance );
UNREFERENCED_PARAMETER( lpCmdLine );
return Msg.wParam;
}
解説
実行結果
●mainWinProc1~mainWinProc7







※コメント投稿者のブログIDはブログ作成者のみに通知されます