【WinAPIソースプログラム例】 1.2 目的プログラムの作成 (2)ソースプログラムの入力とコンパイル #include int WINAPI WinMain( HINSTANCE hCurInstance, //現在のインスタンスハンドル HINSTANCE hPrevInstance,//直前のインスタンスハンドル(Win32ではNULL) LPSTR lpCmdLine, //コマンドラインのロングポインタ int nCmddShow) { //ウィンドウの表示状態値 MessageBox(NULL,TEXT("おはよう"), TEXT("こんにちは"),MB_OK); return 0; } (6)コマンドライン引数 【その1】 #include int WINAPI WinMain(HINSTANCE hCurrInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmddShow){ CHAR Str[128];int i,ii; for(i=0,ii=0;lpCmdLine[i]!=0;i++,ii+=2){ Str[ii]=lpCmdLine[i];Str[ii+1]=0; } Str[ii]=Str[ii+1]=0; MessageBox(NULL,(LPCWSTR)Str, TEXT("こんにちは"),MB_OK); return 0; } 【その2】 #include int WINAPI WinMain(INSTANCE hCurrInstance,HINSTANCE hPrevInstance, PSTR lpCmdLine,int nCmddShow){ MessageBox(NULL,(LPCWSTR)GetCommandLine(), TEXT("こんにちは"),MB_OK); return 0; } 1.3 CからのWindows API呼び出し (2) ウィンドウの生成と表示 #include int WINAPI WinMain(HINSTANCE hCurInstance,HINSTANCE hPrevInstance, PSTR lpCmdLine,int nCmddShow){ HWND hw=CreateWindow(TEXT("STATIC"), TEXT("こんばんは"),WS_CAPTION, 100,100,200,200,NULL,NULL,hCurInstance,NULL); if(hw==NULL)return 0; ShowWindow(hw,SW_SHOW); MessageBox(NULL,TEXT("おはよう"), TEXT("こんにちは"),MB_OK); return 0; } (3) ウィンドウクラスの登録 #include int WINAPI WinMain(HINSTANCE hCurInstance,HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmddShow){ WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = DefWindowProc; wc.cbClsExtra = wc.cbWndExtra =0; wc.hInstance = hCurInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("おはよう");//クラス名="おはよう" if(!RegisterClass(&wc)) return 0; HWND hw=CreateWindow(TEXT("おはよう"),TEXT("こんばんは"), WS_OVERLAPPEDWINDOW, 100,100,200,200,NULL,NULL, hCurInstance,NULL); if(hw==NULL)return 0; ShowWindow(hw,SW_SHOW); MessageBox(NULL,TEXT("おはよう"), TEXT("こんにちは"),MB_OK); return 0; } (4) メッセージ #include int WINAPI WinMain(HINSTANCE hCurInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmddShow){ MSG msg; HWND hw=CreateWindow(TEXT("BUTTON"),TEXT("こんばんは"), WS_CAPTION | WS_VISIBLE, 100,100,200,200,NULL,NULL, hCurInstance,NULL); if(hw==NULL)return 0; while(1){ GetMessage(&msg,NULL,0,0); if(msg.message==WM_LBUTTONUP) break; DispatchMessage(&msg); } return 0; } (4) ウィンドウプロシージャ #include LRESULT CALLBACK WndProc(HWND hw, UINT msg,WPARAM wp, LPARAM lp){ if(msg==WM_LBUTTONUP){ MessageBox(hw,TEXT("終わります"),TEXT("終了"),MB_ICONINFORMATION); exit(0); } return DefWindowProc(hw, msg,wp,lp); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmddShow){ WNDCLASS wc;MSG msg;HWND hw; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc;//ここに作成した関数名を指定する wc.cbClsExtra = wc.cbWndExtra =0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("こんにちは"); if(!RegisterClass(&wc)) return 0; hw=CreateWindow(TEXT("こんにちは"),TEXT("こんばんは"), WS_OVERLAPPEDWINDOW, 100,100,200,200,NULL,NULL, hInstance, NULL); if(hw==NULL) return 0; ShowWindow(hw,SW_SHOW); while(1){ GetMessage(&msg,NULL,0,0); DispatchMessage(&msg); } return 0; } (4) 終了処理 #include LRESULT CALLBACK WndProc(HWND hw, UINT msg,WPARAM wp, LPARAM lp){ switch(msg){ case WM_DESTROY: MessageBox(hw,TEXT("終わります"),TEXT("終了"),MB_ICONINFORMATION); PostQuitMessage(0); return 0; } return DefWindowProc(hw, msg,wp,lp); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmddShow){ WNDCLASS wc;MSG msg;HWND hw; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = wc.cbWndExtra =0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName= TEXT("こんにちは"); if(!RegisterClass(&wc)) return 0; hw=CreateWindow(TEXT("こんにちは"),TEXT("こんばんは"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100,100,200,200,NULL,NULL, hInstance, NULL); if(hw==NULL) return 0; while(GetMessage(&msg,NULL,0,0))DispatchMessage(&msg); return 0; } 1.4 その他のウィンドウ制御 (2) 他の関数からのメッセージ LRESULT CALLBACK WndProc(HWND hw, UINT msg,WPARAM wp, LPARAM lp){ int YesNo;LPCREATESTRUCT lpWnd; switch(msg){ case WM_DESTROY: MessageBox(hw,TEXT("終わります"), TEXT("終了"), MB_ICONINFORMATION); PostQuitMessage(0); return 0; case WM_CREATE : lpWnd = (LPCREATESTRUCT) lp; YesNo = MessageBox(hw,TEXT("ウィンドウを生成しますか?"), lpWnd->lpszName, MB_YESNO |MB_ICONQUESTION); if(YesNo==IDYES) return 0; else return -1; } return DefWindowProc(hw, msg,wp,lp); } (3) 閉じないウィンドウ LRESULT CALLBACK WndProc(HWND hw, UINT msg,WPARAM wp, LPARAM lp){ LPCREATESTRUCT lpWnd; switch(msg){ case WM_CLOSE: return 0; case WM_RBUTTONUP: DestroyWindow(hw); PostQuitMessage(0);return 0; } return DefWindowProc(hw, msg,wp,lp); } 1.5 モジュール化と定形パターン (1)モジュール化 #include LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0); return 0; } return DefWindowProc(hw,msg,wp,lp); } BOOL initApp(HINSTANCE hCurI){ WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW|CS_DBLCLKS; wc.lpfnWndProc = WndProc; wc.cbClsExtra = wc.cbWndExtra = 0; wc.hInstance = hCurI; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName= TEXT("クラス名"); return RegisterClass(&wc); } HWND initInst(HINSTANCE hCurI){ HWND hw=CreateWindow(TEXT("クラス名"),TEXT("こんばんは"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hCurI,NULL); return hw; } int WINAPI WinMain(HINSTANCE hCurI, HINSTANCE hPreI, PSTR lp, int cmd){ MSG msg; if(!initApp(hCurI)) return 0; if(initInst(hCurI)==NULL) return 0; while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } (2) 定型パターンを使って #include // // 関数間で受け渡すスタティック変数の宣言 // void 関数1(HWND hw, WPARAM wp,LPARAM lp){ // メッセージ1のときの処理 } void 関数3(HWND hw, WPARAM wp,LPARAM lp){ // メッセージ2のときの処理 } void 関数3(HWND hw, WPARAM wp,LPARAM lp){ // メッセージ3のときの処理 } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0); return 0; case メッセージ1: 関数1(hw,wp,lp); return 0; case メッセージ2: 関数2(hw,wp,lp); return 0; case メッセージ3: 関数3(hw,wp,lp); return 0; return DefWindowProc(hw,msg,wp,lp); } // 以下,initApp以降をコピー&ペーストする。 【インクルードファイル例】 #ifndef _MYWIN_H #define _MYWIN_H /* Please name this file "myWin.h", include the file for your C program.*/ #include LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp); HINSTANCE hInstance;WNDCLASS wndClass; BOOL initApp(HINSTANCE hCurI){ hInstance= hCurI; wndClass.style = CS_HREDRAW | CS_VREDRAW|CS_DBLCLKS; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = wndClass.cbWndExtra=0; wndClass.hInstance = hCurI; wndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndClass.lpszMenuName = NULL; wndClass.lpszClassName = TEXT("ClassName"); return RegisterClass(&wndClass); } HWND initInst(HINSTANCE hCurI){ HWND hw; hw=CreateWindow(TEXT("ClassName"),TEXT("Caption"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hCurI,NULL); return hw; } int WINAPI WinMain(HINSTANCE hCurI, HINSTANCE hPreI, PSTR lp, int cmd){ MSG msg; if(!initApp(hCurI)) return 0; if(initInst(hCurI)==NULL) return 0; while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } #endif