MFC对话框-重绘非客户端区域(标题栏)

本文档详细介绍了如何在MFC对话框的标题栏上添加自定义按钮,并通过重写DefWindowProc方法进行非客户端区域的重绘。在Win7环境下,使用VS2008 SP1,教程涵盖了添加关闭、最大化、最小化和帮助按钮的步骤,以及处理非客户端鼠标事件以改变按钮状态。
摘要由CSDN通过智能技术生成

某些情况下需要在对话框标题栏上添加按钮,在此mark下:

环境:win7 + vs2008 + sp1

项目:MFC对话框

步骤:

    1.  重写方法:DefWindowProc

            1.1 .h文件添加代码如下:

               a.  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

                      // 添加:
                      virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);

                b.   重绘方法声明:

                        void DrawTitleBar(CDC *pDC);

                c.   按钮标识

                       CRect m_rtButtExit;    // 关闭按钮位置
                       CRect m_rtButtMax;    // 最大化按钮位置
                       CRect m_rtButtMin;    // 最小化按钮位置
                       CRect m_rtButtHel;    // 帮助按钮
                       CRect m_rtIcon;        // 图标位置

               

           1.2  .cpp文件中实现:

LRESULT CtestMyWndDlg::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)
            DrawTitleBar(pWinDC);
        ReleaseDC(pWinDC);
    }
    return lrst;
}

           其中 DrawTitleBar方法如下: 

                 // 重绘标题栏
void CtestMyWndDlg::DrawTitleBar(CDC *pDC)
{
    if (m_hWnd)
    {
        CBrush Brush(RGB(0,0,0));
        CBrush* pOldBrush = pDC->SelectObject(&Brush);

        CRect rtWnd, rtTitle, rtButtons;
        GetWindowRect(&rtWnd);
        //取得标题栏的位置
        rtTitle.left = GetSystemMetrics(SM_CXFRAME);
        rtTitle.top = GetSystemMetrics(SM_CYFRAME);
        rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
        rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);
        
        // 避免与原有标题栏重叠
        int nTitleTopDown = 0;
        CPoint point;
        //填充顶部框架
        point.x = rtWnd.Width();
        point.y = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME)+20;
        pDC->PatBlt(0, nTitleTopDown, point.x, point.y, PATCOPY);
        //填充左侧框架
        point.x = GetSystemMetrics(SM_CXFRAME) + 1;
        point.y = rtWnd.Height();
        pDC->PatBlt(0, nTitleTopDown, point.x, point.y, PATCOPY);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值