第4-6讲界面元素编程_第1页
第4-6讲界面元素编程_第2页
第4-6讲界面元素编程_第3页
第4-6讲界面元素编程_第4页
第4-6讲界面元素编程_第5页
已阅读5页,还剩114页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章:简单绘图绘制线条要求:单击鼠标左键并按住拖动后,释放鼠标左键,完成线条的绘图。1.新建单文档类型程序,名为Draw,添加鼠标左键按下及释放的消息响应函数;2.为CDrawView类添加Cpoint类型成员变量m_ptOrigin;使用SDK全局函数绘制线条:GetDc可以在任意位置绘图,前提是得到任意绘图区域的句柄可以在任意位置绘图,前提是得到任意绘图区域的句柄必须记住释放资源必须记住释放资源利用MFC的CDC类绘图默认获得的是当前上下文环境下的设备句柄,默认获得的是当前上下文环境下的设备句柄,此处获得的是此处获得的是CDrawView对象的指针句柄对象的指针句柄利用MFC的CClie

2、ntDC类绘图CClientDC类的构造函数会调用类的构造函数会调用GetDC,析,析构函数会调用构函数会调用ReleaseDC,因此不需要显式,因此不需要显式的释放资源;的释放资源;当将当将this更改为更改为GetParent()函数时,则可以函数时,则可以在窗口的整个区域绘图包括菜单栏、工具栏,在窗口的整个区域绘图包括菜单栏、工具栏,非客户区域;因为非客户区域;因为CDrawView是由是由CMainFrame对象生成的,因此此处获得的对象生成的,因此此处获得的即为整个程序的框架窗口设备句柄;即为整个程序的框架窗口设备句柄;利用MFC的CWindowDC类绘图获得了桌面窗口的句柄,故可以

3、实现在整个获得了桌面窗口的句柄,故可以实现在整个桌面绘图;桌面绘图;第五章:菜单操作GetMenu获得菜单项,获得菜单项,GetSubMenu获得菜单项的子获得菜单项的子菜单,菜单,checkMenuItem设置设置/删除菜单项的复选标志删除菜单项的复选标志设置默认菜单项,将会以粗体方式显示加载图标菜单项获得默认的菜单项所能加载的位图的尺寸,并已消息获得默认的菜单项所能加载的位图的尺寸,并已消息框方式显示出来,此处为框方式显示出来,此处为13*13在位图资源编辑器中编辑位图,使之大小为在位图资源编辑器中编辑位图,使之大小为13*13,也可以采用其他工具调整位图大小;,也可以采用其他工具调整位图

4、大小;移除和加载菜单项Cmenu为局部对象,可能导致异常,要么将为局部对象,可能导致异常,要么将menu对象更改为对象更改为CMainFrame的成员变量,的成员变量,要么增加一条语句:要么增加一条语句:menu.Detach();创建快捷菜单(右键菜单)1.在资源选项的Menu文件夹下右键单击,选择Insert Menu 命名为 IDR_POPUP_MENU 在里面填一些菜单项;2.选中视图类,在属性中选择消息:WM_CONTEXTMENU,添加函数函数;void CMyDrawView:OnContextMenu(CWnd* pWnd, CPoint point)/ TODO: 在此处添加

5、消息处理程序代码CMenu m_menu;m_menu.LoadMenuW(IDR_POPUP_MENU);CMenu *popupmenu = m_menu.GetSubMenu(0);popupmenu-TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWnd, 0);第六章 对话框对话框的作用:主要功能是用于接收用户的输入数据;还可用来显示提示信息(如程序启动时显示版权和运行进度信息)。在MFC中,对话框的功能被封装在CDialog类中,而CDialog类是CWnd类的派生类。作为窗口,对话框和其它窗口一

6、样具有窗口的一切功能。对话框的典型应用:通过菜单命令或工具栏按钮打开一个对话框;对话框也可以作为一个程序的主界面。对话框对话框: 是Windows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据。控件控件: 是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入、输出功能。基于对话框的应用程序可以直接利用MFC AppWizard向导创建一个基于对话框的应用程序,这种程序运行后首先出现一个对话框。在向导的第一步选择Dialog Based项。因为对话框应用程序一般不包含文档,故不支持数据库和复合文档。按照对话框应用程序向导提示的步骤进行操作就得到一个对话框应用

