2

静的コントロールに線を引きたい:

case WM_CREATE:
    {
        hgraph=CreateWindow(WC_STATIC,NULL,WS_CHILD|WS_VISIBLE|SS_CENTER,20,20,660,80,hWnd,NULL,NULL,NULL);
        SendMessage(hgraph,WM_SETTEXT,NULL,(LPARAM) "My Static");
        break;
    }
    case WM_PAINT:
    {

        hdc=GetDC(hgraph);
        hp=CreatePen(0 ,5,RGB(0,100,0));
        SelectObject(hdc,hp); 
        MoveToEx(hdc, 0, 0, 0);
        LineTo(hdc, 100, 100);
        ReleaseDC(hgraph, hdc);
    }

    break;

しかし、それは静的な制御下にあります: ここに画像の説明を入力してください

4

2 に答える 2

2

子ウィンドウに描画する場合は、親ウィンドウWM_PAINT内ではなく、子ウィンドウプロシージャ内で描画する必要があります。WM_PAINT

システムコントロール(静的など)の場合、ウィンドウをサブクラス化する必要があります。つまり、システム定義のウィンドウプロシージャを独自のプロシージャに置き換える必要があります。独自のウィンドウプロシージャをシステムコントロールにインストールしたら、システムコントロールでWM_PAINTイベントをキャッチしてペイントを行うことができます。

完全な手順は次のとおりです。

  1. 静的制御の置換ウィンドウ手順を定義します。

    また、コントロールの元のシステムウィンドウプロシージャを格納するために使用できる変数を定義する必要があります。これは、コントロールを通常どおりに描画できるようにするために、ある時点で呼び出す必要があります。

    static WNDPROC pFnPrevFunc;
    
    static LRESULT CALLBACK ProcessStaticMessages(HWND hWindow,
                                                  UINT uMessage,
                                                  WPARAM wParam,
                                                  LPARAM lParam)
    {
        /*
         * call the original system handler so the control
         * gets painted as normal.
         */
        (*pFnPrevFunc)(hWindow, uMessage, wParam, lParam);
    
        /*
         * perform our custom operations on this control in
         * addition to system operations.
         */
        switch (uMessage)
        {
            ...
    
            case WM_PAINT:
                /*
                 * static control has just been painted by system.
                 */
                hDC = GetDC(hWindow);
    
                /* draw your lines on the static control */
    
                ReleaseDC(hWindow, hDC);
                return TRUE;
        }
    
        return TRUE;
    }
    
  2. 静的コントロールウィンドウを作成します。

    hWndStatic = CreateWindow(WC_STATIC, (LPSTR) NULL, WS_CHILD|... );
    
  3. 静的制御ウィンドウをサブクラス化します(ウィンドウプロシージャをインストールします)

    pFnPrevFunc = SetWindowLongPtr(hWndStatic,
                                   GWLP_WNDPROC,
                                   (LONG_PTR) ProcessStaticMessages);
    

これが正しく機能する場合は、静的メッセージ処理関数内でWM_PAINTメッセージを受信し、描画が正しく行われるはずです。

于 2012-07-03T09:52:29.860 に答える
1

ヘイブロ!静的プロシージャにDefWindowProcを追加することを忘れないでください。DefWindowProc関数がないとコントロールをペイントできない場合があります。

例:

LRESULT CALLBACK StaticProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch(Msg)
    {
        case WM_PAINT:
            // Do paint here.
            break;
    }
    return DefWindowProc(hWnd, Msg, wParam, lParam); // Call Default Window Procedure.
}
于 2013-06-22T13:29:50.340 に答える