注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

VC 2010 + MFC :使用Ribbon界面风格绘制Dialog对话框的非客户区(标题栏、边框)  

2011-09-07 20:23:50|  分类: vc界面编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

VC 2010 + MFC :使用Ribbon界面风格绘制Dialog对话框的非客户区(标题栏、边框)

By:章永辉

   

主要技术点:破坏类的封装性。

使用Ribbon界面风格来绘制对话框的标题栏,这里仅仅测试一下这个的可行性。Ribbon风格默认只支持文档视图窗口,按照下面的方法,也可以将其扩展到对话框程序中。

   

(1)重载CDialogEx对话框类,得到CSegDialogEx。

(2)映射WM_NCPAINT消息,从而可以自绘标题栏。

//消息映射

    ON_WM_NCPAINT()

 

//函数声明

    afx_msg void OnNcPaint();

 

//函数实现

void CSegDialogEx::OnNcPaint()

{

    if (!((CSegFrameImpl *)&m_Impl)->OnNcPaint())

    {

        Default();

    }

}

 

其中:

am_Impl成员变量。

    CFrameImpl m_Impl;

 

在构造函数中,我们需要对其初始化赋值。

CSegDialogEx::CSegDialogEx(UINT nIDTemplate, CWnd *pParent/* = NULL*/):

CDialogEx(nIDTemplate, pParent),

m_Impl((CFrameWnd *)this)

{

 

}

 

b)由于CFrameImplOnNcPaint不是每个人都可以访问的,所以,我们需要破坏类的封装性。

 我们像以往那样,继续重载之。

#pragma once

#include "afxframeimpl.h"

class CSegFrameImpl :

    public CFrameImpl

{

public:

    CSegFrameImpl(CFrameWnd* pFrame);

    virtual ~CSegFrameImpl(void);

 

    BOOL OnNcPaint()

    {

        return CFrameImpl::OnNcPaint();

    }

};

 

 

这里的CSegFrameImpl就是前面所用到的。

 

至此,我们只要将程序中的对话框基类从CDialogEx改为CSegDialogEx,即可看到Ribbon界面的对话框标题栏了。

 

小结:

    虽然我们初步实现了这个功能,然而,如果完美兼容之,还得加入大量代码的,包括一些非客户区的鼠标消息,我们都得处理。所以,这里就简单处理一下,权当抛砖引玉了。

  评论这张
 
阅读(4198)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016