7、程序项目,出现对话框编辑器和控件工具栏浮动窗口,它们采用的是一种所见即所得的可视化工作方式。利用向导创建应用程序的框架后,程序员可根据程序具体功能要求添加代码。当一个有模式对话框打开时,用户只能与该对话框进行交互,而其他用户界面对象收不到输入信息。平时所遇到的大部分对话框都是有模式对话框。无模式对话框则不然,该对话框并不阻止用户的输入。对话框的初始化 OnInitDialog():该函数是由消息 WM_INITDIALOG来激活的,但此消息比较特别,它不用添加到消息映射表中。该函数用来进行对话框的初始化,为使用对话框进行准备工作。该函数的原型为:virtual void OnInitDialo

8、g();而且CDialog 类中提供了它的默认实现,即在 CDialog 的派生类中将根据需要决定是否重写该函数。 对话框的结束在 CDialog 类中存在两个关键函数 OnOK()和 OnCancel(),这两个函数用于响应单击OK 按钮(控件 ID 为 IDOK)和 Cancel 按钮(控件 ID 为 IDCANCEL)的消息,这些消息也不用添加到消息映射表里。两个函数都用于关闭对话框并返回对话框拥有者的窗口,但返回结果不同。OnOK()函数返回 IDOK,并把对话框输入的数据结果提供给对话框的拥有者,而 OnCancel()函数返回 IDCANCEL,但并不把对话框输入的数据结果提供给对

9、话框的拥有者。 有关对话框的常用处理函数CDialog:CDialog() 通过调用派生类构造函数,根据对话框资源模板定义一个对话框。CDialog:DoModal() 激活模态对话框,显示对话框窗口。CDialog:Create() 根据对话框资源模板创建非模态对话框窗口。如果对话框不是Visible属性,还需通过调用CWnd:ShowWindow()函数显示非模态对话框窗口。CDialog:OnOk() 单击OK按钮时调用该函数,接收对话框输入数据,关闭对话框。CDialog:OnCancel() 单击Cancel按钮或按Esc键时调用该函数,不接收对话框输入数据,关闭对话框。CDialo

10、g:OnInitDialog() WM_INITDIALOG消息处理函数,在调用DoModal或Create函数时系统发送WM_INITDIALOG消息,在显示对话框前调用该函数进行初始化。CDialog:EndDialog() 用于关闭模态对话框窗口。CWnd:ShowWindow() 显示或隐藏对话框窗口CWnd:DestroyWindow() 关闭并销毁非模态对话框CWnd:UpdateData() 通过调用DoDataExchange()设置或获取对话框控件的数据CWnd:DoDataExchange() 被UpdateData()调用以实现对话框数据交换,。CWnd:GetWindo

11、wText() 获取对话框窗口的标题CWnd:SetWindowText() 修改对话框窗口的标题CWnd:GetDlgItemText() 获取对话框中控件的文本内容CWnd:SetDlgItemText() 设置对话框中控件的文本内容CWnd:GetDlgItem() 获取控件或子窗口的指针CWnd:MoveWindow() 用于移动对话框窗口CWnd:EnableWindow() 使窗口处于禁用或可用状态对话框数据交换DDX和验证DDV在对话框中实现用户数据输入和输出的一般方法是通过ClassWizard类向导将对话框控件与成员变量相关联,利用对话框数据交换DDX(Dialog Data

12、 Exchange)和验证DDV(Dialog Data Validation)机制实现数据的输入和输出。是将成员变量与对话框控件相连接,完成数据在成员变量与控件之间的交换。用于数据的校验,它能自动校验输入的数据是否符合设计要求。对话框数据交换与验证都是通过DoDataExchange()完成。当利用ClassWizard类向导添加成员变量时,用户如果在窗口的左下角输入数据的范围,ClassWizard将自动加入函数DDV的调用代码。例如,当添加一个UINT型的成员变量m_nInput时指定它的最小值和最大值分别为0和100,则ClassWizard类向导将在成员函数DoDataExchang

