文档库 最新最全的文档下载
当前位置:文档库 › MFC对话框几个对话框程序例子建立对话框与相应程序相关联

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

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

MFC对话框和对话框类几个对话框程序例子建立对话框与相应的程序相关联如何建立对话框与相应的程序相关联:

在MFC中,对资源的操作都是建立相关的类来完成的;

所以我门先NEW 一个对话框资源然后建立他的类与相应的应用程序相关联就可以;

步骤:

1 NEW 一个对话框资源

2 在资源上选择 Classwarrzd上创建一个新的类(或在资源上双击左键)

3 起名字!(注意文件名将会去掉C 例如我门的名字叫 CDaiDlg那么文件名是 DaiDlg);

对话框的俩种类型:

1 模态对话框(特性:当建立模态对话框时,将不允许用户点击对话框以外的控件后应用程序本身,也就是说当模态对话框建立时应用程序停止运行而只运行对话框,所以模态对话框是可以使用局部变量的定义方法的!)

模态对话框是比较方便的一种对话框~建立函数:

int CDialog::DoMadol() //注意他是CDialog类成员也就是说想使用先建立一个 CDialog 对象吧

如果我门想要在View类中建立一个 CDialog对象不要忘了要在View的Cpp 文件中包含 CDialog.h

2 非模态对话框(特性与模态的相反)

使用成员函数 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 Compatibility

atof and ANSI, Win 95, Win NT

atoi ANSI, Win 95,Win NT

_atoi64 Win 95, Win NT

atol 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_INIT

3 在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 包括了来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。

通告消息:由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现

菜单名词说明:

一个菜单拦可以有若干个子菜单,一个子菜单又可以有若干个菜单项等。对菜单栏的子菜单由左至右建立从0开始的索引。对特定子菜单的菜单项由上至下建立了从0开始的索引。访问子菜单和菜单项均可以通过其索引或标识(如果有标识的话)进行。

菜单只有一个!子菜单!菜单项!索引都是从0开始

//菜单的操作是在框架类(Frame)进行的 :

定位菜单的方法及有关函数:

第一步获得菜单:

CWnd::CMenu* GetMenu( ) const; //指针

第二步获得子菜单:

CMenu::CMenu* GetSubMenu( int nPos ) const;

参数 nPos 是子菜单的位置(索引)从0开始;

第三步对菜单项操作~

可以一起使用 GetMenu()->GetSubMenu(0)->?

菜单的特殊操作

1 给菜单前打对号(标记菜单项)

函数 UINT CheckMenuItem( UINT nIDCheckItem, UINT nCheck ); nIDCheckItem 是与 nCheck 相关的参数取值

nCheck 是 MF_BYCOMMAND or MF_BYPOSITION 和 MF_CHECKED or MF_UNCHECKED 的和

2 给菜单前添位图(标记菜单的功能等)

函数 BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags,

const CBitmap* pBmpUnchecked,

const CBitmap* pBmpChecked );

nPosition 与 nFlags 相关 nFlags 为 MF_BYCOMMAND 或 MF_BYPOSITION

注意CBitmap 是资源定义的应该是类变量而不是局部变量

CBitmap 13*13 才能符合标记大小

技巧:给出一个求系统中定义大小的函数 int GetSystemMetrics(int

nIndex )

nIndex 为系统的ID 查询MSDN (记得 GetTextMetrics 是文本信息字体的平均宽度和高度的求法)

CString :: Format("%d,%d")格式处理内容到 str字串中和 C中的printf();用法差不多~!

3 标明菜单可用不可用(变灰+是否真的可点击来发送命令消息)

使用函数CMenu::UINT EnableMenuItem( UINT nIDEnableItem, UINT

nEnable );

同样参数 nIDEnableItem 与参数 nEnable 有关

nEnable MF_BYCOMMAND or MF_BYPOSITION 与 MF_DISABLIE or MF_ENABLE 也可以变为灰色 MF_GRAYED

需要注意的是想让手动对菜单项进行操作需要在(Frame)构造函数中将一个值( m_bAutoMenuEnable )

初始化为 FALSE ! m_bAutoMenuEnable 提供了MFC自动识别是否菜单项可用(通过检测是否为MFC添加了

消息响应函数)!!

4 加载新的菜单或更换新的菜单

有关函数 SetMenu(CMenu *menu);返回值为修改之前的菜单;注意是指针!!

忽忽使用SetMenu(NULL); 就可以取消菜单哦~

不要忘了 Menu 也是资源需要定义在类成员中不然要出错的!!!

使用Menu.LoadMenu( IDNo. );

MFC的菜单消息更新机制~(可以通过此来修改菜单是否可用等)

菜单的运行是一个快速循环的过程,依赖于CN_UPDATE_COMMAND_UI消息谁捕获了CN_UPDATE_COMMAND_UI消息

MFC将会创建一个对象 CCmdUI (UI是用户接口的英文缩写 User-I****记不住了) CCmdUI 先与子菜单索引位

置0,菜单项索引位置0开始循环一次向下推进一次(当然CPU的速度很快

几乎就是一瞬间的事情)而我门通过

对CN_UPDATE_COMMAND_UI消息的捕获来控制菜单的属性;

实现的方法:通过手工或 Classwizard 来添加一个命令ID的响应(不要使用原来用的COMMAND而使用UPDATE_COMMAND_UI)利用所添加的函数传进来的参数 pCmdUI(是指针)来进行属性的操作!

//工具栏图标的索引记数顺序是:从做至右从0开始,分隔符也算索引号

//当工具栏与菜单ID一样时就可以实现其快捷方式(点击后产生相同的消息映射)

提示可以去看看 pCmdUI 中的成员!

增加右键弹出菜单的功能(俩种方法)

1 通过编译器来添加右键菜单

点击VC6.0的Project(工程)->Add to Project(增加到工程)->Components and Controls.....

观察它为我门增加了什么进入代码:A,一个菜单资源;B,在派生View类中增加OnContextMenu()函数

(至于怎么对右键进行消息扑获未研究清楚)

所以我门使用对右键的消息响应在其中增加菜单就可以手动来加入菜单!

2 手动来加入右键POP菜单!

先添加一个对右键响应的消息处理 OnRButtonDown函数

在OnRButtonDown函数内例子代码:

CMenu menu;

menu.LoadMenu(IDR_MENU1);

CMenu *pPopup=menu.GetSubMenu(0);

pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,

this);

对函数 TrackPopupMenu()说明:

CMenu::BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );

参数:

nFlags 是指一个右键的菜单的弹出方式(包括他与鼠标的位置等,习惯参数为TPM_LEFTALIGN | TPM_RIGHTBUTTON 意思是在鼠标右边向下弹出!)

