MessageBox()関数


int MessageBox(
 HWND hWnd,
 LPCTSTR lpszText,
 LPCTSTR lpszCaption,
 UINT nType
);


hWnd表示するメッセージボックスが持つ親ウィンドウを第1引数に指定します。親ウィンドウを持たない場合はNULLを渡します。
lpszTextNULLで終わる文字列へのポインタを渡します。
lpszCaptionNULLで終わる文字列へのポインタ。lpszCaptionがNULLの場合は、既定のキャプションである"エラー"が使われます。
nTypeメッセージ ボックスの内容と動作を指定します。


アイコンの指定
MB_ICONSTOP.bmpMB_ICONHAND、MB_ICONSTOP、MB_ICONERROR
MB_ICONQUESTION.bmpMB_ICONQUESTION
MB_ICONEXCLAMATION.bmpMB_ICONEXCLAMATION、MB_ICONWARNING
MB_ICONINFORMATION.bmpMB_ICONASTERISK、MB_ICONINFORMATION

基本的なスタイルの指定
MB_ABORTRETRYIGNORE[中止]、[再試行]、[無視]
MB_OK[OK](デフォルト)
MB_OKCANCEL[OK]、[キャンセル]
MB_RETRYCANCEL[再試行]、[キャンセル]
MB_YESNO[はい]、[いいえ]
MB_YESNOCANCEL[はい]、[いいえ]、[キャンセル]

戻り値
IDABORT[中止]が押された
IDCANCEL[キャンセル]が押された
IDIGNORE[無視]が押された
IDNO[いいえ]が押された
IDOK[OK]が押された
IDRETRY[再試行]が押された
IDYES[はい]が押された
Windows > ウィンドウの作成 | comments (0) | trackbacks (0)

文字列の表示


LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
 PAINTSTRUCT ps;
 HDC hdc;
 wchar_t wstr[256];
 int x=10, y=10;

 switch ( message )
 {
 case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  // TODO: 描画コードをここに追加してください...
  SetTextColor( hdc, RGB( 128, 128, 128 ) ); // 文字色の色
  SetBkMode( hdc, TRANSPARENT ); // 文字の背景を透明にする
  wsprintf( wstr, L"x=%d y=%d", x, y ); // 数値の文字列化
  TextOut( hdc, 10, 10, wstr, ( int )wcslen( wstr ) ); // 文字列を表示
  EndPaint( hWnd, &ps );
  break;
 }
 return 0;
}

Windows > グラフィック | comments (0) | trackbacks (0)

BeginPaint()関数とGetDC()関数

BeginPaint()で取得されたデバイスコンテキストを用いて描画する場合は、
そのウィンドウに設定されている背景色で背景を再描画したあとグラフィックが描かれ、
さらにコントロールがある場合、それも再描画されます。
これらの描画はウィンドウ全体に対して行われるのでなく、
Windowsで設定される無効領域にだけ行われます。

これに対し、GetDC()で取得したデバイスコンテキストを用いた場合、
背景色やコントロール、無効領域に関係無く、
ウィンドウ全面にグラフィックスのみが重ね書きで描画されます。

一般に、WM_PAINTが送られた場合はBeginPaint()、
その他の場合はGetDC()といった使い分けが行われます。
Windows > グラフィック | comments (0) | trackbacks (0)

InvalidateRect()関数


BOOL InvalidateRect(
 HWND hWnd,
 CONST RECT* lpRect,
 BOOL bErase
);


hWnd更新リージョンが変更されたウィンドウを識別する。
lpRect更新リージョンに追加される長方形のクライアント座標を含むRECT構造体を指すポインタ。
NULLを設定すると、クライアント領域全体を更新リージョンに追加する。
bErase更新リージョンを処理する時に更新リージョンの背景を消去するかどうかを指定する。
TRUEならば、BeginPaint関数が呼び出された時に背景は消去される。
FALSEならば、背景はそのまま残る。


ウィンドウに「無効領域」を追加します。
ウィンドウに無効領域が出来ると、システムはWM_PAINTを送って再描画を促します。
Windows > グラフィック | comments (0) | trackbacks (0)

WM_CREATEメッセージ

CreateWindow()関数を使ってウィンドウを生成する時、
ウィンドウプロシージャにはWM_CREATEメッセージが送信されます。
WM_CREATEメッセージはウィンドウが表示される前に、ウィンドウの生成を続けるかどうかを問い合わせています。
WM_CREATEメッセージに対して0を返せばウィンドウの生成を続け、
-1を返せばウィンドウを破棄することを表します。
ウィンドウがWM_CREATEメッセージによって破棄された場合、
CreateWindow()関数は失敗しNULLを返します。
Windows > ウィンドウプロシージャ | comments (0) | trackbacks (0)

ウィンドウの破棄

ウィンドウの終了ボタンが押されるとWM_CLOSEメッセージが発行される。

DefWindowProc()関数がこのメッセージを受け取るとDestroyWindow()関数を用いてウィンドウを破棄する。

DestroyWindow()関数によってウィンドウが破棄されると
WM_DESTROYメッセージが送られる。

ウィンドウの破棄がWM_DESTROYメッセージによって通知されたら
メッセージループから抜け出してアプリケーションを終了させる為に
PostQuitMessage()関数を呼び出して
アプリケーションの終了を通知する。

PostQuitMessage()関数が呼び出されるとWM_QUITメッセージが
メッセージキューにポストされる。

GetMessage()関数はWM_QUITメッセージを受け取ると0を返すので
それを利用してメッセージループを抜けるようにする。
Windows > ウィンドウの破棄 | comments (0) | trackbacks (0)

WindowProc()関数


LRESULT CALLBACK WindowProc(
 HWND hwnd,
 UINT uMsg,
 WPARAM wParam,
 LPARAM lParam
);

hWndウィンドウを識別するハンドル。
uMsgウィンドウに送られたメッセージ。
wParamメッセージ固有の追加情報。
lParamメッセージ固有の追加情報。


・関数名は自由に命名することができますが、戻り値と引数の型はこれを守らなければなりません。
・ウィンドウプロシージャを呼び出すのはアプリケーションではなくWindowsです。
・メッセージキューに新しいメッセージをエンキューする場合は、メッセージを「Postする」、キューではなく直接プロシージャにメッセージを送る事を「Sendする」と表現します。
・重要ではあるが興味の無いメッセージはDefWindowProc()関数に渡すようにします。
・4つの引数は、いずれもMSG構造体のメンバーに対応しています。MSG構造体のtimeとptメンバーに対応する引数が無いのは、これらの値を利用することがめったにないためと考えれます。必要なら、それぞれGetMessageTime、GetMessagePosというAPIを使って取得します。

記述例

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
 PAINTSTRUCT ps;
 HDC hdc;

 switch ( message ) {
 case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  // TODO: 描画コードをここに追加してください...
  EndPaint(hWnd, &ps);
  break;
 case WM_DESTROY:
  PostQuitMessage(0);
  break;
 default:
  return DefWindowProc(hWnd, message, wParam, lParam);
 }
 return 0;
}

Windows > ウィンドウプロシージャ | comments (0) | trackbacks (0)