13、e()中添加以下DDV函数的调用语句:DDV_MinMaxUInt(pDX, m_nInput, 0, 100);程序运行后,如果用户的输入数据超出0100的范围,DDV将显示一个提示信息对话框,提示用户有效的输入范围。UpdateData()的用法当调用UpdateData(TRUE)时,MFC通过调用DDX函数将数据从控件传递到关联的成员变量;当调用UpdateData(FALSE)时,MFC通过调用DDX函数将数据从成员变量传递到关联的的控件。利用UpdateData()函数实现了在刷新后重新获取成员变量。UpdateData(TRUE)UpdateData(FALSE)初始化成员初始化

14、成员变量变量更新后重新获更新后重新获取成员变量取成员变量当程序调用CDialog:DoModal()创建并显示对话框时,将自动调用CDialog:OnInitDialog()完成初始化的工作。在函数OnInitDialog()中,程序会自动调用UpdateData(FALSE),将数据从成员变量传递到关联的控件,从而显示在控件中。单击OK按钮将调用CDialog:OnOk()函数,在OnOK()中程序会自动调用UpdateData(TRUE),将数据从控件传递到关联的成员变量。DDX就如同一条双向通道,而方向控制开关就是UpdateData()函数中的BOOL类型参数是TRUE还是FALSE。

15、提示信息对话框提示信息对话框也称消息对话框,用来显示有关的提示信息。提示信息对话框是一种最简单的对话框,不需要用户自己创建它就可以直接使用,Visual C+提供了相应的函数实现这样的功能。MFC全局函数:int AfxMessageBox(LPCTSTR lpText, UINT nType=MB_OK, UINT nlDHelp=0);API函数:int MessageBox(HWND hWnd, LPCTSTR lpText,LPCTSTR lpCaption, UINT nType);CWnd类的成员函数:int CWnd:MessageBox(LPCTSTR lpText, LPCT

16、STR lpCaption=NULL, UINT nType=MB_OK);它们的功能基本相同,但适用范围有所不同:AfxMessageBox()和MessageBox()可以在程序中任何地方使用,而CWnd:MessageBox()只能用于控件、对话框、窗口等一些窗口类中。 AfxMessageBox(参数保存到文件失败!, MB_ICONINFORMATION|MB_OK);MessageBox(NULL, The key you pressed is A or a ! , KEYDOWN, MB_ICONINFORMATION|MB_OKCANCEL); MessageBox(NULL,

17、 The key you pressed is not b or B !,KEYDOWN,NULL);MessageBox(下传独立参数完成!);例如,在软件安装过程中为了弹出如下图所示的例如,在软件安装过程中为了弹出如下图所示的警警告提示信息对话框告提示信息对话框并进行相应的处理:并进行相应的处理:编写的代码如下: int nChoice=MessageBox(文件复制失败!, 错误,MB_ICONWARNING | MB_ABORTRETRYIGNORE ); switch(nChoice) case IDABORT: / 用户按下终止按钮. . . . . . /处理功能caseIDRE

18、TRY: / 用户按下重试按钮. . . . . . /处理功能case IDIGNORE: / 用户按下忽略按钮. . . . . . /处理功能 使用对话框 为了在屏幕上显示对话框: (1)首先需要建立对话框资源及其与资源相关的对话框类; (2)然后添加控件、与控件关联的成员变量和消息处理函数; (3)最后在程序中显示对话框并访问与控件关联的成员变量。 在Visual C+中可以利用集成工具如对话框编辑器和ClassWizard类向导很方便地创建对话框,不需要程序员手工编写太多的源代码。模态对话框与非模态对话框 模态对话框:在关闭之前,用户将无法在同一个应用程序(准确地说,是在同一用户接口

19、线程里)的其他地方进行工作。比如,OpenFile对话框。非模态对话框:在它仍保留在屏幕上的同时,用户还可以在应用程序的其他窗口进行工作。常用的Find查找和Replace替换对话框就是非模态对话框。如果关闭非模态对话框的父窗口,非模态对话框一般也自动关闭。 模态对话框工作流程 定义对话框类;利用对话框类声明一个对话框对象,即一个能够在屏幕上显示的对话框; 通过对话框对象调用对话框类的成员函数DoModal()建立对话框窗口并显示对话框。例如,假设定义了一个名为CMyDialog的对话框类,为了在屏幕上显示一个对话框,可以编写如下代码: CMyDialog myDlg; myDlg.DoMod

