如何在C ++ .NET中绘制窗口的标题栏?

时间:2012-08-07 02:43:10

标签: c++-cli managed wndproc

我正在尝试绘制一个自定义标题栏,我已经读过为了在窗口的客户区外绘画,我需要覆盖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对象。我用ReleaseDC发布了DC。这里有一个问题,这就是我导入原生Win32函数的方法:

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

另外:我尝试了很多不同的方法,都有相同的结果。我可以在网上找到一堆C#和VB示例,但没有C ++示例。我也读到有关Windows Vista兼容性是这类问题的一个问题。目前,我并不关心这一点,因为我稍后会添加它。

1 个答案:

答案 0 :(得分:0)

两个简单的事实。 1.在DWM下GetWindowDC基本上是破碎的。 2.两种解决方法部分存在A.将兼容性模式设置为xp或98或95。 B. msdn社交中的程序示例存在。搜索 “GetWindowDC已损坏”,然后按照一个冗长的URL访问代码 sample [通过添加尾部来修复损坏的URL]]。 不幸的是,窗口显示圆角 我的盒子构建了9200,赢得了8.0,没有更新。