2015/10/23

Win32API メモ (その3) : コントロールを追加する

※ここではUnicode文字セットを使用するものとして書いてある。Wで終わるものは基本的にUnicode版なので、ドキュメントを検索するときは末尾のWを消しておくこと。


コントロールを追加するには、CreateWindowExW関数のLPCTSTR lpClassNameにコントロールのクラス名を、DWORD dwStyleにWS_CHILDを、HWND hWndParentにコントロールの表示に使用するウィンドウをセットして実行する。

デフォルトではコントロールが表示されないので、DWORD dwStyleにWS_VISIBLEをセットしておくか、ShowWindow関数を使う必要がある。

※DWORD dwStyleにWS_OVERLAPPEDWINDOW等がセットされている場合、ウィンドウの枠が表示されてしまうので注意が必要。(ちなみに、移動もできるようになる)(WS_から始まるスタイルは上位ワードを使用して定義されている)


Editコントロールで文字を入力するには、TranslateMessage関数を実行してWM_CHARメッセージ等を生成する必要がある。

2015/10/21

Win32API メモ (その2) : メッセージループ

※ここではUnicode文字セットを使用するものとして書いてある。Wで終わるものは基本的にUnicode版なので、ドキュメントを検索するときは末尾のWを消しておくこと。


メッセージループを構成する際、次のようなことをしてはいけない:

    while (GetMessageW(&msg, hWnd, 0, 0))
    {
        //処理
    }

GetMessageW関数はエラーが有った場合に-1を返すため、このように書くと問題のあるメッセージを処理しようとして致命的なエラーを引き起こす可能性がある。
代わりに、次に示すように-1が返されたらエラー処理を行うようにする:

    while ((bRet = GetMessageW(&msg, hMainWindow, 0, 0)) != 0)
    {

        if (bRet == -1)
        {
            //エラー処理
        }
        else
        {
            //通常の処理
        }
    }



PeekMessageW関数でループを構成すると、パフォーマンスに悪い影響をあたえるので避けるべきである。

2015/10/20

Win32API メモ : ウィンドウの作成と表示

※ここではUnicode文字セットを使用するものとして書いてある。Wで終わるものは基本的にUnicode版なので、ドキュメントを検索するときは末尾のWを消しておくこと。


windows.hをインクルード。



wWinMainエントリポイントを定義する。

WinMainの引数LPSTR lpCmdLineは、wWinMainではLPWSTR型である。



WindowProcコールバック関数を定義する。
この関数の返り値は次のように記述する(ただし、変数名はWindowProcの引数と同じ):

    return DefWindowProcW(hwnd, uMsg, wParam, lParam);



WNDCLASSEXW構造体を記述する。

WNDPROC lpfnWndProcには先程のコールバック関数を指定する。

LoadIconW関数の返り値をHICON hIconに代入することによってウィンドウのアイコンを指定することができる。
デフォルトで使用できるアイコンはリンク先を参照。

LoadCursorW関数の返り値をHCURSOR hCursorに代入することによってウィンドウにカーソルが移動した時に表示されるカーソルの形状を指定することができる。
NULLを指定した場合は、ウィンドウにカーソルが移動するたびに、明示的にカーソルの形状を指定しなければならない。
デフォルトで使用できるカーソルはリンク先を参照。

HBRUSH hbrBackgroundにはクライアント領域を塗りつぶすのに使用されるブラシへのハンドルまたは、システム標準の色の値+1をHBRUSHにキャストしたものを代入する。
例えば、COLOR_WINDOWを使用する場合は次のようになる:

    (HBRUSH)(COLOR_WINDOW + 1)

NULLを指定した場合は、アプリケーションが自分でクライアント領域を塗る必要がある。

LPCTSTR lpszClassNameには、CreateWindowExW関数でクラスを呼び出すのに使用される文字列へのポインタまたは、RegisterClassExW関数等から返されるATOM型の値を指定することができる。



RegisterClassExW関数に先程のWNDCLASSEXW構造体を引数として実行



CreateWindowExW関数のLPCTSTR lpClassNameに、lpszClassNameに指定した文字列または、RegisterClassExW関数から返されるATOM型の値を指定してウィンドウを作成する。



ShowWindow関数に先程のCreateWindowExW関数からの返り値を引数として実行することでウィンドウを表示時する。

int nCmdShowには、ユーザーがプログラムに対して設定したウィンドウの表示方法に従う場合はWinMainエントリポイントの引数のnCmdShowを、それ以外の場合はリンク先にて記述されている値を指定する。