0

カスタム タイトル バーを描画しようとしていますが、ウィンドウのクライアント領域の外側をペイントするには、WndProc をオーバーライドして WM_NCPAINT メッセージを処理する必要があることを読みました。現在、私は次のようにしています:

//WndProc override
virtual void WndProc(Message% m) override
{
    switch(m.Msg)
    {
        case 0x85:  //WM_NCPAINT
        case 0x0A:  //WM_PAINT
            //Call original
            System::Windows::Forms::Form::WndProc(m);

            //Now we'll do our painting
            DrawTitleBar(m.HWnd);

            break;
        default:
            System::Windows::Forms::Form::WndProc(m);
            break;
    }
}

ブレークポイントを入れることができ、それがヒットするため、これはうまくいきます。元の呼び出しを削除すると、ウィンドウのフレームが描画されません。DrawTitleBar次のようになります。

void DrawTitleBar(IntPtr hWnd)
{
    IntPtr hDC;
    Graphics^ g;

    //Get the device context (DC)
    hDC = GetWindowDC(hWnd);
    //Get the graphics
    g = Graphics::FromHdc(hDC);

    //Draw
    g->FillRectangle(Brushes::Blue, 0, 0, 100, 10);

    //Cleanup
    g->Flush();
    ReleaseDC(hWnd, hDC);
}

まず、ウィンドウ ハンドルから DC を取得します。次にGraphics、 を使用してオブジェクトを取得しますGraphics::FromHdc。でDCを解放しReleaseDCます。ここに問題がある場合に備えて、ネイティブの Win32 関数をインポートする方法は次のとおりです。

[DllImport("user32.dll")]
extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("user32.dll")]
extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

また、さまざまな方法を試しましたが、すべて同じ結果になりました。Web で C# と VB の例をたくさん見つけることができますが、C++ の例はありません。また、Windows Vista との互換性がこの種の問題であるという記事も読みました。後で追加するので、現時点では気にしません。

4

1 に答える 1