情けない質問でスミマセン>_<;
Windows XP SP2 + VS.NET 2005 Team Editionで、SDKでモードレスダイアログの
アプリケーションを作成しています。
ダイアログ中のピクチャーコントロールに円などを描画することはできたのです
が、例えばボタンを押したら円の色を変更する、と言った処理がうまくいかず・・・
ダイアログをいったん隠すなどすると再描画されるようで、色が変わっています。
ピクチャコントロールはサブルーチン化しており、初期化関数として
void InitPIC(HWND hDlg)
{
hPic = GetDlgItem(hDlg, IDC_PIC);
pGraphCtrl = GetWindowLong(hPic, GWL_WNDPROC);
SetWindowLong(hPic,GWL_WNDPROC,(LONG)piccon_subproc);
}
で、コールバック関数として
LRESULT CALLBACK piccon_subproc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
PAINTSTRUCT ps;
HDC hdc;
switch (msg)
{
// 再描画処理を追加してみた
case WM_PAINT:
if(fDrawGraph == TRUE)
{
//描画開始
hdc = GetWindowDC(hWnd);
hdc = BeginPaint(hWnd, &ps);
//ここで描画処理
EndPaint(hWnd, &ps);
ReleaseDC(hWnd, hdc);
fDrawGraph = FALSE;
}
break;
}
// 続けて、本来のピクチャコントロールの処理をおこなう
return CallWindowProc((WNDPROC)pGraphCtrl,hWnd,msg,wp,lp);
}
としています。
で、ダイアログプロシージャ内ではWM_INITDIALOGメッセージのときに
InitGraph(hDlg);
と初期化関数を呼び出し、ボタン押下時のメッセージで
SendMessage(GetDlgItem(hDlg, IDC_PIC), WM_PAINT, 0, 0);
としていますが・・・
WM_PEINTメッセージの送り方って、これじゃまずいんでしたっけ?
それとも、SendMessageの後に何かしなければならないのでしたっけ?
よろしくお願いいたします>_<
> The WM_PAINT message is generated by the system and should not be sent by an application.
って事なので SendMessage(WM_PAINT) は激しくマズイ。
windowの描画を更新したい時は対象領域をインバれば良い。
InvalidateRect(GetDlgItem(hDlg, IDC_PIC), TRUE);
> InvalidateRect(GetDlgItem(hDlg, IDC_PIC), TRUE);
InvalidateRect(GetDlgItem(hDlg, IDC_PIC), NULL, TRUE);
missった…
gakさん、ありがとうございました。
> InvalidateRect(GetDlgItem(hDlg, IDC_PIC), NULL, TRUE);
であっさりいけました!!
助かりました。