この文書は、MinGWを使って Windows Programming を行うためのメモである。 Windows Programming については多くの参考資料が入手できるし、 筆者も にメモを用意してあるので、ここでは MinGW 固有の話に限定する。 また日本語固有の話については以下の別ページに記載する。 なお、Windows Programming の開発に必要なヘッダファイルやマニュアル類は Microsoft が
を無償提供している。 環境整備 †MinGWの実行環境は、いろいろあるが、ここでは単純に Windows のコマンド プロンプトで行う。 必要な手順は環境変数 PATH に MinGW の bin を加えることである。 例えば MingGWのインストール先が C:\mingw だとすると、 SET PATH=C:\mingw\bin;%PATH% とでもすればよい。あるいはシステム環境変数やユーザ環境変数で設定しても よい。環境変数の設定は Windows の常識の範囲内なので、これ以上は述べない。 例題その1 単純な Windows の生成 †単純な Window を作る例題である。以下に示す二つのソースファイル
を使ってみる。 winmain.c は以下のようになっている。 (2007-Feb-15 注:以前は RegisterClass? 関数を 使っていたが RegisterClassEx? 関数に置き換えた。) #define STRICT #include <windows.h> #define MY_CLASS_NAME "MyClass" #define MY_WINDOW_TITLE "MyTitle" /* Prototype */ LRESULT CALLBACK WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MSG msg; WNDCLASSEX wcex; HWND hwnd; /* Register the window class for the main window. */ if( hPrevInstance == NULL ) { wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = 0; wcex.lpszClassName = MY_CLASS_NAME; wcex.hIconSm = 0; if ( RegisterClassEx( &wcex ) == 0 ) return 0; } /* Create our window. */ hwnd = CreateWindow( MY_CLASS_NAME, MY_WINDOW_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND)NULL, (HMENU)NULL, hInstance, (LPVOID)NULL ); /* * If the window cannot be created, terminate * the application. */ if( hwnd == NULL ) return 0; /* Show the window and paint its contents. */ ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); /* Start the message loop. */ while( GetMessage( &msg, (HWND)NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } /* Return the exit code to the system. */ return msg.wParam; } また、wndproc.c は以下のようである。 #define STRICT #include <windows.h> LRESULT CALLBACK WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch( uMsg ) { case WM_DESTROY: PostQuitMessage( 0 ); break; default: return( DefWindowProc( hwnd, uMsg, wParam, lParam ) ); } return 0; } これから実行ファイル a.exe を作るには gcc winmain.c wndproc.c -mwindows とすればよい。 例題その2 メニューを持たせる †メニューを持たせるために、resource file を使う。resource ID などは C の source file でも(後々)必要となるので、 Cの source file と resource file に共通に使う header file も用意する。ここでは例題1に示したファイルの他に
を用意するものとしよう。 resource.h の中身は #define IDM_FILE_EXIT 10001 #define IDM_FILE_OPEN 10002 としてある。 また、myapp.rc の中身は #include "resource.h" MyMenu MENU DISCARDABLE BEGIN POPUP "File" BEGIN MENUITEM "Open", IDM_FILE_OPEN MENUITEM SEPARATOR MENUITEM "Exit", IDM_FILE_EXIT END END とする。 更に、winmain.c の wcex.lpszMenuName = 0; の行を wcex.lpszMenuName = "MyMenu"; に変える。実行イメージを得るには windres myapp.rc myapp.o gcc winmain.c wndproc.c myapp.o -mwindows とすればよい。 なおwindres については を参考にした。 メニューによる終了 †せっかくメニューをを持たせたのであるから、メニューによる終了もしたい。 上述の wndproc.c を以下のように置き換える。 #define STRICT #include <windows.h> #include "resource.h" LRESULT CALLBACK WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { int wmId, wmEv; switch( uMsg ) { case WM_COMMAND: wmId = LOWORD(wParam); wmEv = HIWORD(wParam); switch (wmId) { case IDM_FILE_EXIT: DestroyWindow(hwnd); break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } break; case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } resource.h を include するのを忘れないこと。 |