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



我正在尝试绘制自定义标题栏,并且我已经阅读了为了在窗口的工作区之外进行绘制,我需要覆盖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::FromHdc获取Graphics对象。我用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. 在DWM下,GetWindowDC基本上被破坏了。2.部分存在两种解决方法 A.将兼容模式设置为xp或98或95。B. MSDN 社交中的程序示例存在。寻找"GetWindowDC broken",然后跟随一个冗长的 url 到一个代码示例 [通过添加尾随修复损坏的 URL)]。不幸的是,窗口显示圆角我的盒子构建9200,赢8.0,没有更新。

相关内容

  • 没有找到相关文章

最新更新