网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
用VC实现对属性表按钮区的位图绘制
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式

作者: 徐毅 许润涛 王宇

摘 要:本文通过详细讨论如何用VC实现对属性表按钮区的操作以改变属性页的外观,从而提供一种对Windows应用程序的非窗口客户区进行绘制的方法,并给出了一个简单的示例程序



关键字:属性表类、非窗口区、位图



属性表类(CPropertySheet Class)在编写Windows应用程序时使用非常广泛,如编写安装向导程序、应用程序配置等很多应用程序都必须使用属性表类,但是如何实现用VC对属性表类的按钮区进行绘制却是一个比较困难的问题。因为VC的MFC类库封装了属性表类,使得其外观表现一般不容易改变。而在编写应用程序的过程中却常常遇到要在属性表的按钮区域进行绘制的问题,如在属性表按钮区加入公司的标识等等。属性表按钮区是非窗口客户区,因此要对其直接进行绘制需要采用一些特殊的处理。我们在实际编程开发过程中,对此问题进行了一些探索。下面我们通过示例说明在VC5.0环境下实现对属性页按钮区域位图绘制的方法。



1、 实现非窗口区域绘制的基本思想:

要完成对属性表按钮区域(即非窗口客户区)的操作,必须得到相关的绘图设备环境(CPaint DC),找出按钮区域的具体位置,才能够对其进行操作。为此,需要对MFC的CPropertySheet类进行继承,对其继承类的OnPaint消息处理函数进行重载,在OnPaint消息处理函数中,直接以当前指针为变量定义一个设备环境对象,这就是我们所需的绘图设备环境,再找出属性表类的制表控件(table control)客户区位置和属性表类的缺省按钮位置,就能够计算出按钮区域的具体位置。只要完成上述两步,对属性表按钮区的操作也就不难实现了。



2.示例程序具体实现

首先,用VC的Wizard代码生成器生成一个MFC应用程序框架,在自动生成的过程中,选择应用程序是基于对话框的程序。当生成完毕后,在将自动生成的对话框类全部删除。再手动添加一个从CPropertySheet类继承的子类CPropertySheetWithLogoDlg类和一个基于CDialog类的CFirstPropertyPage类,同时在程序App类的InitInstance方法中删除关于自动生成的对话框类的代码。并加入如下代码:

CPropertySheetWithLogoDlg dlg("属性表按钮区绘制");

CFirstPropertyPage FirstPage; //进行类的实例化

dlg.SetLogoText("Example Vision"); //对要在按钮区域绘制的字符串进行赋值

dlg.AddPage(&FirstPage); //向属性表中添加属性页

int nResponse = dlg.DoModal();

if (nResponse == IDOK){}

else if (nResponse == IDCANCEL){}

return FALSE;

这段代码使由Wizard代码生成器生成的应用程序的主框架(mainframe)成为一个属性表。其中SetLogoText是CPropertySheetWithLogoDlg类的用户自定义方法,它是给写在属性表按钮区的字符串赋值。

下面就是如何对按钮区域进行操作。属性表按钮区是非窗口客户区,因此我们不能通过重载CPropertySheetWithLogoDlg类的OnDraw方法来直接对属性表按钮区进行操作。而必须重载CPropertySheetWithLogoDlg类的OnPaint方法。其具体实现代码如下:

void CPropertySheetWithLogoDlg::OnPaint()

{

CPaintDC dc(this); //获得绘制的设备环境。

if(m_LogoText.IsEmpty())//判断字符串是否为空。

return;

CRect rectTabCtrl;

GetTabControl()->GetWindowRect(rectTabCtrl);//获得属性表的制表控件的客户区屏幕坐标。

ScreenToClient(rectTabCtrl);//屏幕坐标转换为窗口逻辑坐标。

CRect rectOk;

GetDlgItem(IDOK)->GetWindowRect(rectOk);//获得客户区最左按钮屏幕坐标。

ScreenToClient(rectOk); //屏幕坐标转换为窗口逻辑坐标。

dc.SetBkMode(TRANSPARENT);//背景模式设为透明。

CRect rectText;

rectText.left = rectTabCtrl.left;

rectText.top = rec

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号