【转】修改对话框边框颜色

有的时候,你可能为了某种需要修改对话框边框的颜色,你可能觉得这很简单, 响应WM_NCPAINT消息就可以了, 其实我一开始也这么想, 并且也这么做, 后来却发现,根本没用,或许是知识有限,学习不到位吧,不过还好,历经千辛万苦终于找到了解决的方法,下面的例子就是将对话框的边框修改为红色:

对于对话框,只需要重载默认的消息处理函数就行了:

// 重载默认的消息处理函数,主要处理WM_MOVE WM_PAINT WM_NCPAINT WM_NCACTIVATE WM_NOTIFY这// 几个消息就可以了
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    LRESULT lrst=CDialog::DefWindowProc(message, wParam, lParam);
   
    if (!::IsWindow(m_hWnd))
        return lrst;
   
    if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message==WM_NCACTIVATE ||message == WM_NOTIFY)
    {
        CDC* pWinDC = GetWindowDC();
        if (pWinDC)
            DrawBorder(pWinDC);
        ReleaseDC(pWinDC);
    }
    return lrst;
   
    return CDialog::DefWindowProc(message, wParam, lParam);
}

// 重画边框的具体代码
void CMyDialog::DrawBorder(CDC *pDC)
{
    if (m_hWnd )
    {
        CBrush Brush(RGB(255, 0, 0));
        CBrush* pOldBrush = pDC->SelectObject(&Brush);

        CRect rtWnd;
        GetWindowRect(&rtWnd);
       
        CPoint point;
        //填充顶部框架
        point.x = rtWnd.Width();
        point.y = GetSystemMetrics(SM_CYFRAME)+1;
        pDC->PatBlt(0, 0, point.x, point.y, PATCOPY);
        //填充左侧框架
        point.x = GetSystemMetrics(SM_CXFRAME);
        point.y = rtWnd.Height();
        pDC->PatBlt(0, 0, point.x, point.y, PATCOPY);
        //填充底部框架
        point.x = rtWnd.Width();
        point.y = GetSystemMetrics(SM_CYFRAME) + 1;
        pDC->PatBlt(0, rtWnd.Height()-point.y, point.x, point.y, PATCOPY);
        //填充右侧框架
        point.x = GetSystemMetrics(SM_CXFRAME);
        point.y = rtWnd.Height();
        pDC->PatBlt(rtWnd.Width()-point.x, 0, point.x, point.y, PATCOPY);
    }
}

以上代码虽然是针对对话框的,不过,对于一般的窗口,稍微修改一下,估计也是可以的。
如果出現对话框的边框颜色没有修改,可以用:

InvalidateRect(NULL); // 在边框改变的对话框中

或者如果有父窗口,在父窗口中调用:

RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ALLCHILDREN );

这样应该就差不多了。
posted @   奥雷连诺  阅读(222)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
点击右上角即可分享
微信分享提示