ピクチャーコントロールで再描画をするには?

解決


どら  2008-05-15 15:34:16  No: 68349  IP: 192.*.*.*

情けない質問でスミマセン>_<;

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の後に何かしなければならないのでしたっけ?

よろしくお願いいたします>_<

編集 削除
gak  2008-05-15 16:29:34  No: 68350  IP: 192.*.*.*

> 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);

編集 削除
gak  2008-05-15 16:32:08  No: 68351  IP: 192.*.*.*

> InvalidateRect(GetDlgItem(hDlg, IDC_PIC), TRUE);
InvalidateRect(GetDlgItem(hDlg, IDC_PIC), NULL, TRUE);

missった…

編集 削除
どら  2008-05-16 13:00:28  No: 68352  IP: 192.*.*.*

gakさん、ありがとうございました。

> InvalidateRect(GetDlgItem(hDlg, IDC_PIC), NULL, TRUE);

であっさりいけました!!
助かりました。

編集 削除