ただ開いて,10秒後に消えます.メインループはありません.
0001: /*
0002: openwin-win32.c
0003: gcc openwin-win32.c -mwindows
0004: bcc32 -W openwin-win32.c
0005: */
0006:
0007: #include <windows.h>
0008:
0009: int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
0010: LPSTR lpCmdLine, int nCmdShow )
0011: {
0012: HWND hWnd;
0013: WNDCLASS wndClass;
0014: static TCHAR szAppName[] = TEXT("OpenWindow");
0015:
0016: /* ウインドウクラスの設定 */
0017: wndClass.style = 0;
0018: wndClass.lpfnWndProc = DefWindowProc;
0019: wndClass.cbClsExtra = 0;
0020: wndClass.cbWndExtra = 0;
0021: wndClass.hInstance = hInstance;
0022: wndClass.hIcon = NULL;
0023: wndClass.hCursor = NULL;
0024: wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
0025: wndClass.lpszMenuName = NULL;
0026: wndClass.lpszClassName = szAppName;
0027:
0028: RegisterClass( &wndClass ); /* ウインドウクラスの登録 */
0029:
0030: hWnd = CreateWindow( /* ウインドウの作成 */
0031: szAppName, /* 作成するウインドウのクラス名 */
0032: TEXT("openwin-win32"), /* ウインドウタイトル */
0033: WS_OVERLAPPEDWINDOW, /* ウインドウスタイル */
0034: CW_USEDEFAULT, /* 左上頂点のX座標 */
0035: CW_USEDEFAULT, /* 左上頂点のY座標 */
0036: CW_USEDEFAULT, /* ウインドウの幅 */
0037: CW_USEDEFAULT, /* ウインドウの高さ */
0038: NULL, /* 親ウインドウのハンドル */
0039: NULL, /* メニューのハンドル */
0040: hInstance, /* 親モジュールのインスタンスハンドル */
0041: NULL ); /* ウインドウへの引数 */
0042:
0043: ShowWindow( hWnd, nCmdShow ); /* ウインドウの表示 */
0044:
0045: Sleep( 10000 ); /* 表示を10秒間保持 */
0046:
0047: DestroyWindow( hWnd ); /* ウインドウの開放 */
0048:
0049: return 0;
0050: }
0003: gcc openwin-win32.c -mwindows 0004: bcc32 -W openwin-win32.c
GCCでコンパイルする場合は,-mwindowsを指定し ます.また,BCCでコンパイルする場合は,-Wまた は-tWを指定します.BCCではこのオプションを一 番最初に指定した方がいいようです.最後につけた場合はmainを探しにいってエラーになってしまいました.
0007: #include <windows.h>
Windows プログラムの場合はヘッダファイルwindows.hをインクルードします.Windows 固有の型 などはこの中で宣言されています.
0009: int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, 0010: LPSTR lpCmdLine, int nCmdShow )
windows のプログラムはこのWinMainから始ま ります.
int WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
hInstanceは現在のアプリケーションのインスタンスをさすハンドルです。Windows ではデータのインスタンスを指し示すポインタをハンドルと呼びます。ここではHINSTANCEはインスタンスハンドル、後ででてくるHWNDはウインドウハンドルです。Windows での宣言はハンガリー記法に則っているので、先頭のHがハンドルであることを示しています。このハンドルはあらゆるデータ型において重要なものです。
hPrevInstanceは歴史的な経緯で残っているもので、現在は常にNULLとなっています。以前のWindowsは、同じプログラムが起動されていた場合は、そのリソースを共有していたのだそうです。メモリが高価だったんですね。その際にすでにあるインスタンスを参照するためのもので、現在はそのようにはなっていないので使われていません。
lpCmdLineはコマンドライン引数の文字列が入ります。通常のCプログラムと違い、ここでは引数ごとに分解されていません。また、ユニコード文字列が入っている場合があるので、GetCommandLineとCommandLineToArgvWを使います。
nCmdShowにはウィンドウの初期表示状態指定が入 ります。マクロ定数が定められているので、詳しくはヘルプなどを参照してください。
0016: /* ウインドウクラスの設定 */ 0017: wndClass.style = 0; 0018: wndClass.lpfnWndProc = DefWindowProc; 0019: wndClass.cbClsExtra = 0; 0020: wndClass.cbWndExtra = 0; 0021: wndClass.hInstance = NULL; 0022: wndClass.hIcon = NULL; 0023: wndClass.hCursor = NULL; 0024: wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 0025: wndClass.lpszMenuName = NULL; 0026: wndClass.lpszClassName = szAppName; 0027: 0028: RegisterClass( &wndClass ); /* ウインドウクラスの登録 */
続いて、ウインドウクラスの設定です。どのようなウインドウにするかを決定します。 WNDCLASS構造体のメンバを初期化してRegisterClassでシステムに登録します。初期化が正しく行われていないと、RegisterClassに失敗してしまいます。
最低限指定しなければならないのは今回0もNULLを指定しなかった3つのようです。
WNDCLASS.lpfnWndProcはウインドウプロシージャというのを指定するところで、メッセージを処理する関数を指定します。ここではシステムデフォルトのプロシージャであるDefWindowProcを指定しています。
WNDCLASS.backgroundは背景色です。ヘルプの指示どおりCOLOR_XXXXXを指定してもよかったのですが、ここでは背景色を白にするためにGetStockObjectで白色ブラシを指定しています。ここをNULLにしてもウインドウは作成されますが、枠だけで透明なウインドウになってしまいます。いずれの場合もHBRUSH型へのキャストが必要です。コンパイラのチェックが厳しい場合、キャストがないと怒られてしまいます。
WNDCLASS.lpszClassNameが最も重要なもので、このクラスに名前をつけます。クラス名はウインドウを識別する上で重要で、ウインドウを開く際もこの名前で指定をします。
RegisterClassでウインドウクラスをシステムに登録します。ウインドウクラスはプログラムが終了すると削除されます。
0030: hWnd = CreateWindow( /* ウインドウの作成 */
0031: szAppName, /* 作成するウインドウのクラス名 */
0032: TEXT("openwin-win32"), /* ウインドウタイトル */
0033: WS_OVERLAPPEDWINDOW, /* ウインドウスタイル */
0034: CW_USEDEFAULT, /* 左上頂点のX座標 */
0035: CW_USEDEFAULT, /* 左上頂点のY座標 */
0036: CW_USEDEFAULT, /* ウインドウの幅 */
0037: CW_USEDEFAULT, /* ウインドウの高さ */
0038: NULL, /* 親ウインドウのハンドル */
0039: NULL, /* メニューのハンドル */
0040: hInstance, /* 親モジュールのインスタンスハンドル */
0041: NULL ); /* ウインドウへの引数 */
CreateWindowでウインドウのインスタンスを作成します。成功するとウインドウハンドルhWndが返ります。
HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
)
lpClassNameに作成したいウインドウクラスのクラス名を指定します。lpWindowNameは要するにタイトルバーに表示される文字列です。dwStyleにはウインドウスタイルを指定します。WS_XXXXXというマクロがありますので、これをOR(|)でつないで指定します。ここでは、オーバーラップ型のみを指定しています。
x, y, nWidth, nHeightは、ウインドウを表示する際の左上隅の座標と幅・高さです。ここではCW_USEDEFAULTの値を使用しています。
hWndParentは親ウインドウまたはオーナーウインドウを指定します。ここではNULLを指定しているので、自動的にルートウインドウがオーナーになります。
hMenuはメニューのハンドルを指定します。ここではメニューは使用しないのでNULLです。
hInstanceはウインドウを作るプログラムモジュールのインスタンスを指定します。しかし、これはWindows95系のみが有効で、NT系では無視されます。
lpParamにはプログラムに渡したいデータのポインタを指定できる。ここでは使用しないのでNULLです。
0043: ShowWindow( hWnd, nCmdShow ); /* ウインドウの表示 */
BOOL ShowWindow(
HWND hWnd,
int nCmdShow
)
CreateWindowはインスタンスを生成するだけで、 まだ画面上には現れません。ShowWindowを呼ぶ ことで画面上に表示されます。hWndは表示したい ウインドウのハンドルを指定します。nCmdShowは WinMainからの引数です。ショートカットなど のプロパティを見ると「実行時の大きさ」というのがありますが、この指定が引き渡されると考えてください。
0047: DestroyWindow( hWnd ); /* ウインドウの開放 */
BOOL DestroyWindow(
HWND hWnd
)
DestroyWindowが呼ばれるまではインスタンス は有効ですので、SW_HIDEなどを引数として呼び出すこ とで表示を制御することができます。hWndに開放したいウインドウのハンドルを指定します。
より多くのパラメータを指定できるDestroyWindowEx系の関数もあります。