Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1590808
  • 博文数量: 441
  • 博客积分: 20087
  • 博客等级: 上将
  • 技术积分: 3562
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-19 15:35
文章分类

全部博文(441)

文章存档

2014年(1)

2012年(1)

2011年(8)

2010年(16)

2009年(15)

2008年(152)

2007年(178)

2006年(70)

分类: C/C++

2008-05-20 13:54:56

有的时候,你可能为了某种需要修改对话框边框的颜色,你可能觉得这很简单, 响应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 );

这样应该就差不多了。

阅读(4000) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~