好文档 - 专业文书写作范文服务资料分享网站

Visual_C++MFC入门教程(免费版)

天下 分享 时间: 加入收藏 我要投稿 点赞

木有页眉

afx_msg void OnGetMinMaxInfo( MINMAXINFO FAR* lpMMI );需要得到窗口尺寸时被调用 afx_msg void OnSize( UINT nType, int cx, int cy );窗口改变大小后被调用 afx_msg void OnMove( int x, int y );窗口被移动后时被调用

afx_msg void OnPaint( );窗口需要重绘时时被调用,你可以填如绘图代码,对于视图类不需要重载OnPaint,所有绘图代码应该在OnDraw中进行

afx_msg void OnChar( UINT nChar, UINT nRepCnt, UINT nFlags );接收到字符输入时被调用

afx_msg void OnKeyDown/OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags );键盘上键被按下/放开时被调用

afx_msg void OnLButtonDown/OnRButtonDown( UINT nFlags, CPoint point );鼠标左/右键按下时被调用

afx_msg void OnLButtonUp/OnRButtonUp( UINT nFlags, CPoint point );鼠标左/右键放开时被调用 afx_msg void OnLButtonDblClk/OnRButtonDblClk( UINT nFlags, CPoint point );鼠标左/右键双击时被调用

afx_msg void OnMouseMove( UINT nFlags, CPoint point );鼠标在窗口上移动时被调用

4.F 关于WM_NOTIFY的使用方法

WM_NOTIF在WIN32中得到大量的应用,同时也是随着CommControl的出现WM_NOTIFY成为了CommControl的基本消息。可以这样说CommControl的所有的新增特性都通过WM_NOTIFY来表达。同时WM_NOTIFY也为CommControl的操作带来了一致性。

WM_NOTIFY消息中的参数如下: idCtrl = (int) wParam;

pnmh = (LPNMHDR) lParam; 其中lParam为一个

typedef struct tagNMHDR {

HWND hwndFrom; UINT idFrom; UINT code;

} NMHDR; 结构指针

从消息的参数我们已经可以分辩出消息的来源,但是这些信息还不足以分辩出消息的具体含义。所以我们需要更多的数据来得到更多的信息。MS的做法是对每种不同用途的通知消息都定义另一种结构来表示,同时这中结构里包含了struct tagNMHDR,所以你只要进行一下类型转换就可以得到数据指针。例如对于LVN_COLUMNCLICK消息(用于在ListCtrl的列表头有鼠标点击是进行通知),结构为; typedef struct tagNMLISTVIEW{ NMHDR hdr; int iItem; int iSubItem; UINT uNewState; UINT uOldState; UINT uChanged; POINT ptAction; LPARAM lParam;

} NMLISTVIEW, FAR *LPNMLISTVIEW;

51

木有页眉

在这个结构的最开始也就包含了struct tagNMHDR,所以在不损失数据和产生错误的情况下向处理消息的进程提供了更多的信息。

此外通过WM_NOTIFY我们可以一种完全一样的方式进行消息映射,如同在前几章中所见到的一样。 使用如下形式:ON_NOTIFY( wNotifyCode, id, memberFxn )。

处理函数也有统一的原型:afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result ); 在MFC消息映射的内部将根据定义消息映射时所使用的wNotifyCode和WM_NOTIFY中参数中pnmh->code(pnmh = (LPNMHDR) lParam)进行匹配,然后调用相应的处理函数。

还有一点是利用WM_NOTIFY/ON_NOTIFY_REFLECT可以在窗口内部处理一些消息,从而建立可重用的控件。

第五章 对话框 5.1 使用资源编辑器编辑对话框

在Windows开发中弹出对话框是一种常用的输入/输出手段,同时编辑好的对话框可以保存在资源文件中。Visual C++提供了对话框编辑工具,利用编辑工具可以方便的添加各种控件到对话框中,而且利用ClassWizard可以方便的生成新的对话框类和映射消息。

首先资源列表中按下右键,可以在弹出菜单中选择“插入对话框”,如图1。

图1

然后再打开该对话框进行编辑,你会在屏幕上看到一个控件板,如图2。

图2

你可以将所需要添加的控件拖到对话框上,或是先选中后再在对话框上用鼠标画出所占的区域。

52

木有页眉

接下来我们在对话框上产生一个输入框,和一个用于显示图标的图片框。之后我们使用鼠标右键单击产生的控件并选择其属性,如图3。

