カスタム タイトル バーを描画しようとしていますが、ウィンドウのクライアント領域の外側をペイントするには、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 との互換性がこの種の問題であるという記事も読みました。後で追加するので、現時点では気にしません。