20、al();对话框中一般都有OK和Cancel按钮,单击OK按钮时调用C D i a l o g : : O n O K ( ) 函 数 , 单 击 C a n c e l 按 钮 时 调 用CDialog:OnCancel()函数。OnOK()函数和OnCancal()函数都将结束DoModal()函数调用,但令DoModal()返回不同的值,用户可以根据DoModal()的返回值做出不同的选择。OnOK()函数令DoModal()返回IDOK;OnCancel()函数令DoModal()返回IDCANCAL。例如: if (myDlg.DoModal() = = IDOK ) 对话框的初始化

21、可以在三个不同阶段所调用的函数中进行: (1)对话框类构造函数; (2)WM_CREATE消息处理函数; (3)WM_INITDIALOG消息处理函数。注意:对话框的初始化通常是在消息WM_INITDIALOG的消息处理函数OnInitDialog()中进行。在收到WM_INIT- DIALOG消息时,对话框的框架已创建,对话框中的每个控件也已建立起来,但它们还没有在屏幕上显示。此时自然可以设置或优化对话框中各个控件的外观、尺寸、位置以及其它属性。函数OnInitDialog()将被成员函数DoModal()调用。创建一般的模态对话框的基本步骤用对话框编辑器创建包含各种控件的对话框资源,指定对

22、话框本身的属性(如大小、位置、风格、类型等)和对话框中的控件及属性。对话框编辑器会对工程的资源文件进行更新,使之包含新的对话框资源,并且该工程的resource.h也会被更新。用ClassWizard创建CDialog类的派生类,并将它与第一步创建的资源文件相连接。 ClassWizard会自动在工程中加入相应的代码和头文件。利用ClassWizard向对话框类添加数据成员、交换函数和确认函数。利用ClassWizard对对话框中的按钮好其他可以产生事件的控件加入相应的消息处理函数。对一些特殊的控件初始化函数以及消息控制函数进行编辑。对视图代码进行编辑,以激活对话框。在程序中使用创建的模态对话

23、框例 通过对话框输入一个圆的半径,根据输入值在屏幕上画圆。v方案1:建一个SDI类型的项目,利用菜单打开一个对话框,获得输入的半径后在视图里重画。(见课本例子)v方案2:直接用对话框输入数据和显示图形非模态对话框的创建1.新建一个单文档程序,添加一个对话框资源,并为之创建对话框类CRadiusDlg;添加一个编辑框控件,并生成一个变量m_nRadius;2 . 在 视 图 类 头 文 件 中 加 入 刚 创 建 的 对 话 框 类 的 头 文 件 ,#includeRadiusDlg.h,并添加一个对话框类的指针变量,CRadiusDlg *pModalessDlg;3.在菜单栏中添加一个用于

24、显示对话框的菜单项,并为其添加命令函数,添加代码:if(pModallessDlg=NULL)pModallessDlg=new CRadiusDlg;pModallessDlg-m_iDlgRadius=100;/设置编辑框控件变量的初始值pModallessDlg-Create(IDD_RADIUS_DLG,NULL);/创建非模态对话框pModallessDlg-ShowWindow(SW_SHOW);/显示非模态对话框elsepModallessDlg-SetActiveWindow();/若对话框已创建,只需要激活即可此时即可创建一个非模态对话框了,下面需要添加具体的应用:4.在刚才

25、创建的对话框中再添加一个按钮“应用”,ID为IDAPPLY。现在对话框上共三个按钮,“确定”,“取消”和“应用”,我们要添加一个消息WM_DIALOG,为下面点击时按钮服务。a、在对话框类的头文件中加入#define WM_DIALOG WM_USER+1。b、在视图类的头文件中声明消息WM_DIALOG,afx_msg LRESULT OnDialog(WPARAM wParam,LPARAM lParam);在CPP文件中添加消息响应,ON_MESSAGE(WM_DIALOG,OnDialog)。5、在对话框中分别为三个按钮添加消息处理函数。当点击任一个按钮时都发送WM_DIALOG消息,