x,y 是坐标点(注意是屏幕的坐标点而不是客户区的坐标需要使用

void ClientToScreen( LPPOINT lpPoint ) const来转换成客户区!

CWnd* pWnd 是指这个菜单的拥有者使用 this 就可以

lpRect 是点击多大区域有效(NULL)

对ClientToScreen()分析是 CWnd 的成员函数

是将现在的Client 坐标转化为 Screen 坐标!

而 TrackPopupmenu()是使用 Screen 坐标的!

对 Popup 菜单的响应顺序 View -> Frame

技巧:得到父窗口指针使用函数 Cwnd::CWnd* GetParent( ) const;

有关于资源声明成类成员的的另一种发现::

之所以声明资源为类成员是因为当他是局部的变量时在执行完有关函数

后,会被析构(释放空间)而发现了一个大部分资源类都有的函数 Detach() 可以把资源与相关的句柄断开使他不会发生析构动态添加菜单等资源时,必

须这

么使用而不是声明资源为类的成员~;(那就不叫动态了!!)

菜单的动态操作:

有关函数:

在菜单尾部添加

CMenu::BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );

CMenu::BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );

nFlags 是所要添加菜单的种类

nIDNewItem 将会根据 nFlags 的变化而变化

这是一个很复杂的函数在教程里我门使用这个函数:

nFlags 为一个Popup的弹出菜单时 nIDNewItem 是弹出菜单的句柄menu.m_hMenu 但是参数要求是一个

UINT 类型我门需要强制转换一下(原理不祥!)

CMenu::CreatePopupMenu()创建一个空的弹出菜单与菜单资源相关连~

在原有菜单后添加弹出(Popup)菜单的完整代码:

CMenu menu; //先要创建一个新的资源菜单然后使用这个资源加载在原来菜单的后面

menu.CreatePopupMenu();

GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"daigong"); // 这里因为是添加Popup菜单

// 当然指获取菜单的指针就OK

// 而不是子菜单

menu.Detach(); //使用了Detach 不让资源析构

在菜单间插入新的菜单:

函数:CMenu::BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );

nFlags决定了nPosition 的取值(命令or索引号)也控制了插入的形式

AppendMenu()也好 InsertMenu()也好都需要为新的菜单项给定一个 ID号以便用来以后的消息响应!

还有就是对什么形式的菜单操作就获取什么菜单的对象或指针(例:增加Popup菜单需要 GetMenu()

而增加子菜单中的菜单项则需要 GetMenu()->GetSubMenu( nPos )来调用函数)

删除菜单

函数

CMenu::BOOL DeleteMenu( UINT nPosition, UINT nFlags );

同上不用在说了吧 T_T

手动添加消息响应函数(重要哦可以不依赖编译器的方法!!!)

1 先要定义命令的ID 在FileView里头文件 Resource.h 中添加例:

#define IDM_DAIGONG 117

如果原来有ID 那么就不需要添加了;

2 找到相应的头文件(通常是Frame类中因为对是对菜单进行消息响应么!)

找到(一般会在头文件的最后)

protected:

//{{AFX_MSG(CMainFrame)

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

// NOTE - the ClassWizard will add and remove member functions here.

// DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

来添加消息函数原形:afx_msg void OnDaigong();

代码变为:

protected:

//{{AFX_MSG(CMainFrame)

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

// NOTE - the ClassWizard will add and remove member functions here.

// DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG

afx_msg void OnDaigong(); //后来增加的代码

DECLARE_MESSAGE_MAP()

};

3 添加消息映射!

在代码区(.cpp文件)里找到:(通常是在前面)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

//{{AFX_MSG_MAP(CMainFrame)

// NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

添加形式: ON_COMMAND(ID号,命令响应函数名)

这里要说明很多问题!!第1 第二个参数上命令响应函数的名字是没有()

第2 这个声明是结尾没有任何标点符号的(别以为我门写!!)

代码:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

//{{AFX_MSG_MAP(CMainFrame)

// NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE()

//}}AFX_MSG_MAP

ON_COMMAND(ID_EDIT_COPY,OnEDIT_COPY) //后来添加的!可要没有标点哦!END_MESSAGE_MAP()

4 在CPP文件里写函数体

void CMainFrame::OnEDIT_COPY()

{

MessageBox("OK");

}

技巧:如果忘记了怎么写消息映射可以使用ClassWzard 添加一个消息响应函

数用此来引导我门去写

消息响应不过要注意一点!!::在CPP文件中消息映射放到宏外(注意一定要放到宏外面,因为CLASSWIZARD发现菜单删除了,同时要把其宏对里的消息

映射也删除掉的)!

菜单实践:

要求制作一个通讯录在View处添加人名电话并也空格为标实符隔开例:“daigong 123456”

在菜单后动态添加一个菜单 Popup“通讯录”拉开菜单显示 daigong 点击后在View上显示人名和

电话号~

注意:我门的输入是在View中完成的也就是说我门需要在View 中添加对WM_CHAR 消息的OnChar函数对

其响应而我门在OnChar函数体中对菜单栏的操作要注意是谁调用的函数(在View中添加函数当然是View

的菜单栏操作),而我门都知道 View类中不存在菜单(只有Frame中才存在菜单嘛~)所以我门如果直接

添加函数操作不会发生,而需要使用函数 GetParent()来获取View的父窗口(Frame)然后在进行操作,

上面只是问题之一,我门以前的操作都是在 OnCreate中进行的而现在我门把操作放在了 OnChar函数中

有很大的不同由名字我门可以知道 OnCreate 函数是在窗口建立时我门所做的操作,也就是我门的操作

