2013.11.29 Friday
Windowsプログラミング 「文字を書く」
今度は文字を書くぞ!
ウィンドウプロシージャの一部を抜粋。
case WM_PAINT:
PAINTSTRUCT paint;
hdc = BeginPaint(hwnd,&paint);
TextOut(hdc,100,100,tmp,strlen(tmp));
EndPaint(hwnd,&paint);
break;
hdcはHDC型で最初の方で宣言している。tmpは文字列。
HDCはデバイスコンテキストハンドルと呼ばれるもので、ウィンドウに貼り付けられている画用紙などと説明されている。
各ウィンドウには画用紙が貼り付けられており、BeginPaintでその画用紙のハンドルを取得して描画するというイメージらしい。
んで、これだけじゃつまらんのでボタンを押すと文字が変わるプログラムを作ってみた。
ボタンが押されたことはWM_COMMANDでわかり、ここでtmpを変えてやればよい。
しかし問題がある。ボタンを押しただけだとWM_PAINT、すなわち再描画メッセージが送られないのでウィンドウを最小化して再表示する等しないと文字が変化しない。
よし、じゃあ自分でWM_PAINTメッセージを送ってやればいいんじゃ!ということでPostMessageやSendMessageを試してみたがだめ。どうやらWM_PAINTメッセージはユーザが送ってはならないっぽい。
色々調べてみると、ウィンドウに無効領域を作る関数があり、それを使えばよいらしい。
case WM_COMMAND:
sprintf(tmp,"Button");
InvalidateRect(hwnd,NULL,TRUE);
break;
ボタンクリックで・・・
ウィンドウプロシージャの一部を抜粋。
case WM_PAINT:
PAINTSTRUCT paint;
hdc = BeginPaint(hwnd,&paint);
TextOut(hdc,100,100,tmp,strlen(tmp));
EndPaint(hwnd,&paint);
break;
hdcはHDC型で最初の方で宣言している。tmpは文字列。
HDCはデバイスコンテキストハンドルと呼ばれるもので、ウィンドウに貼り付けられている画用紙などと説明されている。
各ウィンドウには画用紙が貼り付けられており、BeginPaintでその画用紙のハンドルを取得して描画するというイメージらしい。
んで、これだけじゃつまらんのでボタンを押すと文字が変わるプログラムを作ってみた。
ボタンが押されたことはWM_COMMANDでわかり、ここでtmpを変えてやればよい。
しかし問題がある。ボタンを押しただけだとWM_PAINT、すなわち再描画メッセージが送られないのでウィンドウを最小化して再表示する等しないと文字が変化しない。
よし、じゃあ自分でWM_PAINTメッセージを送ってやればいいんじゃ!ということでPostMessageやSendMessageを試してみたがだめ。どうやらWM_PAINTメッセージはユーザが送ってはならないっぽい。
色々調べてみると、ウィンドウに無効領域を作る関数があり、それを使えばよいらしい。
case WM_COMMAND:
sprintf(tmp,"Button");
InvalidateRect(hwnd,NULL,TRUE);
break;
ボタンクリックで・・・