26、响应OnDialog函数进行相应处理。void CRadiusDlg :OnOK()/ TODO: Add extra validation here UpdateData(true);/获得控件的值,并传递给成员变量CFrameWnd* pFrame=GetParentFrame();/获得父窗口框架CView* pView=pFrame-GetActiveView();/获得当前视图pView-PostMessage(WM_DIALOG,IDOK);/向神图发送消息,参数为IDOK CDialog:OnOK();void CRadiusDlg :OnCancel()/ TODO: Add

27、extra cleanup here /Cancel则不更新数据,直接投递消息CFrameWnd* pFrame=GetParentFrame();CView* pView=pFrame-GetActiveView();pView-PostMessage(WM_DIALOG,IDCANCEL);CDialog:OnCancel();void CRadiusDlg :OnApply()/ TODO: Add your control notification handler code hereUpdateData(true);CFrameWnd* pFrame=GetParentFrame();

28、CView* pView=pFrame-GetActiveView();pView-PostMessage(WM_DIALOG,IDAPPLY);6.编辑消息处理函数WM_DIALOG的响应函数:LRESULT CModallessView:OnDialog(WPARAM wParam,LPARAM lParam)switch(wParam)case IDOK:m_nCViewRadius=pModallessDlg-m_nRadius;/获得对话框编辑控件成员变量的值pModallessDlg-DestroyWindow(); /销毁对话框窗口delete pModallessDlg; /删

29、除当前的非模态对话框对象pModallessDlg=NULL; /设置非模态对话框不存在标志break;case IDCANCEL:pModallessDlg-DestroyWindow();delete pModallessDlg;pModallessDlg=NULL;break;case IDAPPLY: /保留非模态对话框m_nCViewRadius=pModallessDlg-m_nRadius;break;Invalidate(); /刷新视图return 0;7.在视图类的OnDraw函数中,用新获得的m_nCViewRadius变量来画圆圈;8.在视图类的构造函数中初始化m_nC

30、ViewRadius及pModallessDlg=NULL;添加控件结合对话框编辑器,利用Controls控件工具栏可给当前正在编辑的对话框模板资源添加控件。若Visual C+窗口中没有出现Controls工具栏,只需将光标指向菜单栏并单击鼠标右键,从弹出式菜单中选择Controls项。控件工具栏上的每一个图标都代表了一种控件,如果不能确定控件的类型,只要将光标在该控件图标上停留片刻,就会显示该控件类型的提示。 向对话框添加控件时,先在向对话框添加控件时,先在Controls工具栏工具栏单击要添单击要添加的控件,再将光标指向对话框空白区域并单击鼠标。加的控件,再将光标指向对话框空白区域并单击

31、鼠标。添加与控件关联的成员变量在生成自己的对话框类并添加需要的控件后,可以利用ClassWizard类向导在对话框类的定义中为对话框资源上的每一个控件添加一个或多个对应的成员变量。ClassWizard类向导的Member Variables页面主要用来为对话框类添加和删除与对话框控件关联的成员变量,我们在编写对话框程序时经常同该页面打交道。Member Variables页面:Class name下拉框:选择要添加成员变量的对话 框类;Add Variable按钮:添加与控件关联的成员变量;Delete Variable按钮:删除控件的某个成员变量。Control IDs栏:列出对话框资源上

32、已有的控件,第1列Control IDs表示控件的ID,第2列Type表示变量的类型,第3列Member表示成员变量名。Add Member Variable对话框Category下拉框选择Value项:表示要为该控件的某项属性定义一个变量,这意味着程序关心的是控件中的值,而不是控件对象本身。可以通过Variable type下拉框为变量选择不同的类型。选择Control项:表示定义的变量代表控件对象本身, Control类别的变量实质是一个控件对象,其类型是MFC控件类。可以通过添加的控件对象访问控件类的成员变量和调用控件类的成员函数,实现对控件行为的控制和管理。可以为一个控件同时定义一个C