图3

我们可以在属性对话框中编辑控件的属性同时也需要指定控件ID,如图4,如果在选择对话框本身的属性那么你可以选择对话框的一些属性,包括字体,外观,是否有系统菜单等等。

图4

最后我们编辑图片控件的属性,如图5,我们设置控件的属性为显示图标并指明一个图标ID。

图5

53

木有页眉

接下来我们添加一些其他的控件,最后的效果如图6。

图6

按下Ctrl-T可以测试该对话框。此外在对话框中还有一个有用的特性,就是可以利用Tab键让输入焦点在各个控件间移动,要达到这一点首先需要为控件设置在Tab键按下时可以接受焦点移动的属性Tab Stop,如果某一个控件不打算利用这一特性,你需要清除这一属性。然后从菜单“Layout”选择Tab Order来确定焦点移动顺序,如图7。

图7

使用鼠标依此点击控件就可以重新规定焦点移动次序。最后按下Ctrl-T进行测试。

最后我们需要为对话框产生新的类,ClassWizard可以替我们完成大部分的工作,我们只需要填写几个参数就可以了。在编辑好的对话框上双击,然后系统回询问是否添加新的对话框,选择是并在接下来的对话框中输入类名就可以了。ClassWizard会为你产生所需要的头文件和CPP文件。然后在需要使用的地方包含相应的头文件,对于有模式对话框使用DoModal()产生,对于无模式对话框使用Create()产生。相关代码如下:

void CMy51_s1View::OnCreateDlg() {//产生无模式对话框

CTestDlg *dlg=new CTestDlg; dlg->Create(IDD_TEST_DLG);

54

木有页眉

dlg->ShowWindow(SW_SHOW); }

void CMy51_s1View::OnDoModal() {//产生有模式对话框 CTestDlg dlg; int iRet=dlg.DoModal(); TRACE(\}

下载例子。如果你在调试这个程序时你会发现程序在退出后会有内存泄漏,这是因为我没有释放无模式对话框所使用的内存,这一问题会在以后的章节5.3 创建无模式对话框中专门讲述。

关于在使用对话框时Enter键和Escape键的处理:在使用对话框是你会发现当你按下Enter键或Escape键都会退出对话框,这是因为Enter键会引起CDialog::OnOK()的调用,而Escape键会引起

CDialog::OnCancel()的调用。而这两个调用都会引起对话框的退出。在MFC中这两个成员函数都是虚拟函数,所以我们需要进行重载,如果我们不希望退出对话框那么我们可以在函数中什么都不做,如果需要进行检查则可以添加检查代码,然后调用父类的OnOK()或OnCancel()。相关代码如下: void CTestDlg::OnOK() { AfxMessageBox(\你选择确定\ CDialog::OnOK(); }

void CTestDlg::OnCancel() { AfxMessageBox(\你选择取消\ CDialog::OnCancel(); }

5.2 创建有模式对话框

使用有模式对话框时在对话框弹出后调用函数不会立即返回,而是等到对话框销毁后才会返回(请注意在对话框弹出后其他窗口的消息依然会被传递)。所以在使用对话框时其他窗口都不能接收用户输入。创建有模式对话框的方法是调用CDialog::DoModal()。下面的代码演示了这种用法:

CYourView::OnOpenDlg() { CYourDlg dlg; int iRet=dlg.DoModal(); }

CDialog::DoModal()的返回值为IDOK,IDCANCEL。表明操作者在对话框上选择“确认”或是“取消”。由于在对话框销毁前DoModal不会返回,所以可以使用局部变量来引用对象。在退出函数体后对象同时也会被销毁。而对于无模式对话框则不能这样使用,下节5.3 创建无模式对话框中会详细讲解。

你需要根据DoModal()的返回值来决定你下一步的动作,而得到返回值也是使用有模式对话框的一个很大原因。

55

Visual_C++MFC入门教程(免费版)

木有页眉afx_msgvoidOnGetMinMaxInfo(MINMAXINFOFAR*lpMMI);需要得到窗口尺寸时被调用afx_msgvoidOnSize(UINTnType,intcx,intcy);窗口改变大小后被调用afx_msgvoidOnMove(intx,inty);窗口被移动后时被调用
推荐度:
点击下载文档文档为doc格式
5sv4n9qpyw5s23r4ajle
领取福利

微信扫码领取福利

微信扫码分享