VC++创建有个性的对话框之MFC篇

合集下载

VC设置对话框背景色、背景图片、背景音乐

VC设置对话框背景色、背景图片、背景音乐

一、设置背景颜色的三种方法:1、我们知道程序在运行的时候会调用OnPain函数,那么我们可以在这里设置背景颜色。

void CFlipCardsDlg::OnPaint(){if (IsIconic()){//保持不变}else{CRect rc;GetClientRect( &rc );// 获取客户区CPaintDC dc(this);dc.FillSolidRect(&rc, RGB(0,160,0)); // 填充客户区颜色CDialog::OnPaint();}}2、第二种方法只要一条语句,但是这里要注意这里绘制的颜色是针对程序中所有的对话框(如果是单文档的话,好像不行)SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));// 前一个RGB是背景色,后一RGB是文本颜色该函数放在工程的APP文件的初始化函数中。

3、第三种方法,利用ClassWizard 重载OnCtlColor(),即WM_CTLCOLOR消息在要着色的对话框中申明一个变量,CBRUSH m_hbrush;然后在项目的Dlg类初始化函数中给m_hbrush赋值。

m_brush.CreateSolidBrush(RGB(0, 255, 0));然后在OnCtlColor(...)返回该画刷就可以了,如下。

HBRUSH CFlipCardsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: Change any attributes of the DC hereswitch (nCtlColor){case CTLCOLOR_DLG:HBRUSH aBrush;aBrush = CreateSolidBrush(RGB(0, 150, 0));hbr = aBrush;break;}// TODO: Return a different brush if the default is not desiredreturn hbr;}这样为对话框着色就可以实现了。

建立一个简单地画直线的MFC单文档对话框并实现在对话框里面画直线

建立一个简单地画直线的MFC单文档对话框并实现在对话框里面画直线

建立一个简单地画直线的MFC单文档对话框并实现在对话框里面画直线在MFC单文档应用程序中创建一个对话框窗口并实现在对话框内画直线的过程如下:1.创建MFC单文档应用程序- 在 Visual Studio 中创建一个新的 MFC 单文档应用程序项目。

选择"对话框"作为应用程序类型。

-设置应用程序名称和位置,然后单击"完成"创建项目。

2.设置对话框窗口- 在对话框中添加一个自定义控件。

选择"工具箱"中的"Picture Control"控件,拖动到对话框上。

- 选中图片控件,右键单击并选择"属性"。

更改 ID 为IDC_DRAW_AREA,并将 Border 属性设置为 None。

-拖动控件大小以适应窗口布局,并保存对话框。

3.修改对话框类- 打开对话框类的头文件(例如 CMyDialog.h),添加一个标志变量来跟踪鼠标左键按下的状态:```cppBOOL m_bDrawing;```- 在 CMyDialog.cpp 文件中添加以下消息映射函数:```cppBEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)ON_WM_LBUTTONDOWNON_WM_LBUTTONUPON_WM_MOUSEMOVEEND_MESSAGE_MAP```-在头文件中声明回调函数```cppafx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);```4.实现画线功能- 在 CMyDialog.cpp 文件中实现 OnLButtonDown 函数,该函数用于开始画线:```cppvoid CMyDialog::OnLButtonDown(UINT nFlags, CPoint point)m_bDrawing = TRUE;CClientDC dc(this);dc.MoveTo(point);}```- 实现 OnLButtonUp 函数,该函数用于结束画线:```cppvoid CMyDialog::OnLButtonUp(UINT nFlags, CPoint point) m_bDrawing = FALSE;}```- 实现 OnMouseMove 函数,该函数用于动态绘制线段:```cppvoid CMyDialog::OnMouseMove(UINT nFlags, CPoint point) if (m_bDrawing)CClientDC dc(this);dc.LineTo(point);}}5.更新对话框消息映射```cppafx_msg void OnPaint(;afx_msg BOOL OnEraseBkgnd(CDC* pDC);```6重写重绘和擦除背景函数- 在 CMyDialog.cpp 文件中添加以下代码来重绘对话框:```cppvoid CMyDialog::OnPaintCPaintDC dc(this); // 用于在对话框上绘制//TODO:在此处添加您的消息处理程序代码}```-添加以下代码来防止对话框背景擦除:```cppBOOL CMyDialog::OnEraseBkgnd(CDC* pDC)return TRUE;}7.运行程序-单击“开始调试”(F5)以运行应用程序。

mfc创建对话框的基本步骤

mfc创建对话框的基本步骤

mfc创建对话框的基本步骤创建MFC对话框的步骤如下:1. 新建MFC项目。

在创建项目时,选择visual c++选项卡,然后选择MFC。

在右侧选择MFC应用程序,并在下方填写项目名称。

2. 选择应用程序类型。

在创建项目的过程中,你需要选择应用程序类型。

你可以选择单文档或基于对话框的应用程序类型。

以基于对话框的应用程序为例。

3. 添加对话框。

右键点击“Resource Files”,然后选择“Add Resource”。

在弹出的对话框中,选择“Dialog”,然后点击“New”。

这将在资源视图中创建一个新的对话框。

4. 给新的对话框重写ID。

右键点击新创建的对话框,选择“属性”,在属性页中修改IDD为所需的ID,例如IDD_EXEC。

5. 为模态对话框添加类。

右键点击选中的对话框,然后选择“添加类”。

在弹出的对话框中,输入类的名称,然后点击“确定”。

这将为对话框创建一个新的类。

6. 添加控件。

在对话框编辑器中,你可以直接从工具箱里拖动控件到对话框上。

例如,你可以拖动按钮控件到对话框上。

7. 添加事件处理程序。

对于每个添加的控件,你都可以为其添加事件处理程序。

你可以通过右键点击控件,然后选择“添加事件处理程序”来添加事件处理程序。

在弹出的对话框中,选择相应的事件(例如单击事件),然后在右侧的代码编辑器中编写事件处理程序。

8. 运行对话框。

在完成对话框的编辑后,你可以运行对话框来测试其功能。

你可以通过点击工具栏上的“启动”按钮或按F5键来启动应用程序。

这些步骤可以帮助你创建一个基本的MFC对话框。

当然,具体的实现方式还需要根据你的需求进行调整和修改。

VC++6.0使用MFC创建应用程序框架操作步骤

VC++6.0使用MFC创建应用程序框架操作步骤

图 为套接字类添加响应消息的事件处理成员函数
(3)为套接字类添加一般的成员函数和成员变量 •在VC++的界面中,在工作区窗口选择ClassView卡,用右键 单 击 CMySocket 类 , 会 弹 出 快 捷 菜 单 , 选 择 其 中 的 Add Member Function 可 以 为 该 类 添 加 成 员 函 数 ; 选 择 Add Member Variable可以为该类添加成员变量。
m_listRecetved
Control
CListBox
定义了一个枚举变量IDD,值 , 定义了一个枚举变量 为IDD_TALKC_DIALOG。 。 这个对话框类就是通过这个 IDD和对话框资源建立了联系。 和对话框资源建立了联系。 和对话框资源建立了联系
CTalkcDlg类的 类的 构造函数
类CMySocket的定义 的定义
CMySocket的构造函数 的构造函数 CMySocket的析构函数 的析构函数
(2)利用类向导ClassWizard为这个套接字类添加 响应消息的事件处理成员函数。 •点菜单View/ClassWizard...,进入类向导对话框, 选择Message Maps(消息映射)卡,确认Class name是CMySocket,从Messages(消息)栏中选 择事件消息,然后点击Add Function按钮,就会看 到在Member Function栏中添加了相应的事件处理 函数。 •如图所示,此程序中需要添加OnConnect, OnClose和OnReceive三个函数。这一步会在 CMySocket类的MySocket.h中自动生成这些函数的 声明,在MySocket.cpp中生成这些函数的框架,以 及消息映射的相关代码。可参看后面的程序清单。

MFC C++登录对话框编写步骤

MFC C++登录对话框编写步骤
一些具有DLL扩展名或者有时是EXE扩展名的文件。

3.1 创建“登录”对话框 3.1.1 生成默认对话框工程 1.进入VC++ 安装Microsoft Visual Studio 6.0 后,在开始菜单中单击Microsoft Visual Studio 6.0子菜单下的Microsoft Visual C++ 6.0,即可打开VC++ 6.0 编程平台,如图3.2所示。
(c)“用户名”静态文本标签
(d)“确认”按钮属性
如图3.16(e)所示,在“密码”编辑框属性的Styles 选项卡中勾选 Password。这样,程序运行后,用户输入密码到编辑框时将会显示“***”符号。
(e)“密码”编辑框属性
图3.16 设置控件属性
添加的控件可能大小不一,此时可以选定某个控件,移动鼠标到控件边缘 处出现双箭头来调整大小。要设置多个控件之间的位置大小关系时,先按住 Shift键不放,然后用鼠标选取控件,直到所需要的多个控件选取之后再释放 Shift键。若在选取时,对已选取的控件再单击一下,则取消该控件选取。一旦 单个控件被选取后,其四周由选择框包围着,选择框上还有几个蓝色实心小方 块,拖动它可改变控件的大小;多个控件被选取后,其中只有一个控件的选择 框有几个蓝色实心小方块,这个控件称为“主要控件”,而其他控件的选择框 的小方块是空心的。如图3.17所示。
图3.20 “New Class”对话框
Байду номын сангаас
2.为“登录”对话框设置控件关联变量 使用MFC ClassWizard可以很容易地为一个控件定义关联变量并可设置其数 据范围。例如,下面的步骤是为CDlgLogin类的控件IDC_EDIT1和IDC_EDIT2即 “用户名”和“密码”编辑框添加关联变量m_user和m_pass。 (1)按快捷键Ctrl + W,打开MFC ClassWizard,并切换到Member Variables页面,如图3.21所示。

MFC简单的登录对话框

MFC简单的登录对话框

登录对话框我们利用MFC编写一个简单的登录对话框。

主窗体是单文档界面。

程序运行的时候,先弹出一个简单的登录对话框,输入用户名和密码后主窗体显示出来。

1、开打VC++6.0。

点击文件,新建,点击工程中的MFC AppWizard(exe),在右边选择工程保存的位置,并且为工程取好名字。

2、点击确定后,选择单个文档,你可以一直点击下一步,直到完成,或者在这里直接点击完成即可,完成后界面如下。

3、点击工具栏中的“!”号试着编译运行一次,看是否有问题。

如果没有问题,我们继续。

点击左边的ResourceView,在Dialog上面鼠标右键单击弹出一弹出框,单击Insert Dialog。

4、在右边新增的对话框中,适当改变窗口大小,加入静态文本框和文本编辑框。

输入用户名:。

然后回车同样在下面的第二个静态文本框的属性标题改为:输入密码:。

然后回车。

6、在第一个文本编辑框上右键单击,点击属性,把ID框中的IDC_EDIT1改为容易理解的名字,如:IDC_EDIT_NAME,注意前面的IDC_EDIT最好不要去掉,这样容易见名而知义。

同样,对第二个文本编辑框的属性中的IDC_EDIT2改为:IDC_EDIT_PWD7、在对话框上的任何空白的地方右键单击,点击建立类向导。

然后弹出选择建立Create a new class,点击OK。

这是为这个对话框创建一个新的类。

在Name中,为该对话框类取个名字:CDlg_login。

下面的Base class以及Dialog ID不要随便改动。

然后点击OK。

这样新的类CDlg_login就与本对话框建立起了联系。

8、点击OK后,我们并没有退出建立类向导。

点击member variables。

9、左键双击IDC_EDIT_NAME(或者单击后,点击右边的add variables),为IDC_EDIT_NAME增加一个对应在类中的名字:m_login_name。

其他地方不要改动。

创建基于对话框的MFC工程(详细图示)

创建基于对话框的MFC工程(详细图示)

实例001 如何创建基于对话框的MFC工程《Visual C++开发实战1200例(第I卷)》本书以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Visual C++进行程序开发各个方面的知识和技巧,主要包括编程基础、界面设计、应用程序控制和图形图像。

本节为大家介绍实例001 如何创建基于对话框的MFC工程。

AD:第1章开发环境工程创建开发环境设置与使用程序调试1.1 工程创建实例001 如何创建基于对话框的MFC工程要使用Visual C++开发软件,首先要创建一个工程,而基于对话框的MFC工程则是用户广泛使用的工程。

图1.1将是一个新创建的基于对话框的MFC工程。

本实例将介绍如何创建基于对话框的MFC工程。

(New窗口的Projects选项卡中选择MFC AppWizard[exe](MFC应用程序向导)选项,在Project name文本框中输入创建的工程名"Hello",在Location文本(2)单击OK按钮,弹出MFC AppWizard-Step 1窗口,如图1.3所示。

在MFC AppWizard-Step1窗口中可以指定生成框架的类型。

Single document:生成单文档应用程序框架。

Multiple documents:生成多文档应用程序框架。

Dialog based:生成基于对话框的应用程序框架。

Document/View architecture support:选中该复选框,允许生成文档/视图和非文档/视图结构程序。

(3)本实例选中Dialog based单选按钮,创建一个生成基于对话框的应用程序。

单击Next按钮,弹出MFC AppWizard-Step 2 of 4窗口,如图1.4所示。

MFC AppWizard-Step 2 of 4窗口中的主要选项介绍如下。

About box:生成"关于"对话框。

VC6.0制作简易计算器MFC[整理]

VC6.0制作简易计算器MFC[整理]

1、单击File(文件)菜单,选中New(新建),创建新工程。

2、选择工程栏中MFC AppWizard[exe]应用程序,并命名工程名称为calculator.(如图)3、选择MFC应用程序为“基于对话框”类型,其他选项默认。

单击完成(如图)4、修改界面。

经过前3步骤,VC6.0生成的工作界面如图所示。

先将对话框中的“TODO:在这里设置对话控制”静态文字控件和“确定”按钮控件删除,再使用工具箱将界面拖动控件修改为如图所示的界面。

该图所示是使用工具箱的控件拖放制作的计算器初始界面。

由于这些控件都有默认的名字,所以我们要对控件进行改名,右击Button1按钮,选中Properties(属性)选项以修改控件的属性,如图所示。

在弹出的对话框中,将Button1按钮的Caption(标题)属性修改为“+”,此时初始界面同时变成相应的“+”如下图所示。

修改后的界面如图所示,控件的Caption属性就是控件显示出来的值。

按照前文所讲述的方式,将界面上的按钮控件和静态文本控件的Caption属性都做相应的修改,修改后的界面如图所示。

5、为Edit(编辑)控件添加类的成员变量。

首先,右击Edit控件,选择ClassWizard(建立类向导)选项,如下图所示。

在弹出的对话框中,选择上方MemberVariables选项卡,选中DIC_EDIT1,然后单击单击右侧的Add Variable按钮,如图所示。

单击Add Variable按钮后会跳出,如图所示的对话框,该对话框是设置成员变量的命名和数据类型,在此可以命名为m_data1.注意:控件的ID只是标记一个控件,程序中不能直接控制ID,只能通过修改变量来改变控件的状态。

00相应的,再将另外两个Edit控件命名,本项目就将这3个Edit控件命名为:●IDC_EDIT1:m_data1,类型为double.●IDC_EDIT2:m_data2,类型为double.●IDC_EDIT3:m_result,类型为double.6、添加按钮控件的消息处理函数。

MFC无标题栏对话框美化

MFC无标题栏对话框美化

1.无标题栏和边框的对话框Border 属性改为NoneTitle bar属性改为False2.对话框添加OnInitDialog函数OnInitDialog 在vs2010中实现为虚函数,所以在“项目”-> “类向导”-> “虚函数”->找到对应虚函数添加即可,就这么简单。

3.移动无标题栏的对话框拖动无标题窗口时,欺骗WINDOW在鼠标点下是像WINDOW发送一个鼠标选中WINDOW标题栏的消息!添加鼠标左键消息。

void CMyPlayerDlg::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default//使窗口可以拖动PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM (point.x, point.y));CDialog::OnLButtonDown(nFlags, point);}在OnLButtonDown的鼠标响应消息添加红色部分代码!WM_NCLBUTTONDOWN 鼠标选中非客户区域(标题栏)HTCAPTION 鼠标选中了标题栏MAKELPARAM (point.x, point.y)) 返回一个LPARAM的值PostMessage函数功能:该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。

消息队列里的消息通过调用GetMessage和PeekMessage取得。

原型与参数如下:函数原型:BOOL PostMessage(UINT Msg,WPARAM wParam,LPARAM lParam);参数说明:Msg:指定被寄送的消息。

wParam:指定附加的消息特定的信息。

IParam:指定附加的消息特定的信息。

MFC对话框几个对话框程序例子建立对话框与相应程序相关联

MFC对话框几个对话框程序例子建立对话框与相应程序相关联

MFC对话框和对话框类几个对话框程序例子建立对话框与相应的程序相关联如何建立对话框与相应的程序相关联:在MFC中,对资源的操作都是建立相关的类来完成的;所以我门先NEW 一个对话框资源然后建立他的类与相应的应用程序相关联就可以;步骤:1 NEW 一个对话框资源2 在资源上选择 Classwarrzd上创建一个新的类(或在资源上双击左键)3 起名字!(注意文件名将会去掉C 例如我门的名字叫 CDaiDlg那么文件名是 DaiDlg);对话框的俩种类型:1 模态对话框(特性:当建立模态对话框时,将不允许用户点击对话框以外的控件后应用程序本身,也就是说当模态对话框建立时应用程序停止运行而只运行对话框,所以模态对话框是可以使用局部变量的定义方法的!)模态对话框是比较方便的一种对话框~建立函数:int CDialog::DoMadol() //注意他是CDialog类成员也就是说想使用先建立一个 CDialog 对象吧如果我门想要在View类中建立一个 CDialog对象不要忘了要在View的Cpp 文件中包含 CDialog.h2 非模态对话框(特性与模态的相反)使用成员函数 BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );nIDTemplate 为对话框的ID号pParentWnd 拥有这个对话框的对象指针,如果是NULL 为默认的主应用窗口也就是 Frame应用窗口注意如果我门在使用Create创建非模态对话框时要调用一个函数来显示这个对话框CWnd::ShowWindow(SW_SHOW);不仅这样非模态对话框时不能是局部变量!完整代码: CDialog dlg;dlg.Create(ID,this);dlg.ShowWindow(SW_SHOW):对ShowWindow的发现: ShowWindow是CWnd的成员函数是改变窗口的显示属性(包括Hide Show等)ShowWindow这一函数是改变属性同样在创建一个窗口时(窗口包括很多,CButton也是一个窗口!)可以直接给他赋予属性 WS_VISIBLE (可见的)等属性也可以解决改变窗口之后更新窗口的问题显示出新窗口的问题~!对于俩种对话框的销毁;模态对话框中OnOK的成员函数中有对模态对话框的 EndDialog();来销毁而非模态的对话框时 OnOK不能销毁对话框而我门需要对OnOK函数进行覆盖调用DestryWindow;做一个对话框的小程序,在对话框上动态增加一个按钮:在这要强调一下动态的增加某种资源是需要把资源对象声明成类的成员这样才可以(不然被析构了建立了也就没有效果了)而资源对象是对象资源是资源只有吧资源和对象联系起来这个的东西才有实际的意义,我门才能对他进行操作,而把资源和对象联系起来有俩个函数 LoadMenu 和CreateMenu (当然有些类是不存在 Load函数的例:Button类) Load函数是将一个已经被我门在资源视图中创建好的东西与对象联系而Create函数是直接创立一个新的东西(而直接创立时我门还需要给他一些这样东西的属性所以使用Create函数时总是件另人讨厌的事情~)更重要的事情是:一个对象只能与一个资源相联系如果你想把这个已与资源联系的对象与另一个资源联系起来那必须先调用DestoryWindow()这个资源然后在做新的联系;静态文本框的操作:刚刚建立的静态文本框是不可以做消息响应的(一般也不需要这么去做)而我门想要去用静态文本框的消息就要改边文本框的 ID (因为一般不给文本框添加消息响应文本框的的ID都是一样的)并且要把属性->样式(Styles)->通告(Notify)打上对号!!几个有用的函数:获得窗口的文本CWnd::int GetWindowText(CString &str);CWnd::int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const; 参数str是放置文本的对象!lpszStringBuf是一个字符串的指针,nMaxCount 到大的最大字符数同样使用 SetWindowText(CString str)SetWindowText(LPCTSTR lpszString);来设置文本获得对话框上控件的指针(控件包括了Button,静态文本等等!)CWnd::CWnd* GetDlgItem( nID )使用ID号来获取控件的指针!从而进行操作!从编辑框得到数据的几种操作1 使用GetDlgItem( nID )->GetWindowText( )然后把字符转换为我门所要的东西(使用 atoi,itoa 的转换函数)这几个函数所要注意的问题使用函数前一定要确定这个函数是对谁操作!对谁操作要获取谁的指针!!GetWindowText(LPTSTR lpszStringBuf, int nMaxCount )这个函数参数lpszStringBuf所要存储的指针 nMaxCount 是最大得到多少个字符~使用代码例子:char str[10];GetDlgItem( nID )->GetWindowText(str,10 );//注意第一个参数使用的是指针aoti itoa 函数介绍:(介绍前的感想,做ACM时看到程序就要将程序分成一个一个功能函数,然后将功能函数做好,从来没有想过使用他人做好的函数,而现在学习了MFC这套教程,养成的第一个习惯就是寻找自己想要的函数在MSDN中,然后再自己编写算是一种偷懒的行为吧,估计在以后的编程中,也要养成先寻找和想要的类模型差不多的类然后在通过继承派生来得到想要的类模型,这可能就是代码重用的本质吧 ~ MS就是一大堆会偷懒的编程员 ~呵呵)double atof( const char *string );int atoi( const char *string );__int64 _atoi64( const char *string );long atol( const char *string );这四个函数不用多说了,要注意的就是参数的问题,不要看参数名字叫 string 就是一个CString 成员而是 char*(指针) 也就是数组的名字返回型是相应转化的数据类型;(这是一个不错的函数)不过要注意他是需要包含头文件Routine Required Header Compatibilityatof <math.h> and <stdlib.h> ANSI, Win 95, Win NTatoi <stdlib.h> ANSI, Win 95,Win NT_atoi64 <stdlib.h> Win 95, Win NTatol <stdlib.h> ANSI, Win 95, Win NT还可以反过来 itoa, ftoa等等做一个介绍char *_itoa( int value, char *string, int radix );value要转换的数char *string 一个buffer 接受转换后的字符串int radix 十进制啊二进制 ...==(还有这里的 atoi 的 a 是ASCII的 A 这就解释了为什么不是ctoi~)2 使用函数GetDlgItemText( nID,LP... ),SetDlgItemText(nID,LP...)(这函数不仅长的象 GetDlgItem 和 GetWindowText 的混合体功能更是相同...又个偷懒的杰作!)int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;int GetDlgItemText( int nID, CString& rString ) const;void SetDlgItemText( int nID, LPCTSTR lpszString ); 使用也是一样的!比那个能方便点~!3 又一个混合体函数 GetDlgItemInt();; SetDlgItemInt()在2的基础上来atoi都不用了!UINT CWnd:: GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) const;nID ID号lpTrans 如果NULL 那么不会给出错误的提示bSigned 是否是有符号的数字(就是是否去转化符号“-”) TRUE就是有符号啦!!void SetDlgItemInt( int nID, UINT nValue, BOOL bSigned = TRUE ); nValue 是你想要在DlgItem输出的数字;4 使用资源来关联变量的方式来控制数据交换(这才是重点,因为他不只提供了对数据错误的提示功能还增加了控件与资源的联系当然我门需要了解框架所带给我门的东西;)在控件上使用ClassWarrzd 选择第2个选项卡!(Member Variables)对相应的 ID 号进行资源与数据的联系:观察一下ClassWarrzd给我门在代码里家了些什么:1 在头文件中加了// Dialog Data//{{AFX_DATA(CTextDlg)enum { IDD = IDD_DIALOG1 };int m_num1;int m_num2;int m_num3;//}}AFX_DATA这是数据交换的宏2 在构造函数里给这几个成员变量初始化://{{AFX_DATA_INIT(CTextDlg)m_num1 = 0;m_num2 = 0;m_num3 = 0;//}}AFX_DATA_INIT3 在void CTextDlg::DoDataExchange(CDataExchange* pDX)函数中增加了数据交换声明{CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CTextDlg)DDX_Text(pDX, IDC_EDIT1, m_num1);DDX_Text(pDX, IDC_EDIT2, m_num2);DDX_Text(pDX, IDC_EDIT3, m_num3);//}}AFX_DATA_MAP}对与 void CTextDlg::DoDataExchange(CDataExchange* pDX) 的使用用来数据交换!!这个函数是被框架调用,用来交换和验证数据的函数!这个函数从来不被直接掉用而是通过调用UpdateData()函数来调用这个函数来交换和验证数据的(这句的意思是DoDataExchange 接口是不对我门开放的我门想要掉用 DoDataExchange这个函数必须用UpdateData()来间接调用)BOOL UpdateData( BOOL bSaveAndValidate = TRUE );介绍:参数问题:bSaveAndValidate=TRUE 时数据开始交换(也就是说我门对该变量的操作是生效的)而当他是 FALSE 时数据不再交换而是初始化这个函数(也就是把这个变量的操作失效不过可以在屏幕上进行显示!)通过改变这个参数的值我门可以控制数据的交换或是数据的显示~这是很重要的;!错误的数字使得我门的操作成为无效;~还要说的一点是当创建的是模态对话框时(DoModal)时系统会自动把这个参数变成 FALSE 也就是说我门初始时是不能改变变量的例子代码: UpdateData();m_num3=m_num1+m_num2;UpdateData(FALSE);//我门也可以让控件关联一个控件变量然后在调用他的成员函数进行操作(教程里有讲不过觉得有些多余,也许在其他类型的程序中可能要有用,注意这种方法ClassWarrzd的使用方法)函数 SendMessage( );(注意是SendMessage 而不是SetMessage)是一个发送消息的函数使用....不详,查查SDK API什么的吧~ 功能很强大static LRESULT SendMessage( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )关于SendMessage()函数的说明发送一个响应的消息message,然后用wParam,lParam来接受我门想要的东西(当然这个要取决于我门发的是什么消息现在已知的消息是:WM_SETTEXT,WM_GETTEXT去MSDN 看看)而SendMessage 在API 和 MFC 中都有要注意是谁调用他的原始问题;SendMessage()的变种(向对话框中的子控件发送消息):LRESULT SendDlgItemMessage( int nID, UINT message, WPARAM wParam = 0, LPARAM lParam = 0 ); 用法基本相同对于获取编辑框复选的操作:向编辑框发送一个 EM_GETSEL (同样也是 EM_SETSEL) 要使用SendMessage()来发送//还要注意的是我门已经把复选设置好了有的时候也是看不见效果的,因为我门在操作时点击了按钮或者其他的操作使得焦点没有在我门所设置那个Item上所以我门是看不见结果的我门还要增加一个操作是用函数改变焦点:CWnd* CWnd::SetFocus( );没有参数返回值是以前那个带有焦点的指针;(对与复选最常用的是复选所有的东西,这样我门要把 SendMessage 的wParam =0,lParam =-1)总结:怎么样改变对话框的大小用来增加新的功能?对话框的矩形坐标可以利用一个图形控件和 SetWindowPos 来改变先要知道对话框的矩形坐标通过控件得到(GetWindowRect())矩形坐标 ...这样我门就能知道需要改变什么矩形坐标了void GetWindowRect( LPRECT lpRect ) const; 函数参数 lpRect 用来储存矩形坐标BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags ); 本来是用来改变Window Z-order 的(什么是 Z-order简单说就是显示窗口的顺序)在 79 710 俩课中使用的SDK 函数不再介绍(因为不明白!!)使用default按钮的特性来增加对话框对回车(0x0d)按键响应的操作我门用一个设置输入焦点随回车变化的例子来说明;因为在重载OnOK函数时 OnOK还是会调用基类的 OnOK函数(OnOK函数会自动关闭对话框)而我门不希望我门在输入回车时关闭对话框所以我门将它转化为注释!然后使用函数获取当前焦点的句并 Wnd* GetFocus( )来选择GetNextWindow(UINT nFlag = GW_HWNDNEXT )然后在使用SetFocus( );完整代码:(在Dialog中的 OnOK 函数中)GetFocus()->GetNextWindow()->SetFocus();这个代码逻辑上是可以的,不过执行起来会发生错误,如果一直回车下去回造成程序崩溃;(哪有那么都 GetNext呀?)我门要使用Tab功能的函数来完成这个功能就不会出错了~CWnd* GetNextDlgTabItem( CWnd* pWndCtl, BOOL bPrevious = FALSE ) const;pWndCtl开始时的窗口bPrevious = FALSE 向下走;如何查看 Tab 顺序:布局(layout)-> Tab顺序(Tab Order)OK按钮不管存在不存在都会执行 OnOK函数他的ID 号是IDOK(不是ID_OK 哦)孙鑫MFC教程笔记(菜单.对话框)2007-08-11 20:03对话框先要对消息的传送进行分析:消息分为三类标准消息,命令消息,通告消息;标准消息:是除WM_COMMAND以外的所有以WM_开头的消息(WM_Char,WM_Move 等)命令消息:WM_COMMAND 包括了来自菜单、加速键或工具栏按钮的消息。

MFC

MFC

这是应用程序向导的最后一步,在这一步中,向导问我们列出了将要生成的类的列表(类名可以修改)。好,点击完成按钮,应用程序向导设置完成。
向导运行结束后,开发界面就出现了,左侧的是解决方案的文件资源树(包含一个项目,以及属于该项目的文件),右侧是一个UI设计窗口,在VS9中,这些需要程序员设计的部分默认都是选项卡的形式。
MFC 之 对话框编程入门
前言
如果您已经是MFC高手,那么这篇文章不适合您;如果您写过MFC程序,那么这篇文章可能对您意义不大;如果您是位MFC菜鸟,那么该文章就比较适合您了。本文章是叙述的是通过实例来详细解释如何使用MFC开发应用程序的。笔者选用的开发环境是Visual Studio 2008(简称VS9)专业版中的Visual C++ 2008(VC9),此文章中的主要内容也同样适用于使用Visual C++ 6.0的读者。若问为什么笔者要选择Microsoft(MS)的这款产品,因为笔者认为MS的工具最大优点就在细节上设计非常好,用户用着非常舒服,具体优点会在以后提到。由于笔者此次是第一次写教程,所以有疏略之处,还请读者见谅。
然后出现的是MFC应用程序向导,VC将会根据程序员在向导中的设置自动生成一个应用程序框架。首先出现的是一个概述,这个我们不用管他,下一步。
在这步中,设置我们要创建MFC程序的类型,选择“基于对话框”,在最底处,有一个使用Unicode库,关于这个Unicode,我们会在今后的论述中提到,此时不要管它,保持默认选中状态。在右侧设置MFC的使用方法,其中“在共享DLL中使用MFC”是让你编译的程序通过调用动态链接库的方式来运行MFC程序,如果目标机器没有安装VS9或没有VC9的MFC运行库文件的话,那么生成的程序将无法在这种机器上运行,所以程序员要根据具体情况来选择。由于我们是学习目的,所以保持此项默认状态即可,下一步。

MFC实验二 对话框程序设计

MFC实验二 对话框程序设计

实验二对话框程序设计(一) 实验目的:1 学习如何创建对话框程序,并想其中添加控件。

2 学习如何使用对话框来打开和保存文件。

3 学习创建消息对话框。

在Windows程序中,对话框是最重要的显示信息和取得用户数据的单元;一个应用程序可以拥有几个对话框,这些对话框从用户那里接受特定类型的信息;可以使用资源编辑器创建对话框资源,向其中添加控件,调整对话框的布局,使对话框更加便于使用。

(二) 实验内容:应用实例创建一个基于对话框的应用程序,并添加文件菜单,用来打开和保存文件;建立消息对话框,用来提醒用户在退出前保存文件;同时建立一个属性页对话框,掌握其基本用法。

(三) 实验步骤:实验一:创建简单的对话框应用程序1.使用AppWizard创建一个基于对话框类型的程序Prog01。

在AppWizard的第一页选择“Dialog based” ,生成标准对话框模板。

2.可以设置对话框的属性,右键单击整个对话框的背景,选择“Properties”项,在弹出的对话框中修改此对话框ID为:IDD_PROG01_DIALOG,标题为:“简单计算器”。

当对话框资源完成以后,选择ctrl+w,打开ClassWizard,已经有一个类Prog01Dlg与新的对话框相联系。

3.在控件工作栏点击要添加的空间图标,选择所需的控件。

一共要添加三个静态文本框、三个编辑框、五个命令按钮。

可以改变空间的大小、位置、对齐方式等等。

4.添加控件结束后,设置各个控件的属性。

右键需要设置属性的控件,在弹出的菜单中选择Prperties,或选中控件按回车键。

各个控件的属性设置如下图。

下表列出了本题中所有控件的属性设置以及添加的成员变量:5.为控件添加相对应的成员变量。

执行xiew-class wizard命令或者Ctrl+w,选择member variables ,可以在对话框类中为控件添加关联的成员变量和删除变量。

以第一个编辑框为例,成员变量名为m_floatFirstNum,float型。

MFC 对话框和常用教程

MFC 对话框和常用教程

第五章对话框和常用控件对话框是Windows应用程序中最重要的用户界面元素之一,是与用户交互的重要手段,在程序运行过程中,对话框可用于扑捉用户的输入信息或数据。

对话框是一个特殊类型的窗口,任何对窗口进行的操作(如:移动、最大化、最小化等)都可在对话框中实施,一般来说,在对话框中通过各种控件(如:按钮、编辑框、列表框、组合框等)来和用户进行交互。

控件是在系统内部定义的用于和用户交互的基本单元。

一、对话框的使用Visual C++提供的对话框编辑器能“可视”地进行设计、编辑,并可用ClassWizard为对话框从CDialog基类中派生一个类,MFC的CDialog类封装了用于对话框的显示、关闭等操作的许多功能函数,例如:DoModal函数用来显示模式对话框并返回用户操作的结果。

1、模式对话框(为186附加举例页)所谓模式对话框是指,当对话被弹出时,用户必须在对话框中进行相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。

平常我们所见到的对话框大多是模式对话框。

例:模式对话框(通过菜单命令弹出)1)建一个单文档(SDI)应用程序2)创建对话框模板Insert→Resource→选中Dialog→单击New拖过一个静态文本,鼠标对准它,按右键点properties改标题为“新建模式对话框”。

3)鼠标右键对准对话框的任何位置单击,选择properties选项,设置ID为IDD_MYDIALOG 4)给对话框创建类双击新建对话框的任何位置,单击OK,写类名为“CMyDlg”,保证”CDialog”作为该类的基类。