33、ontrol类别的变量和一个Value类别的变量。这些变量都是作为对话框派生类的成员变量,为了在程序其它地方能够直接访问添加的成员变量,它们都被声明为public属性。公用对话框Windows将一些常用的对话框集成到操作系统中,作为Windows公用对话框库Commdlg.dll的一部分。用户在程序中可以直接使用这些公用对话框,不必再创建对话框资源和对话框类,并且,用户还可以定制公用对话框的外观和性能。为了在MFC应用程序中使用公用对话框,MFC提供了封装这些 公 用 对 话 框 的 类 。 这 些 公 用 对 话 框 类 都 是 从CCommonDialog类派生而来,而CCommonDia

34、log类又是CDialog类的派生类。MFC公用对话框类公用对话框类CColorDialogCFileDialog CFindReplaceDialogCFontDialogCPagesSetupDialogCPrintDialogCOleDialog说说 明明颜色设定对话框,选择不同的颜色颜色设定对话框,选择不同的颜色文件存取对话框,打开或保存文件文件存取对话框,打开或保存文件查找和替换对话框,查找和替换文本串查找和替换对话框,查找和替换文本串字体设定对话框,选择不同的字体。字体设定对话框,选择不同的字体。页面设置对话框,设置页码、页眉等页面设置对话框,设置页码、页眉等标准的打印对话框,用于

35、打印和打印设置标准的打印对话框,用于打印和打印设置该类及其派生类用于生成该类及其派生类用于生成OLE对话框对话框CColorDialogCColorDialog调色板对话框调色板对话框COLORREF Color = RGB(0,0,0); /用来获取颜色对话框选取的颜色CColorDialog ColorDlg(NULL,CC_FULLOPEN ,this);if(ColorDlg.DoModal() = IDOK ) Color = ColorDlg.GetColor(); /GetColor(); 获得对话框选取的颜色 / CColorDialog该类函数本身不多,就介绍这些了 /sta

36、tic COLORREF * PASCAL GetSavedCustomColors( );获得用户的自定义颜色 /void SetCurrentColor(COLORREF clr );设置默认颜色CFileDialogCFileDialog文件文件操作操作对话框:对话框:CFileDialog文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下:CFileDialog:CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFla

37、gs = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );参数意义如下:bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框lpszDefExt 指定默认的文件扩展名。lpszFileName 指定默认的文件名。dwFlags 指明一些特定风格。 lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如:Chart Files (*.xlc)|*.xlc|Worksheet Fi