直接会在窗口上造成影响,改变窗口,而我门现在在OnChar中对其操作,操作结束后,不会看到反映(

这是因为Window程序的工作原理所制,Window程序采用窗口重绘因为改变菜单后窗口没有进行重绘我门是

看不到变化的,这里我门使用菜单栏重绘函数(应该会有全部的重绘函数而我门在这里不使用的原因是怕

是在View的上的字符显示消息造成不必要的麻烦)CWnd::DrawMenuBar()(想一想这个函数应该是谁调用

就象我门在刚才所说的如果直接使用这个函数,那么意味着我门是在用View 类来调用这个函数,而View是不存在菜单的!所以我门还是要使用函数GetParent()来找出Frame指针用它来调用DrawMenuBar():)

总之是一句话在使用函数前一定要清楚的判断下究竟是谁调用函数才会用效果~~从而来控制我门想要的结果~!

忽忽全部重绘函数入手! void CWnd:: Invalidate( BOOL bErase = TRUE );

重绘窗口这个函数原理是向系统发出一个WM_PAINT消息那么系统将会调用一次 OnPaint()函数来重新画客户区域~ 当bErase为 TRUE 时什么都不保留而 FALSE 时保留

介绍几个数组集合类 CStringArray,CStringArray,CDWordArray,CPtrArray,CStringArray,CUIntArray,CWordArray (Array的意思对列

数组)

CStringArray为详细介绍;因为这几个类都是表示C 或 C++里的数组的概念(或者说是数据队列吧)

所以成员函数和用法都是一样的 MSDN 也没逐个给出每一个集合类解释(偷懒啊~)这样我门会使用一

个类那么都会了(在学C时我门会了 int a[5];难道还要问 char a[5];怎么用吗呵呵~)

int CStringArray::Add( LPCTSTR newElement ); 增加一个元素到数组CString CStringArray::GetAt( int nIndex ) const; 通过索引号来得到一个数组元素;nIndex索引

编写这个实践程序体会一:我门会在MFC(或是在其他面向对象语言中)使用很多的函数,而我门在使用函数时

通常不会去想,是谁调用这个函数而这个函数又是对谁进行操作(MS是面向过程编程所带来的思想),虽然我

到现在还没有理解MFC的彻底架构思想和运行原理,不过在使用函数问一下自己这个函数是哪个类的成员

会对谁进行操作(好比我门刚学习编程时会问自己这个函数的参数是什么一样重要!)

分析消息映射的路由(路由....就是消息和数据所走的路线)

我门在前面使用MessageBox()函数来验证过了消息处理时的路由:

Frame->View 框架类先给视窗类处理

View 如果不能处理那么在个文档类处理最后再回到 Frame(框架类处理)

如果我门想要直接在框架类中对消息进行响应怎么办:

因为virtual BOOL Cwnd::OnCommand( WPARAM wParam, LPARAM lParam );(就是进行消息处理的那个函数)

是一个虚函数也就是说我门在派生类中覆盖(就是在写一个OnCommand函数的话)我门就可以让他直接在框架

类中对我门的命令进行响应(好象也可以改变他的消息路由人为方式可是没被证明!)

我门在Frame类中添加虚函数,OnCommand( WPARAM wParam, LPARAM

lParam ); 通过MSDN我门知道第一个参数的第一字节数储存了命令ID 这里有俩个函数:

WORD LOWORD( DWORD dwValue ); WORD HIWORD( DWORD dwValue );这俩个函数分别是取低字节序和高字节序;(教程里叫这俩个函数为宏....郁

闷中;他门和函数有什么区别么~?)

我门可以通过解析 wParam 成命令ID 来判断我门想要的操作

教程中所给出的一个东西:只细想一下,我门通过对函数所操作的对象判断有时候需要父窗口指针;

这时我门会使用函数 GetParent() 得到父窗口~ 当我门在父窗口时使用子窗口的数据时我门该怎么办?

使用 GetChild() ?我去MSDN 中查找了一下发现只有一个这个函数,还是API的也就是说 MFC 没有把

这个函数封装在任何一个类中,那么我门就没有办法来获取子类的指针吗?NO!教程中给出了一个在Frame

中获取 View的指针的办法 GetActiveView();查看一下 MSDN 我发现还有GetActiveFrame();~明白了怎么使用~

如果想要不让消息传递下去一顶要return TRUE ;

MS是如果有TRUE就不向下传递这就解释了为什么只要View响应了

Frame就不响应了(MessageBox

那个例子)

孙鑫MFC教程笔记(文本处理)2007-08-11 20:02插入符的创建

void CreatSoildCaret(int 宽度,int 高度);

需要在 OnCreate消息中构造算做一种资源吧~ 在 View 中添加对 OnCreate 消息的响应函数 WM_CREATE 在其中构造初始化为隐藏需要调用 void ShowCaret();

void ShowCaret() 显示插入符 void HideCaret() 隐藏插入符

文本的信息(宽度高度等)

CDC::GetTextMetrics //是CDC的成员函数!!

BOOL GetTextMetrics(LPTEXTMETRICS lpmetrics);//LP是指针的意思!

对 TEXTMETRIC 结构体的内容:

typedef struct tagTEXTMETRIC { /* tm */

int tmHeight; //字体的高度

int tmAscent; //基线以上

int tmDescent; //基线以下

int tmInternalLeading;

int tmExternalLeading;

int tmAveCharWidth;//字体平均宽度

int tmMaxCharWidth;

int tmWeight;

BYTE tmItalic;

BYTE tmUnderlined;

BYTE tmStruckOut;

BYTE tmFirstChar;

BYTE tmLastChar;

BYTE tmDefaultChar;

BYTE tmBreakChar;

BYTE tmPitchAndFamily;

BYTE tmCharSet;

int tmOverhang;

int tmDigitizedAspectX;

int tmDigitizedAspectY;

} TEXTMETRIC;

一般使用参数

CreateSoildCaret(tm.tmAveCharWidth/8,tm.tmHeight)

完整代码

CClientDC dc(this); //注意要使用当前的this指针 dc是要

// 和当前对象有关系的!

TEXTMETRIC tm;

dc.GetTextMetrics(&tm)//参数是取地址的(要求为指针么!)CreateSolidCaret(tm.AveCharWidth/8,tm.tmHeight);

插入Bitmap 的插入符

使用 CreateCaret(CBitmap *pbitmap)

首先要构造个 Bitmap bitmap;(因为是资源一定是全局变量或是类成员) 使用 BitMap 的成员函数

BOOL LoadBitmap( LPCTSTR lpszResourceName );

BOOL LoadBitmap( UINT nIDResource );//ID号!!

代码;

bitmap.LoadBitmap(IDB_BITMAP1);

CreateCaret(&bitmap);

ShowCaret();

有关于 Ondraw函数

窗口从无到有后大小改变时被系统会发送WM_PAIN消息自动调用;

要填加对WM_PAIN的响应!

(要是想要把文字一直保存在窗口上要在 Ondraw函数上操作)

文本的输入

调用 CDC中的Textout成员函数即可;

BOOL TextOut( int x, int y, const CString& str );

代码:

CString str;

str="******";

CDC dc;

dc.TextOut(50,50,str);

有关插入符的移动(根据鼠标点击)

方法很简单添加一个对 WM_LBUTTENDOWN 的消息响应函数

保留点坐标使用成员函数 static void PASCAL SetCaretPos( POINT

point );

对插入符坐标设置;

注意移动后要清空str 和改变 point

对于删除的处理(删除的ASCII码"0x08")

原理是先将原来的字符用背景色显示然后删除一个字符在用正常颜色输出;有关的函数:

GetBkColor( ) 得到背景色 COLORREF GetBkColor( ) const;

virtual COLORREF SetTextColor( COLORREF crColor ); 设置输出文字颜色它的返回值是替换之前的属性(颜色)需要保留时保留在此例中就需要保留

再说以下删除字符时注意的事情因为CString 只对加法的几个运算符重载了没有

减法所以我门不能象增加字符那样处理减少字符;而是使用一个函数

CString Left( int nCount ) const; //是 CString的成员函数(需要使用CString来调用)

nCount 从左边数前 nCount 个字符;而我门想知道一个CString中有多少字符使用函数

int GetLength( ) const; /*是 CString 的成员函数哦*/ 这就可以获得长度 -1 就是删除后长度

返回值是一个CString 保留了这些字符有了这个函数

我门就可以使用如下操作: Str=Str.Left(Str.GetLength()-1);

现实删除的代码:

MFC知识点(自己整理的,只供参考)

知识点:不是很全面,只供参考 第一章 Windows应用程序使用的界面是由各种图形元素组成的图形界面(GUI)。 Windows提供了大量预定义的用C语言编写的函数,这些函数就叫做API(Application Programming Interface)函数。 在Windows应用程序中,存在着许多与DOS应用程序不同的复杂对象,例如窗口、按钮、滚动条等等。Windows把为这种复杂对象所定义的标识叫做句柄。 常用的句柄类型:HWND 窗口句柄,HDC 图形设备环境句柄,HINSTANCE 当前程序应用实例句柄,HBITMAP 位图句柄,HICON 图标句柄,HCURSOR 光标句柄,HBRUSH 画刷句柄,HPEN 画笔句柄,HFONT 字体句柄,HMENU 菜单句柄,HFILE 文件句柄 事件的描述是一个消息 消息的结构: typedef struct tagMSG { HWND hwnd; //产生消息的窗口句柄 UINT message;//消息的标识码 WPARAM wParam;//消息的附加信息1 LPARAM lParam;//消息的附加信息2 DWORD time; //消息进入消息队列的时刻 POINT pt; //表示发送该消息时鼠标的位置 }MSG; 消息循环: while(GetMessage(&msg,NULL,NULL,NULL))//系统处理了消息后返回 { TranslateMessage(&msg);//把键盘消息翻译成字符消息 DispatchMessage(&msg);//把消息派发给Windows系统 创建窗口的三个步骤: 注册窗口类: RegisterClass(&wc); 创建窗口: hwnd=CreateWindow( lpszClassName, "Windows", WS_OVERLAPPEDWINDOW, 120,50,800,600, NULL, NULL, hInstance, NULL); 显示窗口: ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); 大题:用函数封装Windows程序(P16) 第二章

VC 中自己创建对话框方法

VC中自己创建对话框的方法 这里讲在VC中不需要打开MFC工程,通过代码直接创建一个对话框,我看这个对话框比MFC的漂亮多了,而且要写会代码不需要研究MFC就直接开发新的工程. 先打开VC++ 6.0 版本, 第一步:创建一个工程名为:Main Dialog 的Win32 Application。创建过程如下: 打开File菜单中New,选自Win32 Application,工程名为:Main Dialog,点击OK,再选自A simple Win32 application。点击Finish,再点击OK.(见图1) 第二步:创建资源脚本。再打开File菜单中New,选自File选项的Resource Script(就是资源脚本),文件名为Dialog,点击OK。

(见图2) 第三步:插入对话框。刚才建立的脚本Dialog显示为Dialog.rc,就在Dialog.rc上面点击鼠标右键Insert(插入)Resource中选自插入Dialog(对话框),点击New(新建),这样对话框插入完毕。(见图3)

第四步:添加resource.h。我们把第四步插入的对话框ID改为IDD_MAIN ,在FileView中有个Header Files的文件,上面点击右键,选择Add Files to Folder...(添加文件到目录),弹出一个工程目录窗口,中间找到resource.h,然后OK了(添加)。(见图4)

第五步:复制代码。双击Main Dialog.cpp,我们写代码的位置出现了(见图5),那里有几行代码,把它们全部删掉,下面已经准备好的代码全部复制到那里,编译,执行,您的是否成功了? #include "stdafx.h" #include "resource.h" #include BOOL WINAPI Main_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam); BOOL Main_OnInitDialog(HWND hwnd,HWND hwndFocus,LPARAM lParam); void Main_OnCommand(HWND hwnd,int id,HWND hwndCtl,

MFC入门--对话框实例

MFC入门--对话框实例 实例1 目的:设计一个基于对话框的程序,界面上有一个“延迟6秒”的按钮,点击后,程序主窗口在6秒内无法拖动。 关键点:MFC程序入门、线程与进程、消息机制 操作过程: 1-新建项目,选择MFC AppWizard (exe),命名项目为“SingleThread”。如图: (注:关于各项目类型的说明,请参见文件“VC功能简介.ppt”的第8页) 2-选择“Dialog based”,点击Finish,仔细观察项目信息。

3-在资源视图内对主对话框添加静态文本:“我的第一个MFC程序”和“演示耗时的单线程”,继而添加一个按钮,按钮现实文字“延迟6秒”,如图: 4-在资源视图内,双击“延时6秒”按钮,为其添加BN_CLICKED消息(按下按钮时发出的消息)的响应函数OnButton1()。在其中添加代码: Sleep(6000); 请根据老师对程序的讲解,思考如下问题: 1.类的继承:三个的类(CAboutDlg、CSingleThreadApp、CStringThreadDlg) 的继承轨迹是怎样的? 2.程序的入口在哪里?有没有类似Win32 Application中对于WM_CREATE的 处理? 3.三个类的对象的关系。 4.消息如何映射?

设计一个基于对话框的程序,开始运行后,每两秒弹出一个消息框。 关键点:MFC程序入门;定时器的建立、使用与删除;消息映射 操作过程: 1-新建项目,选择MFC AppWizard (exe),命名项目为“Test”。 2-选择“Dialog based”。 3-在BOOL CTestDlg::OnInitDialog()函数中添加 SetTimer(1,2000,NULL); // 启动定时器 4-通过ClassWizard给对话框添加WM_DESTROY的响应函数。如图: 在其中添加代码: KillTimer(1); 5-通过ClassWizard给对话框添加WM_TIMER的响应函数。在其中添加代码: if(nIDEvent==1) { ::MessageBox(0,"嘿嘿","你点啊!!",MB_OK); } 请根据老师对程序的讲解,思考如下问题: 1.MFC下与Win32 Application下定时器的使用有什么不同,又有什么相同之 处?

MFC对话框程序中的各组件常用方法

MFC对话框程序中的各组件常用方法: Static Text: 将ID号改成唯一的一个,如:IDC_XX,然后进一次类向导点确定产生这个ID,之后更改Caption属性: GetDlgItem(IDC_XX)->SetWindowText(L"dsgdhfgdffd"); 设置字体: CFont *pFont = new CFont; pFont->CreatePointFont(120,_T("华文行楷")); GetDlgItem(IDC_XX)->SetFont(pFont); Edit Control: 设置文本: SetDlgItemText(IDC_XX,L"iuewurebfdjf"); 获取所有输入: 建立类向导创建一个成员变量(假设是shuru1,shuru2……)类型选value,变量类型任选。 UpdateData(true); GetDlgItem(IDC_XX)->SetWindowText(shuru1); 第一句更新所有建立了变量的对话框组件,获取输入的值。第二句将前面的IDC_XX的静态文本内容改为shuru1输入的内容。 若类型选用control: 1.设置只读属性: shuru1.SetReadOnly(true); 2.判断edit中光标状态并得到选中内容(richedit同样适用) int nStart, nEnd; CString strTemp; shuru1.GetSel(nStart, nEnd); if(nStart == nEnd) { strTemp.Format(_T(" 光标在%d" ), nStart); AfxMessageBox(strTemp); } else { //得到edit选中的内容 shuru1.GetWindowText(strTemp); strTemp = strTemp.Mid(nStart,nEnd-nStart); AfxMessageBox(strTemp); } 其中nStart和nEnd分别表示光标的起始和终止位置,从0开始。strTemp.Format 方法用于格式化字符串。AfxMessageBox(strTemp)显示一个提示对话框,其内容是字符串strTemp。 strTemp = strTemp.Mid(nStart,nEnd-nStart)返回一个被截取的字符串,从nStart开始,长度为nEnd-nStart。如果nStart == nEnd说明没有选择文本。 注:SetSel(0,-1)表示全选;SetSel(-1,i)表示删除所选。

(适合初学者)MFC基础教程

Visual C++/MFC初学教程 目录 +-- 第一章VC入门 |------ 1.1 如何学好VC |------ 1.2 理解Windows消息机制 |------ 1.3 利用Visual C++/MFC开发Windows程序的优势|------ 1.4 利用MFC进行开发的通用方法介绍 |------ 1.5 MFC中常用类,宏,函数介绍 +-- 第二章图形输出 |------ 2.1 和GUI有关的各种对象 |------ 2.2 在窗口中输出文字 |------ 2.3 使用点,刷子,笔进行绘图 |------ 2.4 在窗口中绘制设备相关位图,图标,设备无关位图|------ 2.5 使用各种映射方式 |------ 2.6 多边形和剪贴区域 +-- 第三章文档视结构 |------ 3.1 文档视图框架窗口间的关系和消息传送规律 |------ 3.2 接收用户输入 |------ 3.3 使用菜单

|------ 3.4 文档,视,框架之间相互作用 |------ 3.5 利用序列化进行文件读写 |------ 3.6 MFC中所提供的各种视类介绍 +-- 第四章窗口控件 |------ 4.1 Button |------ 4.2 Static Box |------ 4.3 Edit Box |------ 4.4 Scroll Bar |------ 4.5 List Box/Check List Box |------ 4.6 Combo Box/Combo Box Ex |------ 4.7 Tree Ctrl |------ 4.8 List Ctrl |------ 4.9 Tab Ctrl |------ 4.A Tool Bar |------ 4.B Status Bar |------ 4.C Dialog Bar |------ 4.D 利用AppWizard创建并使用ToolBar StatusBar Dialog Bar |------ 4.E General Window |------ 4.F 关于WM_NOTIFY的使用方法 +-- 第五章对话框 |------ 5.1 使用资源编辑器编辑对话框 |------ 5.2 创建有模式对话框

Visual C++基于对话框的MFC应用程序---简单的时钟实例实验一

1.1 创建对话框的应用程序 1.使用AppWizard创建应用程序框架 首先,创建一个对话框应用程序,其工程文件名为:ch1.dsp。具体步骤如下: (1)启动Visual C++ 6.0,在File菜单中选择new菜单项;(2)在new对话框的Project页中选择 MFC AppWizard(exe)选项,在Project name框中输入:ch1,并在Location 框中指定希望的目录路径,编译系统生成的各种文件将会存放在该目录下,然后点击[OK]按钮 (3)MFC AppWizard-Step1 中选择Dialog based 选项,MFC AppWizard-Step2 到MFC AppWizard-Step4中取默认选项;(4)进入VC对话框设计界面后,选中 [TODO:在这里设置对话控制。]静态框并按del键删除该框,选中[取消]按钮并按del键删除该按钮; (5)将[确认]按钮拖曳到对话框的下方中间。生成的对话框设计窗口(如图1-1所示)。 图1-1

2.向类中添加系统消息响应函数 Windows应用程序的采用事件触发、消息驱动机制和大量的消息响应函数构成了应用程序的主体。本示例需要用到两个消息响应函数OnCtlColor()和OnTimer(),前者响应窗口消息:WM_CTLCOLOR,后者响应窗口消息:WM_TIMER。关于这两个函数的功能和用法暂且略过,留待后面小节再叙。这里先介绍响应函数加载的方法。 在CCh1Dlg类中添加OnCtlColor( )函数的操作方法如下:(1)打开类向导(MFC ClassWizard)窗口,选择Message Maps 页; (2)选择工程、类和对象标识。在Message Maps页的Project、Class name、Object Ids框中 分别选择:ch1、CCh1Dlg、CCh1Dlg; (3)添加响应函数。在Message Maps页的Messages框中选中并双击窗口消息:WM_CTLCOLOR,此时,消息WM_CTLCOLOR 的响应函数OnCtlColor( )被添加到类向导底部Member Functions框中。 注意,添加OnTimer( )函数的过程与上述过程相似,只是第(3)步选择WM_TIMER消息,而不是WM_CTLCOLOR。 添加完毕后,按[OK]按钮退出类向导。回到项目工作区,在项目工作区窗口展开CCh1Dlg类,可以看到类中添加了OnCtlColor( )和OnTimer( )两个消息响应函数。

MFC对话框向主窗体传递消息机制

对话框向主窗体传递消息,在视图中显示 现举例说明对话框向主窗体传递消息,以及主窗体响应消息的过程。我们拿单文档来说明,我们要实现下列功能:通过对话框,在文本框中输入字符串,在视图中显示刚才输入的字符串。 1、在应用程序向导中选择单个文档,然后完成。我这里的项目名称为mybook 2、在资源视图中,插入一对话框,对话框名称为dlg_wzm。 3、在刚才生成的对话框中插入一文本框,设置好相应的类和变量。为确认按钮生成响应函数。同时在mybook.cpp的BOOL CMyBookApp::InitInstance()函数中让该对话框启动,也就是加入CDlg_wzm dlg; dlg.DoModal();两行程序,当然在前面的要加入#include "dlg_wzm.h"。(详细过程略) 4、下面重点在于点击该对话框的确认按钮向主窗体发送消息。要现定义一个消息名称。

在stdafx.h文件中加入一行: #define WM_MYMESSAGE WM_USER+100 5、在CMainFrame的pulic申明中加入一变量CString wzmstr。目的是为了保存对话框中的字符串的值。在对话框的Onok()函数中: void CDlg_wzm::OnOK() { // TODO: Add extra validation here this->UpdateData(true); CMainFrame* pWnd=(CMainFrame*)AfxGetMainWnd(); //得到父窗体的指针 pWnd->wzmstr=this->m_input_edit; ASSERT(pWnd!=NULL); ::SendMessage(pWnd->GetSafeHwnd(), WM_MYMESSAGE,0,0); //发送消息 //注意WM_MYMESSAGE就是我们前面定义的消息。 //CDialog::OnOK(); } 6、下面我们看看主窗体怎么接受消息。我们要在主窗体中设置消息映射。 在mainfrm.h的protected声明中: afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam); 在mainfrm.cpp文件中, BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() ON_MESSAGE(WM_MYMESSAGE,OnMyMessage) //这里是我们加入的。 //}}AFX_MSG_MAP END_MESSAGE_MAP() 然后在mainfrm.cpp的文件最下面加入一个函数: void CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam) { CView *pView=this->GetActiveView(); //得到视图指针 if(pView)

在VC对话框中实现打印和打印预览

在VC对话框中实现打印和打印预览(附实现步骤) 时间:2008-01-27作者:佚名 在一般的软件开发中打印和打印预览是经常要用到的功能,对于VC6.0中的文档/视图(Doc/View)框架,可以很方便的使用缺省的打印和打印预览。但是,如果应用程序是基于对话框的就没有办法利用这种便利。而很多情况下,基于对话框的程序也需要打印和打印预览功能。那该怎么办呢?这正是本文将要解决的问题。 1实现打印 在对话框应用程序中不具备MFC的视和框架交互,要想实现打印和打印预览必须直接获取打印机的设备环境句柄,这时可以设置CPringDialog类中的构造函数的参数,获取打印机的设备环境句柄。利用这个句柄,转换为指针,则按打印流程实现打印任务。 (1)从CFrameWnd类派生出主窗口类CMyFrameWnd加入项目,这个类将作为控制类来实现程序的打印和打印预。 (2)在CMyFrameWnd中加入打印和打印预览相关的函数,为了方便起见,名字和CView视图类中缺省的打印和打印预览虚函数名相同。但这些函数是以成员函数的形式加入的,而不是重载。这里主要介绍Print和OnPrint函数。 Print函数是打印控制函数,由它来弹出打印对话框,取得用户设置信息,如打印机、纸张大小等。还有建立一个打印机DC和设置DOCINFO 结构,该结构包含输入输出文件名及其它一些信息,StartDoc函数要该结构作参数。还要设置打印区域,调用打印函数等 void CMyFrameWnd::Print() { CDC dc; CPrintDialog printDlg(FALSE); if (printDlg.DoModal() != IDOK) //弹出打印对话框,取得用户设置参数 return; dc.Attach(printDlg.GetPrinterDC());

MFC编程基础教程

第1章基于对话框的Windows应用程序 1.简介Windows编程的两种方法,即Windows API编程和MFC编程。 2.基于对话框的应用程序的创建过程: ?建立基于对话框的MFC 应用程序框架; ?放置控件; ?设置控件属性; ?为控件连接变量,即为控件命名; ?添加并且编写消息处理函数。 3.常用基本控件: ?静态文本框:主要用来显示文本信息,不能接受用户输入 ?命令按钮:是最常见的、应用最广泛的一种控件。在程序执行期间,当单击某个命令按钮后就会执行相应的消息处理函数。 ?编辑框:是一个文本编辑区域,用户可以在该区域输入、编辑和显示正文内容。 ?框架:将一组相关的控件框起来,达到标识一组控件的作用。 ?单选按钮:用户在一组单选按钮中最多只能选择一项。当某一项被选定后,其他选项自动变成未选状态。 ?复选框:列出了可供选择的项,用户可根据需要选择其中的一项或多项,各选项之间的状态互不相关。 ?列表框:通过显示多个选项,供用户选择,达到与用户对话的目的。 ?组合框:组合了编辑框和列表框的特性而形成的一种控件。在列表框中列出可供用户选择的项,当用户选定某项后,该项内容自动装入编辑框中。 ?滚动条:通常附在对话框上用来协助观察数据或确定位置,也可以用来作为数据输入的工具。 1.1 Windows编程基础 Windows 应用程序的主要特点是: ?具有标准的图形用户界面。 ?具有与硬件无关的特性。 ?采用“消息传递,事件驱动”的运行机制。 用Visual C++ 编写Windows 应用程序主要有两种方法:一是使用Windows 提供的应用程序接口(Application Programming Interface ,API )函数;二是使用Microsoft 提供的微软基础类(Microsoft Foundation Class ,MFC )。

基于MFC对话框的报表打印和预览功能(推荐文档)

基于MFC对话框的报表打印和预览功能 第一步:在工程中加入实现打印功能的四个文件PrintFrame.h, PringtView.h,PrintFrame.cpp, PrintView.cpp CPrintFrame和CPrintView类是两个个可重用的类,开发者只需要把这两个类对应的四个文件拷贝到工程文件所在目录中(PrintFrame.h, PringtView.h,PrintFrame.cpp, PrintView.cpp),并将这四个文件加入工程,并在需要执行打印功能的代码处加入 #include "PrintFrame.h" #include "PrintView.h" 第二步:添加三个消息响应函数来执行该功能 ON_MESSAGE(WM_BEGIN_PRINTING,OnBeginPrinting) ON_MESSAGE(WM_END_PRINTING,OnEndPrinting) ON_MESSAGE(WM_MY_PRINT,OnMyPrint) 这三个消息响应函数放在.cpp文件的BEGIN_MESSAGE_MAP(CReportDlg, CDialog)与END_MESSAGE_MAP()之间,如下:BEGIN_MESSAGE_MAP(CReportDlg, CDialog) //{{AFX_MSG_MAP(CReportDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_MESSAGE(WM_BEGIN_PRINTING,OnBeginPrinting) ON_MESSAGE(WM_END_PRINTING,OnEndPrinting) ON_MESSAGE(WM_MY_PRINT,OnMyPrint) ON_BN_CLICKED(IDC_BUTTON2, OnButton2) //}}AFX_MSG_MAP END_MESSAGE_MAP() 其中OnMyPrint是跟具体要打印什么内容有关的开发人员要重点完成的代码,可以打印表格,图片,数据,只要GDI绘图可以进行的操作在这里都可以完成。由于打印预览的一部分工作在CView类里完成,因此在用户程序中只需要相应 WM_MY_PRINT消息就可以执行打印预览的功能,而不需要另外编写打印预览代码。 第三步: 建立一个CPrintFrame的对象,设该对象的指针为pFrame,并将对话框的指针传给该对象的m_pCallerDlg,即pFrame->m_pCallerDlg = this;

创建基于对话框的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中在一个对话框中弹出另一个对话框

在一个对话框中点按一个按钮弹出另外一个对话框。 弹出的对话框可以是模态和非模态两种,简单点讲,模态对话框就是在弹出的对话框没有关闭之前,是不能操作父对话框的。非模态可以。 这里介绍建立模态对话框。 在建立的时候可以有两种形式,一种是直接新建,一种是将已有的对话框整合添加进来。 (我是在WinCE平台下。也是类似MFC的) 第一种方式:新建弹窗 操作步骤 首先按步骤建立一个简单的对话框,并添加按钮。 然后点击Dialog 添加资源 选择Dialog 新建

此时会出现新建好的对话框,右击选择属性可以修改名称。 设计新建的对话框 在对话框上右击选择添加类

填写类名称,点击完成 此时在解决方案资源管理器视图中就会有新建的类,源文件及头文件

将这个头文件包含到主对话框的头文件中。 然后就是调用关系的产生, 双击主窗口在中的按钮,添加相应的处理函数 此时调试运行,点“刀”按钮,就会弹出设计好的刀的对话框。 当然,刀对话框中的设计就是走原来熟悉的路了。 另外一个键“剑” 也是同样的步骤。 这样弹出的对话框有个问题,就是感觉弹出的对话框缩放了,字体变小了。在对话框上右击选择属性就可以看见设置字体的选项了,修改字体即可。

下来介绍第二种方式,添加现有的窗口。第一步:同样按部就班的建立好基本工程。编译一下(F7) 第二步:拷贝文件 首先在当前工程目录下新建一个文件夹用来存放原有工程源码

需要拷贝下面选中的这几个文件。拷贝到新建的这个文件夹下。由于现有工程中有resource.h文件,所以需要提前改一下名称,相应的WifiConfig.rc文件中有调用到这个文件,所以也要修改。用记事本打开.rc文件,将#include“Resource.h” 改为#include “Resource_2.h”(如果是准备新建文件夹来组织代码的话就可以不用改。就像下面这样,其实可以不用改)将这几个文件拷贝到新建的文件夹下。 还需要将原有工程res目录下的图标拷贝到现在工程的res目录下 第三步:添加文件到工程 首先是资源文件添加 现有项,找到WiFI2Uart目录下的.rc文件。确定。

简易MFC对话框程序设计教程

简易MFC对话框程序设计教程 天津大学仁爱学院信息系杨晓龙 我们之前所学习的C语言是一种面向过程的语言,重点在于程序或算法执行过程,提供那些过程才能实现程序,每一个操作都由我们自己完成。C++是一种面向对象的语言。对象是一个封装体,是一个实例,它里面不仅封装了程序运行时所需变量,更重要的是它还封装了程序运行所需操作即函数,其实真正定义它们的是一种叫“类”的数据结构,不过要引用里面的数据和操作必须通过类所定义的对象。这样做的好处是可以把经常使用的,属于同一类型的数据和操作包含在类当中,在编程时通过该类所实例化的对象调用它们(对象避免了重复,而且对象可以代表一种变量、一个实例或某个控件),简化了代码,提高了代码的复用性,增强了程序的可移植性,降低了错误发生率,摆脱了每次编写程序都要编写大量代码的麻烦。MFC(Microsoft Foundation Class)是微软提供给编程者的基础类库,它里面包含了创建对话框程序所需的各种类,在向导的帮助下,它会自动生成一些代码,我们只需调用它里面的少量成员函数便可完成对话框的创建和对话框程序的编程,如果让我们自己编写将是浩大而艰难的工程。MFC将常用的几乎所有的有关对话框的函数和变量封装起来,使我们避免了编写复杂而且重复的代码。 用C语言所编写的程序是DOS程序,只能在黑乎乎的DOS界面下运行,但C语言是C++的基础,而C++又是MFC的基础,用MFC编写的是windows应用程序有对话框,所以要回MFC 编程得先学C语言和C++才能学MFC。以下将以编写求三角形面积的程序为例说明简单MFC 程序的制作方法。 打开vc6.0,文件—新建—选择MFC AppWizard(exe),工程名称“三角形面积计算器”—确定—选择“基本对话框”,此时即可点“完成”,也可点下一步,直到出现询问“您希望使用MFC库吗?”若选择“作为共享的DLL”,则程序在未安装vc6.0的电脑上无法运行;若选择“作为静态的DLL”,则程序在未安装vc6.0的电脑上也能运行。此后一直点确定即可。 点击“完成”后出现由向导创建的基本对话框,在对话框上点右键—属性,可更改对话框标题和字体。在右侧选择组件,先插入三个编辑框作为三角形三边长,在插入一按钮发出计算命令,然后再插入一编辑框作为面积输出。在每一个编辑框旁配上静态文本说明,修改按钮标题。在vc6.0左侧的资源视图中选中关于对话框,可修改版本信息。至此对话框主体设计完成。 以下是程序最关键的部分。我们拥有C语言的基础,用C语言编写三角形面积代码(算法)不是问题,问题在于如何将编辑框中输入的数据传给算法中的变量以及如何使计算完成的结果输出到编辑框。实现这一数据交换(传输)有七中方法,其中最简单、最直观、最实用的方法是将编辑框与算法中的变量其的关联。步骤如下:选中对应编辑框,右键选择建立类向导,选择“Member Variables(成员变量)”选项卡,选择要关联变量的控件ID号,再点击“Add Variable(添加变量)”,设定变量名如“m_sizeA”,在Variable Type(变量类型)中选择float(不同程序视所需变量类型确定),OK。同样方法,将其他两边和面积分别关联变量。这样就使编辑框分别与各变量取得了关联,以后可认为编辑框和变量是一样的,对变量的任何操作都会反映到编辑框中,接下来我们就可以像编C程序一样编写代码了。可是代码应该写在什么地方呢,程序在什么时候执行呢?我们的目的是在按下计算按钮后程序执行,所以还需对按钮进行设定,让按钮被按下后执行程序。这个过程被称作消息捕获,操作系统捕获到“点击”的消息后将信息传给应用程序,应用程序便转入执行算法。在按钮上点击右键,选择“建立类向导”,选择“Message Maps(消息地图)”选项卡,选中按钮ID号,在“Messages(消息)”中选中“BN_CLICKED(按钮单击)”消息响应方式(因为按钮可以有单击、双击、移动等多种操作,所以对应有多种消息响应方式,即选择:当对按钮执行怎样的操作后执行消息响应函数),然后点击“Add Function(添加消息响应函数)”添加响应消息的函数或操作,也就是指当按钮被按下后要做什么,在弹出的对话框中可以更改函数名,确定后点击“Edit Code(编辑代码)”便自动转入消息响应函数中,我们就可以在这里写我们的算法代码了。代码如下:

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_PWD 7、在对话框上的任何空白的地方右键单击,点击建立类向导。

然后弹出 选择建立Create a new class,点击OK。 这是为这个对话框创建一个新的类。在Name中,为该对话框类取个名字:CDlg_login。下面的Base class以及Dialog ID不要随便改动。然后点击OK。这样新的类CDlg_login就与本对话框建立起了联系。

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

MFC对话框和对话框类几个对话框程序例子建立对话框与相应的程序相关联如何建立对话框与相应的程序相关联: 在MFC中,对资源的操作都是建立相关的类来完成的; 所以我门先NEW 一个对话框资源然后建立他的类与相应的应用程序相关联就可以; 步骤: 1 NEW 一个对话框资源 2 在资源上选择 Classwarrzd上创建一个新的类(或在资源上双击左键) 3 起名字!(注意文件名将会去掉C 例如我门的名字叫 CDaiDlg那么文件名是 DaiDlg); 对话框的俩种类型: 1 模态对话框(特性:当建立模态对话框时,将不允许用户点击对话框以外的控件后应用程序本身,也就是说当模态对话框建立时应用程序停止运行而只运行对话框,所以模态对话框是可以使用局部变量的定义方法的!) 模态对话框是比较方便的一种对话框~建立函数: int CDialog::DoMadol() //注意他是CDialog类成员也就是说想使用先建立一个 CDialog 对象吧 如果我门想要在View类中建立一个 CDialog对象不要忘了要在View的Cpp 文件中包含 CDialog.h 2 非模态对话框(特性与模态的相反) 使用成员函数 BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL ); nIDTemplate 为对话框的ID号 pParentWnd 拥有这个对话框的对象指针,如果是NULL 为默认的主应用窗口也就是 Frame应用窗口 注意如果我门在使用Create创建非模态对话框时要调用一个函数来显示这个对话框 CWnd::ShowWindow(SW_SHOW);不仅这样非模态对话框时不能是局部变量!

(完整word版)MFC可收对话框实现

MFC可收缩对话框实现 1可收缩对话框使用 可使用窗口的SetWindowPos()函数,下面重点介绍一下这个函数及具体实现过程。 1.1S etWind owPos函数说明 BOOL SetWindowPos(HWND hWndlnsertAfter, int X,int Y,int cX,int cY,UNIT Flags): 1.1.1hWndInsertAfter 此句柄用于控制对话框在Z轴上的显示顺序,它可以是以下值: ?一个窗口句柄:则对话框会显示在此窗口的下一层; ?HWND_BOTTOM:将窗口置于Z序的底部; ?HWND_DOTTOPMOST:将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后);?HWND_TOP:将窗口置于Z序的顶部。 ?HWND_TOPMOST:将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。 1.1.2X、Y 相对以客户坐标指定窗口新位置的左边界、上边界;注意,这个X、Y是相对于调整之前窗口的左上角坐标而言的,即(0, 0)表示左上角不变。 1.1.3cX、cY 指定调整后新窗口的宽度和高度;

1.1.4Flags 指定窗口尺寸和定位的标志。它可能为以下值: ?SWP_ASNCWINDOWPOS:如果调用进程不拥有窗口,系统会向拥有窗口的线程发出需求。这就防止调用线程在其他线程处理需求的时候发生死锁。 ?SWP_DEFERERASE:防止产生WM_SYNCPAINT消息。 ?SWP_DRAWFRAME:在窗口周围画一个边框(定义在窗口类描述中)。 ?SWP_FRAMECHANGED:给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送该消息。如果未指定这个标志,只有在改变了窗口尺寸时才发送WM_NCCALCSIZE。 ?SWP_HIDEWINDOW:隐藏窗口。 ?SWP_NOACTIV A TE:不激活窗口。如果未设置标志,则窗口被激活,并被设置到其他最高级窗口或非最高级组的顶部(根据参数hWndlnsertAfter设置)。 ?SWP_NOCOPYBITS:清除客户区的所有内容。如果未设置该标志,客户区的有效内容被保存并且在窗口尺寸更新和重定位后拷贝回客户区。 ?SWP_NOMOVE:维持当前位置(忽略X和Y参数)。 ?SWP_NOOWNERZORDER:不改变z序中的所有者窗口的位置。 ?SWP_NOREDRAW:不重画改变的内容。如果设置了这个标志,则不发生任何重画动作。适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动而露出的父窗口的所有部分。如果设置了这个标志,应用程序必须明确地使窗口无效并区重画窗口的任何部分和父窗口需要重画的部分。 ?SWP_NOREPOSITION:与SWP_NOOWNERZORDER标志相同。 ?SWP_NOSENDCHANGING:防止窗口接收WM_WINDOWPOSCHANGING消息。?SWP_NOSIZE:维持当前尺寸(忽略cx和Cy参数)。 ?SWP_NOZORDER:维持当前Z序(忽略hWndlnsertAfter参数)。 ?SWP_SHOWWINDOW:显示窗口。 对于对话框程序,通常只用设置为:SWP_NOZORDER|SWP_NOMOVE,即保持左上角坐标不变,且保持Z轴顺序不变。

mfc单文档插入对话框

2012/7/18 1.新建一个mfc单文档工程Test. 2.在资源视图中,dialog处右键insert dialog. 3.在新建的dialog上右击,属性-style-child,对话框上双击,新建类 name CCdialod,选择base class为cformview. 4.在cmainframe类上添加变量CSplitterWnd m_wndSplitter选为 protected. 5.classwizard在cmainframe中重载OnCreateClient函数 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { m_wndSplitter.CreateStatic(this,1,2); m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTestView), CSize(1100, 0), pContext); //CMy039View是视图类 m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CCdialod), CSize(0, 0), pContext); //LDLG是对话框类 SetActiveView((CTestView*)m_wndSplitter.GetPane(0, 0)); //指定类视图 return true; } 6.在TestView.h中添加头文件 #include "TestDoc.h" 7.在mainframe.h中添加 #include "TestView.h" #include "Cdialod.h"

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_PWD 7、在对话框上的任何空白的地方右键单击,点击建立类向导。

然后弹出 选择建立Create a new class,点击OK。 这是为这个对话框创建一个新的类。在Name中,为该对话框类取个名字:CDlg_login。下面的Base class以及Dialog ID不要随便改动。然后点击OK。这样新的类CDlg_login就与本对话框建立起了联系。

相关文档
相关文档 最新文档