5)创建菜单命令:a)打开资源编辑器的菜单项Menub)双击IDR_MAINFRAMEc)双击右边空白菜单,点开pop_up(让它是空白),在名字处写”弹出对话框(&A)”,ID 处写ID_PUPDIALOG6)将菜单命令连接到主框架程序中,完成ID_PUPDIALOG的消息映射:View→ClassWizard→保证Class name里是CMainFrame,在ObjectIDs里找到ID_PUPDIALOG点黑→Messages里(右边)点COMMAND建立主框架对象方法并加代码:void CMainFrame::OnPupdialog(){ CMyDlg MyDlg;MyDlg.DoModal(); //DoModal()是CDialog类成员函数,通过调用该//函数将显示对话框。

MFC之编写一个简单的登录对话框

MFC之编写一个简单的登录对话框

MFC之编写一个简单的登录对话框编写一个简单的登录对话框大家好,我们利用MFC编写一个简单的登录对话框。

主窗体是单文档界面。

程序运行的时候,先弹出一个简单的登录对话框,输入用户名和密码后主窗体显示出来。

1、开打VC++6.0。

点击文件,新建,点击工程中的MFC AppWizard(exe),在右边选择工程保存的位置,并且为工程取好名字。

2、点击确定后,选择单个文档,你可以一直点击下一步,直到完成,或者在这里直接点击完成即可,完成后界面如下。

3、点击工具栏中的“!”号试着编译运行一次,看是否有问题。

如果没有问题,我们继续。

点击左边的ResourceView,在Dialog上面鼠标右键单击弹出一弹出框,单击Insert Dialog。

4、在右边新增的对话框中,适当改变窗口大小,加入静态文本框和文本编辑框。

输入用户名:。

然后回车同样在下面的第二个静态文本框的属性标题改为:输入密码:。

然后回车。

6、在第一个文本编辑框上右键单击,点击属性,把ID框中的IDC_EDIT1改为容易理解的名字,如:IDC_EDIT_NAME,注意前面的IDC_EDIT最好不要去掉,这样容易见名而知义。

同样,对第二个文本编辑框的属性中的IDC_EDIT2改为:IDC_EDIT_PWD7、在对话框上的任何空白的地方右键单击,点击建立类向导。

然后弹出选择建立Create a new class,点击OK。

这是为这个对话框创建一个新的类。

在Name中,为该对话框类取个名字:CDlg_login。

下面的Base class以及Dialog ID不要随便改动。

然后点击OK。

这样新的类CDlg_login就与本对话框建立起了联系。

8、点击OK后,我们并没有退出建立类向导。

点击member variables。

9、左键双击IDC_EDIT_NAME(或者单击后,点击右边的add variables),为IDC_EDIT_NAME增加一个对应在类中的名字:m_login_name。

mfc列表框控件的使用

mfc列表框控件的使用

MFC列表框控件的使用1. 介绍MFC(Microsoft Foundation Classes)是微软公司提供的一套用于开发Windows 桌面应用程序的C++类库。

MFC列表框控件是其中的一种常用控件,它可以用来显示和编辑列表中的项。

在本文中,我们将学习如何使用MFC列表框控件来创建、显示和操作列表中的数据项。

2. 创建列表框控件首先,我们需要在对话框资源中添加一个列表框控件。

打开Visual Studio,创建一个新的MFC应用程序项目,并选择对话框作为应用程序类型。

然后,在资源视图中双击IDD_DIALOG1以打开对话框编辑器。

在工具箱中找到列表框控件(List Box),并将其拖放到对话框上。

3. 设置属性选中刚刚添加的列表框控件,在属性窗口中可以设置其各种属性。

3.1 样式(Style)样式属性定义了列表框的外观和行为。

常见的样式包括:•单选(Single):只能选择一个项。

•多选(Multiple):可以选择多个项。

•排列(Sort):自动按字母顺序排序。

•水平滚动条(Horizontal Scrollbar):显示水平滚动条。

•垂直滚动条(Vertical Scrollbar):显示垂直滚动条。

3.2 数据源(Data)数据源属性定义了列表框中显示的数据项。

可以通过以下几种方式设置数据源:•字符串数组(String Array):将一个字符串数组赋给列表框。

•整数数组(Integer Array):将一个整数数组赋给列表框,每个整数对应一个数据项。

•数据库记录集(Database Recordset):将数据库查询结果赋给列表框。

3.3 绑定变量(Bound Variable)绑定变量属性定义了与列表框关联的变量。

当用户选择某个项时,该变量会被更新。

可以使用以下几种类型的变量:•字符串变量(String Variable):保存选中项的文本。

•整数变量(Integer Variable):保存选中项的索引。

mfc对话框使用

mfc对话框使用

mfc对话框使用
MFC对话框是Windows编程中常用的GUI界面,它提供了一种方便快捷的方式来创建和
管理用户界面。

使用MFC对话框,可以轻松地添加控件、处理事件和响应用户操作。

创建MFC对话框的步骤很简单。

打开Visual Studio并创建一个新的MFC应用程序。

然后,选择“对话框”作为应用程序类型,并选择所需的对话框模板。

接下来,可以在对话框中添
加所需的控件,例如按钮、文本框、列表框等。

可以使用MFC框架提供的事件处理程序
来响应用户操作。

MFC对话框的优点在于它的易用性和灵活性。

通过使用MFC对话框,可以快速创建一个
功能完善的用户界面,同时还可以轻松地对其进行自定义和扩展。

MFC框架还提供了许
多有用的功能,例如自动布局、对话框管理和资源管理等。

MFC对话框是一种非常有用的工具,可以帮助Windows程序员快速创建和管理用户界面。

无论是初学者还是经验丰富的开发人员,都可以从MFC对话框的使用中受益。

手工生成(不用向导)MFC对话框应用程序

手工生成(不用向导)MFC对话框应用程序

手工生成(不用向导)MFC对话框应用程序天天用MFC的向导开发程序觉得有的时候不是很方便,怎样不用向导直接用MFC来生成一个对话框应用程序呢?现在我来为大家介绍一下。

打开vc++6.0,建立个基本的工程,当然了工程名称自己随便取,这里我取名为AppDlgTst。

工程的类型选择Win32 Application,如下图:第二歩选择“An empty project”,一个空的工程,如下图:点击“完成”,再“确定”,建立一个win32工程。

接下来,给工程添加主程序类。

主菜单(insert->NewClass),打开“New Class”对话框。

新建一个类,Name: CWinAppDlg ,Derived From :CWinApp,as:public。

点击“Change…”按钮,修改类文件的路径,把类文件放到新建的工程目录下。

界面如下:点击“OK”,会出现如下提示框:不用管它,确定。

这是一个基本的应用程序类,就这样建成了。

接下来,我们需要手动添加一个对话框,添加方法如下:依次点击主菜单的“insert”→“resource…”,打开insert resource对话框。

选中“Dialog”,点击“New”按钮,一个对话框就添加到你的工程中了。

如下图:对话框添加了,但工程中相应的资源管理器(ResourceView)还没有出现,无法操作添加的对话框。

关闭工作区,此时系统会提示是否保存资源文件?如下图:点击“是”,保存资源文件为“script.rc”,保存,如下图。

重新打开工程,但左侧的工程管理栏内仍然没有“resourceView”页,怎么办?把刚才保存的资源文件添加到工程即可,操作如下:依次点击主菜单“project”→“add project”→“Files…”,打开“Insert Files into Project”对话框,找到刚才退出工程时保存的资源文件“Script.rc”,选中它,点击“保存”。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文由小徐技术库贡献
doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
本资料由-校园大学生创业网-提供 /
创建有个性的对话框之 MFC 篇
想使自己的软件与众不同就要给软件加点“色”, 一个颜色搭配协调的窗口 要比 windows 千篇一律的灰底黑字更能吸引别人的眼球。设想如果 html 浏览器 显示的网页都是白底黑字,还会有那么多的 mm 喜欢上网吗?可能互联网的人气 将下降一半。做个出色的界面对于老手来说可能不在话下,但是对于新手来说还 是无从下手,使用 BCGControlBar 和 Xtreme Toolkit 是个很好的选择,不过对 于一个小程序使用这么大的库未免有头重脚轻的感觉。 其实不使用这些庞然大物 一样可以做个很“色”的界面,本文就结合 CSDN 论坛上经常被问起的问题,介 绍几个给对话框上色的方法。本文的方法都是针对 MFC 程序的,其他方法请参看 “创建有个性的对话框之 ATL/WTL 篇”。 第一步:改变对话框的背景颜色 如何改变对话框的背景颜色这个问题常常出现在论坛上,可见大家对 Windows 默认的灰色对话框是多么不满。MFC 程序修改对话框的背景和文字颜色 最简单的方法就是调用 SetDialogBkColor 函数,SetDialogBkColor 是 CWinApp 类的成员函数,以下是该函数的原型: void CWinApp::SetDialogBkColor(COLORREF clrCtlBk, COLORREF clrCtlText); 请注意,SetDialogBkColor 函数并不是对 Windows 的某个 API 的封装,他 是 MFC 框架的一部分,所以不使用 MFC 的程序也就不能享受这种方便。这个函数 的使用很简单,在程序的 CWinApp 派生类的 InitInstance 函数中添加一行代码 就行了: SetDialogBkColor(RGB(188,197,230),RGB(13,125,188)); 图.1 就是运行效果:
在线代理 /提供部分资料
本资料由-校园大学生创业网-提供 /
图.1 SetDialogBkColor 效果图 使用 SetDialogBkColor 也有局限的地方,那就是所有的控件文字颜色都一 样,不能针对不同的控件设置不同的文字颜色,还有就是不能设置 Edit 控件的 颜色。不使用 SetDialogBkColor 函数,直接编写代码控制对话框的背景颜色和 控件文字颜色也不是很困难的事情, 并且这种方法能够提供更灵活的颜色设置方 案,比如对不同类型的控件使用不同的文字颜色,使用高亮度的背景颜色突出某 个控件等等,最重要的是能够控制 Edit 控件的文字和背景颜色,下面就介绍这 种方法。 首先是改变对话框的背景颜色。 Windows 系统需要重画某个窗口客户区的 当 背景的时候,就会向该窗口发送 WM_ERASEBKGND 消息,窗口的处理过程响应这 个消息重新画窗口的背景,这个过程称之为“自画”。改变对话框的背景颜色的 原理很简单,就是响应这个消息,用自定义的颜色填充对话框的客户区背景,代 替对话框窗口默认的背景填充动作。许多新手经常问:“为什么在 class wizard 中找不到对话框的 WM_ERASEBKGND 消息, 是不是对话框没有这个消息”?其实对 话框也是窗口,它也有 WM_ERASEBKGND 消息,只是 MFC 的 class wizard 使用的 dialog 过滤器将其过滤掉了(只是在 message 窗口的显示中过滤了,并不是真 的不响应这个消息) 为的是代码编写过程中突出对话框专有的消息和控件事件。 , 如图.2 所示,只要在 class wizard 中的“class info” table 标签下将消息 过滤器改成 Windows 就可以在对话框的消息列表中看到 WM_ERASEBKGND 了。
BOOL CCustDlgDlg::OnEraseBkgnd(CDC* pDC) { CRect rcClient; GetClientRect(&rcClient); pDC->FillRect(&rcClient,&m_brBkgnd); return TRUE; //return CDialog::OnEraseBkgnd(pDC); } m_brBkgnd 是个 CBrush,在此之前已经初始化过了,关键代码是最后返回 TRUE,而不是默认的调用基类函数,返回 TRUE 意在告诉 Windows:“我已经画 过背景了,你不要再画了”。现在来看看运行的效果:
在线代理 /提供部分资料
本资料由-校园大学生创业网-提供 /
} } else //不是编辑控件 { pDC->SetTextColor(m_clrText); pDC->SetBkMode(TRANSPARENT); return (HBRUSH)m_brBkgnd; } } 下面我们针对每个控件设置特殊的颜色,区分控件可以通过控件的 ID,修 改控件背景也很简单,直接返回相应的画刷就可以了,下面就是颜色设置的完整 代码: HBRUSH CCustDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); TCHAR szClassName[64]; ::GetClassName(pWnd->GetSafeHwnd(),szClassName,64); if(lstrcmpi(szClassName,_T("Edit")) == 0) //是 Edit 控件 { DWORD dwStyle = pWnd->GetStyle(); if((dwStyle & ES_MULTILINE) == ES_MULTILINE) //多行 edit 控件 { pDC->SetTextColor(m_clrText); return hbr;
图.2 修改消息过滤器 现在通过 class wizard 添加 WM_ERASEBKGND 的消息响应函数,并如下所示 修改这个函数:
在线代理 /提供部分资料
本资料由-校园大学生创业网-提校园大学生创业网-提供 /
pDC->SetBkMode(TRANSPARENT); return (HBRUSH)m_brBkgnd; } } 上面的代码解决了 IDC_EDIT_MULTI_LINE 的问题,但是对每个多行 Edit 控 件都要判断 ID,下面的方法可以一劳永逸地解决多行编辑控件的问题: HBRUSH CCustDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); TCHAR szClassName[64]; ::GetClassName(pWnd->GetSafeHwnd(),szClassName,64); if(lstrcmpi(szClassName,_T("Edit")) == 0) //是 Edit 控件 { DWORD dwStyle = pWnd->GetStyle(); if((dwStyle & ES_MULTILINE) == ES_MULTILINE) //多行 edit 控件 { pDC->SetTextColor(m_clrText); return hbr; } else { pDC->SetTextColor(m_clrText); pDC->SetBkMode(TRANSPARENT); return (HBRUSH)m_brBkgnd;
图.3 重画背景的效果 使用位图作为对话框的背景也不难,就是在整个客户区画一个位图背景, 第二步:改变控件的颜色 看起来不如刚才效果好,控件文字的颜色和背景色都没有改变,这是因为我 们还没有处理 WM_CTLCOLOR 消息。WM_CTLCOLOR 是 Windows 的控件向其父窗口发 送最频繁的通知消息之一,例如,许多控件发送 WM_CTLCOLOR 消息给父窗口,让 父窗口提供画刷来画自己的背景。MFC 的窗口类对这个通知消息特殊对待,如果
在线代理 /提供部分资料
本资料由-校园大学生创业网-提供 /
图.4 重载 OnCtlColor 之后的效果 对于多行 Edit 控件特殊处理,如下所示,上面的问题解决了: HBRUSH CCustDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if(pWnd->GetDlgCtrlID() == IDC_EDIT_MULTI_LINE) //IDC_EDIT_MULTI_LINE 是多行 Edir 控件的 ID { pDC->SetTextColor(m_clrText); return hbr; } else { pDC->SetTextColor(m_clrText);
在线代理 /提供部分资料
本资料由-校园大学生创业网-提供 /
父窗口没有处理这个通知消息,MFC 的窗口类就根据 WM_CTLCOLOR 通知消息的来 源将这个 WM_CTLCOLOR 消息发送回控件,让控件自己处理,这就是所谓的“消息 反射”,不仅是 WM_CTLCOLOR,MFC 对很多通知消息都做了反射,不过我们今天 的例子没有使用“消息反射”,我们在控件的父窗口,也就是对话框窗口处理这 个通知消息。还有一点需要说明的是,WM_CTLCOLOR 消息是 16 位的 Windows 平 台的消息,在 32 位的 Windows 平台上取而代之的是一系列更明确的通知消息: WM_CTLCOLORBTN 按钮控件 WM_CTLCOLORDLG 对话框 WM_CTLCOLOREDIT 编辑控件 WM_CTLCOLORLISTBOX 列表框控件 WM_CTLCOLORSCROLLBAR 滚动条控件 WM_CTLCOLORSTATIC 静态文本控件 MFC 为了兼容性考虑,仍旧使用 OnCtlColor 响应这些消息,但是通过参数 nCtlColor 来具体的区分他们。在这个函数中,我们可以通过改变 pDC 参数的属 性来改变控件的绘制,并返回相应的画刷句柄给控件,控件使用这个画刷画自己 的背景。下面是我们修改后的 OnCtlColor 函数: HBRUSH CCustDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); pDC->SetTextColor(m_clrText); pDC->SetBkMode(TRANSPARENT); return (HBRUSH)m_brBkgnd; //因为 CBrush 类实现了 HBRUSH 类型转换操作 符 //return hbr; } 图.4 就是这段代码的效果,在这里我们不分“青红皂白”,向所有的控件 返回我们自己的画刷,看起来不错,Edit 控件的文字颜色也改了,但是好像多 行 Edit 控件有了麻烦,看来需要对多行 Edit 控件特殊对待。
相关文档
最新文档