38、les (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*|;文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 | 指明。pParentWnd 为父窗口指针。创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择:CString CFileDialog:GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:testtest1.txtCString CFileDialog:GetFileName(

39、) 得到完整的文件名,包括扩展名如:test1.txtCString CFileDialog:GetExtName( ) 得到完整的文件扩展名,如:txtCString CFileDialog:GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1POSITION CFileDialog:GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。CString CFileDialog:GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POS

40、ITION CFileDialog:GetStartPosition( )来得到最初的POSITION变量。例子:CString FileName;CFileDialog MyDlg(TRUE, NULL,*.TXT,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, *.TXT, NULL );if (MyDlg.DoModal()=IDOK)FileName=MyDlg.GetFileName();AfxMessageBox(FileName);例子:有提示信息的对话框在派生的对话框类中创建一个提示信息控件(CToolTipDlg),利用 GetWindow()

41、函数获得对话框里所有控件的窗口指针,以及利用 LoadString()函数获得提示信息字符串,然后把对 应 的 窗 口 指 针 和 提 示 信 息 添 加 到 CToolTipDlg 控 件 中 。 在 消 息 的 预 处 理 函 数PreTranslateMessage()中调用 CToolTipDlg:RelayEvent()函数,用于将鼠标的消息发送给CToolTipDlg 控件,由 CToolTipDlg 控件处理是否显示相应的提示信息。利用 MFC AppWizard(exe)创建一个新工程 DlgExample,在向导的第(1)步选择对话框模式,而后使用默认值来创建,最后获得一个对

42、话框的应用程序,在对话框中添加一些控件。 在 ClassView 中添加新的类 CToolTipDlg,类的类型为 MFC Class,基类为 CDialog。得到两个新文件 ToolTipDlg.cpp 和 ToolTipDlg.h。在 CToolTipDlg 类中将自动生成的构造函数 CToolTipDlg(CWnd* pParent=NULL)改为CToolTipDlg(UINT uID, CWnd* pParent=NULL)。在 CToolTipDlg 类中利用 ClassWizard 添加要重写的虚函数 PreTranslateMessage()。在 CToolTipDlg 类中利

43、用 ClassWizard 添加消息 WM_INITDIALOG。 在消息处理函数 OnInitDialog()中添加以下代码: BOOL CToolTipDlg:OnInitDialog() CDialog:OnInitDialog(); / 创建提示信息控件 m_wndToolTip.Create(this); m_wndToolTip.Activate(TRUE); / 获得对话框的第一个控件(子窗口)指针 CWnd *pWndChild=GetWindow(GW_CHILD); CString strToolTip; / 循环获得所有控件指针,并将这些控件的提示信息加入到提示信息控件

44、while (pWndChild) int nID=pWndChild-GetDlgCtrlID(); / 获得控件 ID 对应的提示信息字符串 if (strToolTip.LoadString(nID) / 将控件对应的提示信息注册到提示信息控件里 m_wndToolTip.AddTool(pWndChild, strToolTip); / 获得对话框的下一个控件(子窗口)指针 pWndChild=pWndChild-GetWindow(GW_HWNDNEXT); return TRUE; 重写虚函数 PreTranslateMessage(),将所有鼠标消息发送给 CToolTipCtr

45、l 控件,源代码如下: BOOL CToolTipDlg:PreTranslateMessage(MSG* pMsg) / WM_MOUSEFIRST 为第一个鼠标消息值 / WM_MOUSELAST 为最后一个鼠标消息值 if (pMsg-message =WM_MOUSEFIRST&pMsg-message =WM_MOUSELAST) MSG msg; :CopyMemory(&msg, pMsg, sizeof(MSG); / 获得消息结构里窗口句柄的父窗口句柄 HWND hWndParent=:GetParent(msg.hwnd); / 判断父窗口句柄是否是对话框句柄 / 若不是则

46、一直往上找 / 保证消息结构中窗口句柄是对话框的控件句柄 while (hWndParent&hWndParent !=m_hWnd) msg.hwnd=hWndParent; hWndParent=:GetParent(hWndParent); / 若是对话框控件的消息,将鼠标消息发送给 CToolTipCtrl 控件 / 然后由控件来处理这些消息,判断是否显示提示信息 if (msg.hwnd) m_wndToolTip.RelayEvent(&msg); return CDialog:PreTranslateMessage(pMsg); 将前面添加对话框的对应类 CDlgExampleD

47、lg 从 CToolTipDlg 中继承,在ResourceView 的 StringTable 中添加控件 ID 相对应的提示信息。编译、运行该应用程序,当鼠标停留在控件上时就会显示提示信息。例子:动态创建对话框按钮1.生成标准的对话框程序,添加标准按钮成员变量;2.在标准按钮的命令消息响应函数中添加代码:123,即为按钮的,即为按钮的ID,可以更改为别的,可以更改为别的,譬如譬如ID_BTN_NEW,同时在头文件中定,同时在头文件中定义义:#define ID_BTN_NEW 123protected:/AFX_MSG(CTestMainMFC1View)afx_msg int OnCre

48、ate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnbtnDown();/AFX_MSG.cpp:BEGIN_MESSAGE_MAP(CTestMainMFC1View, CView)/AFX_MSG_MAP(CTestMainMFC1View)ON_WM_CREATE()/AFX_MSG_MAP/ Standard printing commands.ON_COMMAND(ID_MYBUTTON,OnbtnDown)END_MESSAGE_MAP()void CTestMainMFC1View:OnbtnDown().;例子:控件的访问静态控件

49、:IDC_NUMBER1,IDC_NUMBER2,IDC_NUMBER3编辑控件:IDC_EDIT1,IDC_EDIT2,IDC_EDIT3第一种方法:第二种办法:第三种方式第四种方式:利用对话框的DDX,DDV机制,定义关联的变量,然后使用UpdateDdata()函数更新控件或赋值控件;第5种方式:Windows消息WM_GETTEXT和WM_SETTEXT第六种方式直接发消息给控件改变对话框与控件的背景及文本颜色首先需要来看一个消息WM_CTLCOLOR,它的响应函数是CWnd类的OnCtlColor,声明如下:该函数将返回将被用来绘制控件背景的画刷的句柄。当一个子控件将要被绘制时,它都

50、会向它的父窗口发送一个WM_CTLCOLOR(这个父窗口通常都是对话框)消息来准备一个设备环境具备(DC),以便使用正确的颜色来绘制该控件。如果想要改变该控件上的文本颜色,可以在OnCtrlColor函数中以指定的颜色为参数调用SetTextColor函数来实现。对对话框来说,它上面的每一个控件在绘制时都要向它发送WM_CTLCOLOR消息,它需要为每一个控件准备一个DC,该DC将通过pDC参数传递给OnCtrlColor函数,也就是说,对话框对象的OnCtrlColor这个消息响应函数会被多次调用。如下为某个对话框的OnCtrlColor响应函数:可以看到在OnCtrlColor这个消息响应

51、函数中,首先调用对话框基类的OnCtrlColor函数,返回一个画刷句柄,然后直接用这个画刷作为返回值。之后系统就会使用这个画刷句柄来绘制对话框及其子控件的背景。如果想要改变对话框的背景色,只需要自定义一个画刷,然后让OnCtrlColor函数返回这个画刷即可。定义一个Cbrush m_brush,并在构造函数中初始化:m_bursh.CreateSolidBrush(RGB(0,0,255);运行刚才的程序会发现整个对话框包括控件全部都变成了蓝色,接下来我们来完成仅改变某个子控件的背景及文本颜色:OnCtlColor函数中第二个参数pWnd能够知道当前绘制的控件窗口对象,这时可以通过调用CW

52、nd类的GetDlgCtrlID成员函数得到该控件的ID,然后判断该ID是否就是需要控制其背景绘制的ID,如果是就处理;该函数不仅能返回对话框子控件的ID,还能返回子窗口的ID。接下来改变一个编辑框控件的背景颜色和文本颜色第七章 定制应用程序外观OnCreate,OnCreateClient,PreCreateWindow三者关系:1.OnCreate在OnCreateClient之前执行, 因此一些操作只能放在OnCreateClient中执行, 比如分割窗口。2.OnCreat在主框架自身被创建时调用,而OnCreateClient使创建客户区窗口(即m_hWndMDIClient)时被调

53、用。在建窗时执行 OnCreate()时候被自动调用。 作用是建CView object。3.PreCreateWindow则是在Create()/CreateEx函数返回之前调用,是在窗口创建之前调用的,用来描述所建窗口的风格或其他方面的设置,可比喻为图纸,之后才会运行OnCreate函数,该函数则是根据之前的设置或者图纸,执行具体的创建工作。第七章 定制应用程序外观自定义窗口大小自定义窗口标题自定义窗口标题定制窗口的图标,光标和背景黑色画刷作为窗口背景黑色画刷作为窗口背景自定义光标自定义光标自定义图标自定义图标窗口背景仍然是白色,光标仍窗口背景仍然是白色,光标仍然是默认的光标,为何?然是默

54、认的光标,为何?答:因为应用程序默认有两个窗口,一个是框架窗口,一个是视图窗口,视图窗口覆盖在答:因为应用程序默认有两个窗口,一个是框架窗口,一个是视图窗口,视图窗口覆盖在框架窗口之上,我们只改变了框架窗口的背景和光标,但是被视图窗口给挡住了。因此应框架窗口之上,我们只改变了框架窗口的背景和光标,但是被视图窗口给挡住了。因此应该在视图类的创建窗口之前,改变设置该在视图类的创建窗口之前,改变设置如何动态显示应用程序的图标预先准备好几幅图标资源,然后在程序中每隔一定的时间按顺序循环显示这几幅图标,从而就实现了一种动画的效果。编码时只要利用定时器和SetClassLong函数就可以完成这个功能。SetClassLong函数允许窗口在创建完成之后修改窗口的外观属性。因此只要每隔一定的时间调用一次这个函数即可。1.准备好三幅图标,可以在网站下载;2.在资源编辑器中导入这三个图标,并定义其唯一的ID号,IDI_ICON1,IDI_ICO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论