MFC编程中“占位符和动态创建”技巧的应用

原创 2001年01月06日 16:43:00

 刘勇  夏安邦<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

       MFC编程中,“占位符和动态创建”技巧的应用是十分广泛的,虽然在有些编程书籍和文章中有所涉及,但缺乏系统的介绍和必要的总结,给应用带来不便。本文将对这方面的编程技巧进行介绍,并对该技巧的应用范围和注意事项都进行了详细的总结。

一、引言

       MFC提供了Windows环境下应用开发的一套标准类,多数情况下能满足应用开发的需要,但在某些具体情况下为了开发具有个性的应用,开发者需在MFC的基础上使用一些技巧加以变通,“占位符和动态创建”就是其中一种。

动态创建MFC编程中是一项较常用的技巧,即根据需要在某一位置动态创建有关控件、窗口,但该方法有不便之处,即控件位置的确定是非常繁琐的。“占位符和动态创建”技巧在此基础上,合理利用Windows的显示是在平面上的特点以及Microsoft Visual C++的编辑环境,解决了这一问题。该方法首先在需要显示的位置预先放置一个有特定标示符的“占位符”,“占位符”随创建位置不同可以是一个按钮(在工具栏中),窗格(在状态栏中)或是Pictrue控件(在对话框中),其大小可根据需要通过编辑环境或有关代码调整;然后在放置“占位符”的地方“动态创建”所需的界面元素。

利用这项技巧可以实现Windows应用中一些常见但MFC不支持的界面,例如在工具栏、状态栏上创建一些非按钮控件;在对话框中创建工具栏、状态栏或一个控件;在对话框中嵌入一个属性表或另一个对话框,等等。下面通过实例详细介绍该技巧的使用。

二、实例说明

       属性表是一种很有用的界面元素,为我们采集大量数据带来了便利,但如遇到“查找”等需要在对话框中嵌入属性表的情况,则只有借助“占位符和动态创建”技巧才能满足我们的要求。下面通过构造一个类似Windows“查找”应用的例程来说明该技巧的使用,该例程是VC++6.0环境下的对话框应用,生成有关代码后可按以下步骤进行。

1.  设置“占位符”

首先在对话框中需要嵌入属性表的位置放置一个Picture控件,除需设置一个特定的标示符ID外控件的属性可采用缺省设置。找到控件的方法一般有两种:或是利用ClassWizard将该控件映射为对话框类的数据成员(是一个CStatic类的实例),本例采用这种方法;或是在程序中根据“占位符”的特定ID,利用GetDlgItem () 函数获得对控件的控制权。

然后在对话框编辑器中将Picture控件的大小调整为对应属性页对话框的大小。

最后在对话框的OnInitDialog ( ) 函数中加入如下代码,以获得“占位符”位置并作相应的坐标转换,其中m_ctrlHolder是“占位符”经ClassWizard映射所得的Cstatic类的实例。

CRect rect;

m_ctrlHolder.GetWindowRect (&rect);

ScreenToClient (&rect);

2.  生成属性表和属性页代码

根据需要生成要创建的属性表和属性页的代码,这一步可照常进行。

3.属性表的“动态创建”及数据交换

       完成以上准备工作后就可以动态创建属性表了。首先,在对话框类中加入一公有数据成员,是属性表的一个实例或指针,用于对属性表的操作如动态创建和数据交换。

然后,在OnInitDialog函数中紧接步骤1的代码加入“动态创建”的代码,即在Pictrue控件的位置“动态创建”属性表以覆盖Pictrue控件,从而实现在对话框中嵌入属性表的目的。动态创建属性表如创建无模式对话框一样调用Create()函数,但必须指明WS_CHILDWS_VISIBLE属性,其余属性根据需要再行添加。另外在对话框中嵌入属性表时必须指定WS_TABSTOPWS_EX_CONTROLPARENT属性,从而使TAB键能顺利传递焦点。

最后,需对属性表的有关控件进行数据交换,这可通过属性表数据成员、属性页的数据成员及UpdateData()函数来完成。有关代码如下:

//在堆里生成对话框的属性表数据成员m_pPropSheet并“动态创建”属性表“控件”;

       m_pPropSheet = new CQryPropSheet (this);

       if (! m_pPropSheet -> Create (this,WS_CHILD | WS_VISIBLE, 0)) {

       delete m_pPropSheet;

              m_pPropSheet = NULL;

              return -1;

}

//对属性表进行初始化,本例中对“包含子文件夹”复选框进行了初始化;

       m_pPropSheet -> m_Page1.m_bChildFolder = TRUE;

       m_pPropSheet -> m_Page1.UpdateData (FALSE);

//修改属性表属性使TAB键能传递焦点,并且属性表能接受焦点;

   &

MFC 技巧之三

21. 介绍函数过程中一种任意键退出同时能处理消息的实现方法  1. 设置定时器,用于使::GetMessage(...)函数总能快速取到消息. 2. 在函数处理中加入: 函数每执行完一...
  • zang141588761
  • zang141588761
  • 2016年01月22日 14:18
  • 564

【Matlab编程】Matlab高效编程技巧

1.默认状态下,matlab显示精度是short型,而默认的计算精度是double型,并且显示精度与计算精度没有关系。 2. 一只失明的猫的问题:注意方法! 3.给数组预分配空间是基本的高效编程准则...
  • tengweitw
  • tengweitw
  • 2014年06月16日 18:39
  • 2223

c++多线程编程与MFC多线程编程

转载来自:http://www.oschina.net/question/565065_72661 (一)有关多线程的WIN32 API函数 1、HANDLE CreateThread...
  • songyimin1208
  • songyimin1208
  • 2016年12月30日 17:55
  • 288

MFC多线程编程之二——MFC中的多线程开发

五、MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。 工作者线程没有消息机制,...
  • Arcsinsin
  • Arcsinsin
  • 2013年11月19日 22:02
  • 4038

单片机编程开发技巧

工作了7个月之久,对单片机的编程也开始慢慢熟悉起来,以前总是知道单片机就是定时器,状态机,中断这些东西结合起来效率是相当高的,但是自从接手开发GPF这个芯片之后,我发现了另外一种单片机的开发技巧,高手...
  • morixinguan
  • morixinguan
  • 2016年06月27日 12:05
  • 2709

30个java编程小技巧

Java是目前最流行的编程语言之一——它可以用来编写Windows程序或者是Web应用,移动应用,网络程序,消费电子产品,机顶盒设备,它无处不在。 有超过30亿的设备是运行在Java之上的。根据...
  • my_name_nb
  • my_name_nb
  • 2017年03月28日 21:33
  • 971

C、C++编程技巧

技巧1          计算某个数转化为二进制后,其二进制数中含有多少个1?...
  • lukairui7747
  • lukairui7747
  • 2014年06月26日 20:30
  • 736

MFC 调试方法

MFC 调试方法 Visual Studio 2013 其他版本 此主题尚未评级 - 评价此主题 如果要调试 MFC...
  • imxiangzi
  • imxiangzi
  • 2014年06月27日 10:31
  • 6278

VS2013编程实用小技巧

1. Peek View可以在不新建TAB的情况下快速查看、编辑一个函数的代码。用法:在光标移至某个函数下,按下alt+F12,显示Peek窗口,按F12直接转到定义。 然后在Peek窗口里可以...
  • zx3517288
  • zx3517288
  • 2016年10月26日 21:58
  • 1459

30 个java编程技巧(最佳实践的初学者)

1.return 一个空的集合,而不是 null 如果一个程序返回一个没有任何值的集合,请确保一个空集合返回,而不是空元素。这样你就不用去写一大堆 ”if else” 判断null元素。 ...
  • zyf__java
  • zyf__java
  • 2016年09月05日 08:23
  • 6209
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC编程中“占位符和动态创建”技巧的应用
举报原因:
原因补充:

(最多只允许输入30个字)