0

現在、いくつかのカスタム コントロールを開発していますが、現在直面している問題は、カスタム コントロールをいつ再描画する必要があるかを検出する方法がわからないことです。

私はWM_PAINT何でも描いていたので、機能に頼っていRedrawWindow()ます。ただし、カスタム コントロールが描画領域の外に移動してから戻ってくると、再描画されません。WM_NCPAINTうまく機能するキャッチを試みましたが、WM_PAINT親ウィンドウ内でマウスを移動するたびにメッセージが送信されます。

だから私の質問は - 描画領域に戻った後に子ウィンドウをいつ再描画するかをどのように検出するのですか?

以下は私のコードですCALLBACK

LRESULT CALLBACK WinMsgHandler(HWND hWnd, UINT uMsg, 
                               WPARAM wParam, LPARAM lParam)
    {
        switch (uMsg)
        {
        case WM_CREATE:
            settings.TrackingEvent.hwndTrack = hWnd;
            break;
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(hWnd, &ps);
                switch (settings.CurrentState)
                    {
                    case cctrl_UNSELECTED_HOVER:
                        On_UnselectedHover(&hdc, &ps.rcPaint);
                        break;
                    case cctrl_UNSELECTED:
                        On_Unselected(&hdc, &ps.rcPaint);
                        break;
                    case cctrl_SELECTED_HOVER:
                        On_SelectedHover(&hdc, &ps.rcPaint);
                        break;
                    case cctrl_SELECTED:
                        On_Selected(&hdc, &ps.rcPaint);
                        break;
                    case cctrl_3STATE_HOVER:
                        On_IntermediateHover(&hdc, &ps.rcPaint);
                        break;
                    case cctrl_3STATE:
                        On_Intermediate(&hdc, &ps.rcPaint);
                        break;
                    default:
                        break;
                    }
                EndPaint(hWnd, &ps);
            }
            break;
        case WM_NCPAINT:
            RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_FRAME
                        | RDW_INVALIDATE | RDW_ALLCHILDREN);
            break;
        case WM_MOUSEMOVE:
            On_MouseMove();
            break;
        case WM_MOUSEHOVER:
            On_MouseHover();
            break;
        case WM_MOUSELEAVE:
            On_MouseLeave();
            break;
        case WM_LBUTTONDOWN:
            On_LButtonDown();
            break;
        case WM_LBUTTONUP:
            On_LButtonUp();
            break;
        case WM_DESTROY:
            OnDestroy();
            break;
        default:
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
        }
        return 0;
    }
4

0 に答える 0