2.13k likes | 2.37k Views
第十一章 Windows 编程. Windows 编程的基本思想. MFC 概述. 典型的 Windows 程序设计. C. C. C. C. C. + +. + +. + +. + +. + +. Windows 编程. Windows 程序的特点:. 界面风格统一,便于用户掌握应用程序. 采用事件和消息机制(消息驱动). 可视化的开发工具使界面生成简单、美观统一,减少开发者劳动量. 提供丰富的程序员接口函数( API ). 面向对象的开发模式. 窗 口. 窗口是 Windows 应用程序的基本的操作单
E N D
第十一章 Windows编程 • Windows编程的基本思想 • MFC概述 • 典型的Windows程序设计
C C C C C + + + + + + + + + + Windows编程 Windows 程序的特点: 界面风格统一,便于用户掌握应用程序 采用事件和消息机制(消息驱动) 可视化的开发工具使界面生成简单、美观统一,减少开发者劳动量 提供丰富的程序员接口函数(API) 面向对象的开发模式
窗 口 窗口是Windows应用程序的基本的操作单 元,是应用程序与用户之间交互的接口环境, 也是系统管理应用程序的基本单位。 最小化 最大化 关闭 菜单栏 标题栏 工具栏 地址栏 垂直滚动条 可调边框 工作区 状态栏 水平滚动条
窗 口 窗口是Windows应用程序的基本的操作单 元,是应用程序与用户之间交互的接口环境, 也是系统管理应用程序的基本单位。
消息驱动——程序设计思想 Windows编程是围绕事件或消息的产生驱动运行处理函数的。消息是描述事件发生的信息。 在消息驱动的程序结构中,程序的控制流程不再由事件的预定顺序来决定,而是由实际运行时各种事件的实际发生来触发,而事件的发生可能是随机的、不确定的,并没有预定的顺序。 消息驱动是一种面向用户的程序设计方法,在程序设计过程中除了完成所需要的程序功能外,更多考虑了用户可能的各种输入,并有针对性地设计相应的处理程序。 消息驱动程序设计思想也是一种“被动”式的程序设计方法,程序开始运行时,处于等待消息状态,然后取得消息并对消息作出相应的反应,处理完毕后又返回处于等待消息状态。
息 消 消息 消息驱动——程序设计思想
应用程序 Windows 消息队列 键盘消息鼠标消息其他消息 取消息 处理消息 消息驱动——程序设计思想 消息驱动程序的工作流程
消息的来源 C + + Windows应用程序的消息 1、输入消息:包括键盘和鼠标的输入。这一类消息首先放在系统消息队列中,然后由Windows将它们送入应用程序队列中,由应用程序来处理消息。 2、控制消息:用来与Windows的控制对象,如列表框、按钮、检查框等进行双向通信。 3、系统消息:对程序化的事件或系统时钟中断作出反应。 4、用户消息:这是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。
C + + Windows应用程序的消息 消息的组成 在windows程序中,消息是由MSG结构体来表示的。 typedef struct tagMSG { // msg HWND hwnd; //消息所属窗口 UINT message; //消息的标识符 WPARAM wParam; //消息的附加信息 LPARAM lParam; //同上 DWORD time; //消息投递时间 POINT pt; //鼠标当前位置 } MSG;
C C C C C + + + + + + + + + + Windows常用消息 窗口消息 WM_CREATE,WM_DESTROY,WM_CLOSE, WM_MOVE , WM_SIZE , WM_PAINT 键盘消息 WM_CHAR,WM_KEYDOWN,WM_KEYUP 鼠标消息 WM_MOUSEMOVE,WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBCLICK, WM_RBUTTONDOWN,WM_RBUTTONUP, WM_RBUTTONDBCLICK WM_SETFOCUS,WM_KILLFOCUS 焦点消息 定时器消息 WM_TIMER
C C + + + + Windows应用程序的消息 谁接收消息 一个消息必须由一个窗口接收,在窗口的过程函数(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。 未处理的消息到那里去了? MS为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些用户不处理的消息。
句柄 句柄是指Windows使用的一个唯一的整数值,是一个4字节长的数值,用于标识应用程序中不同的对象和同类对象中不同的实例,比如:窗口、按钮、图标、滚动条等。
在VC中windows程序有两种开发 方法: • Windows API • MFC 向导
Windows API int WINAPI WinMain(……) { //设计一个窗口类 WNDCLASS wndcls; wndcls.style=CS_HREDRAW | CS_VREDRAW; wndcls.lpfnWndProc=WndProc; ………… wndcls.lpszClassName="111"; RegisterClass(&wndcls); //注册窗口 hwnd=CreateWindow("111", ……); //创建 ShowWindow(hwnd,SW_SHOWNORMAL);//显示 UpdateWindow(hwnd);
Windows API MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
Windows API LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CHAR: …… case WM_LBUTTONDOWN: …… case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0; }
MFC 概述 MFC的英文全称是Microsoft Fundation Class,即微软基础类库,是微软为了简化程序员的开发工作所开发的一套C++类的集合,是一套面向对象的函数库,它是以类的形式提供给用户使用。 MFC将大部分的Windows API函数封装到类中,以类成员函数的形式提供给用户调用。 MFC编程方法充分利用了面向对象的技术的优点,使我们在编程时极少关心对象的实现细节。同时,类库的强大功能足以完成我们程序的绝大部分功能。
典型的Windows程序设计 1. 编辑框 5. 列表框和组合框 2. 菜单 6. 单选按钮 3. 复选框 7. 显示对话框 4. 滚动条 8. 单文档和多文档
编辑框 编辑框在Windows用户界面中有着重要的地位。 编辑框主要用来接收用户输入的文本,也可以作显示文本之用,是一种重要的交互工具。 通过选取相应的样式(Style),可使编辑框具有如下功能: 自动转换用户输入; 使用某个字符(*)代替用户输入的显示; 支持多行编辑等。
应用程序MyEdit MyEdit应用程序窗口
应用程序MyEdit • 单击Test 1按钮。MyEdit将文本This is a test • 放入上部的编辑框中。
应用程序MyEdit • 单击Clear 1按钮。MyEdit清除上部编辑框的内容 • 在上部编辑框中单击鼠标,然后输入一些字符。 • 单击Test 2按钮。 MyEdit将文本You clicked the Test 2 button 放置在下部编辑框中。 • 单击Clear 2按钮。 MyEdit清除下部编辑框的内容。
生成MyEdit应用程序的项目文件 • 启动Visual C++。 • 在File菜单下选中New命令。 • 选择New对话框中的Project标签,然后选择 MFC AppWizard[exe]。 • 输入项目文件名MyEdit 及其存放位置。 • 单击OK。
生成MyEdit应用程序的项目文件 • 设置Step 1各选项。 确定程序的结构 • 单击Step 1的Next按钮。 • 设置Step 2各选项。 选中About Box复选框,并选中Use 3D Controls 复选框。 确定用户界面。 • 单击Step 2的Next按钮。
生成MyEdit应用程序的项目文件 • 设置Step 3各选项。确定应用程序的外观 MFC Standard表示标准风格 生成的项目文件包括注释代码 应用程序从动态链 接库中调用MFC • 单击Step 3的 Next按钮。
生成MyEdit应用程序的项目文件 • 单击Step 4窗口的Finish按钮。 • Visual C++显示New Project Informatino窗口。 • 单击OK按钮。 Visual C++生成应用 程序的项目文件和所有的 框架文件。
MyEdit应用程序的可视化实现 MyEdit应用程序基于对话框,在用AppWizard生成项目文件和框架文件时,AppWizard生成一对话框并把它作为应用程序的主窗口。取名为:IDD_MYEDIT_DIALOG。 The edit box tool The push button tool
MyEdit应用程序的可视化实现 对话框中所有控件的属性如下所示:
MyEdit应用程序的可视化实现 对话框中所有控件的属性如下所示:
将变量与MyEdit程序对话框连接 在变量m_Edit1与编辑框IDC_EDIT1之间建立联系。 • 选择View菜单下Class Wizard。显示Class Wizard对话框。 • 选择Member Variables标签。 • 确认Class Name设置为CMyEditDlg。 • 选择IDC_EDIT1项。 • 单击Add Variable按钮。 显示Add Member Variable对话框。设置变量名为m_Edit1、设置种类为Value,设置变量类型为Cstring,单击OK按钮。
对Test1和Clear1按钮的BN_CLIKED事件连接代码 当单击Test 1按钮时,将在编辑框中放入文本。 • 选择View菜单下Class Wizard。显示Class Wizard对话框。 • 选择Message Maps标签。 • CMyEditDlg->IDC_TEST1_BUTTON ->BN_CLIKED • 确认Class Name设置为CMyEditDlg。 • 选择IDC_TEST1_BUTTON选项及BN_CLIKED选项。 • 单击Add Function按钮。 接受Visual C++建议的函数名OnTest1Button()。 • 单击Edit Code按钮。
对Test1和Clear1按钮的BN_CLIKED事件连接代码 • 写 OnTest1Button函数代码 void CMyEditDlg::OnTest1Button() { ///////////////////////// //My Code Starts Here ///////////////////////// m_Edit1="This is a test."; UpdateData(FALSE); //////////////////////// //My Code Ends Here ///////////////////////// } UpdateData只有一个BOOL类型的参数,UpdateData(FALSE)一般用于对话框控件连接的变量值刷新屏幕显示;UpdateData(TRUE)用于获取屏幕数据到对话框控件连接的变量中。
对Test1和Clear1按钮的BN_CLIKED事件连接代码 当单击Clear 1按钮时,将编辑框中文本清除。 • 写入OnClear1Button函数代码 void CMyEditDlg::OnClear1Button() { ///////////////////////// //My Code Starts Here ///////////////////////// m_Edit1=""; UpdateData(FALSE); //////////////////////// //My Code Ends Here ///////////////////////// }
给下方的编辑框连接控件变量 • 选择View菜单下Class Wizard。显示Class Wizard对话框。 • 选择Member Variables标签。 • 确认Class Name设置为CMyEditDlg。 • 选择IDC_EDIT2项。 • 单击Add Variable按钮。 显示Add Member Variable对话框。设置变量名为m_Edit2、种类为Control,类型为CEdit。
把Test2按钮与代码相连 当单击Test 2按钮时,将在编辑框中放入文本。 • 单击View菜单下的ClassWizard选项,并选择事件。 CMyEditDlg->IDC_TEST2_BUTTON->BN_CLICIKED • 单击Add Funtion按钮。 • 接受Visual C++建议的函数名OnTest2Button() • 单击Edit Code按钮。 • 写OnTest2Button()函数代码
把Test2按钮与代码相连 void CMyEditDlg::OnTest2Button() { ////////////////////////// //My Code Starts Here ///////////////////////// m_Edit2.SetSel(0,-1); m_Edit2.ReplaceSel("You clicked the test 2 button."); //////////////////////// //My Code Ends Here //////////////////////// }
把Clear2按钮与代码相连 当单击Clear 2按钮时,将编辑框中文本清除。 • 写OnClear2Button()函数代码 void CMyEditDlg::OnClear2Button() { ////////////////////////// //My Code Starts Here ///////////////////////// m_Edit2.SetSel(0,-1); m_Edit2.ReplaceSel(" "); //////////////////////// //My Code Ends Here //////////////////////// }
把Copy按钮与代码相连 • 单击View菜单下的ClassWizard选项,并选择事件。 CMyEditDlg->IDC_COPY_BUTTON->BN_CLICIKED • 单击Add Funtion按钮。 • 接受Visual C++建议的函数名OnCopyButton() • 单击Edit Code按钮。 • 写OnCopyButton()函数代码
把Copy按钮与代码相连 void CMyEditDlg::OnCopyButton() { ////////////////////////// //My Code Starts Here ///////////////////////// m_Edit2.SetSel(0,-1); m_Edit2.Copy(); //////////////////////// //My Code Ends Here //////////////////////// }
把Paste按钮与代码相连实现粘贴特性 • 单击View菜单下的ClassWizard选项,并选择事件。 CMyEditDlg->IDC_PASTE_BUTTON->BN_CLICIKED • 单击Add Funtion按钮。 • 接受Visual C++建议的函数名OnPasteButton() • 单击Edit Code按钮。 • 写OnPasteButton()函数代码
把Paste按钮与代码相连实现粘贴特性 void CMyEditDlg::OnPasteButton() { ////////////////////////// //My Code Starts Here ///////////////////////// m_Edit2.SetSel(0,-1); m_Edit2.Paste(); //////////////////////// //My Code Ends Here //////////////////////// }
修改IDC_EDIT2编辑框的特性 使之能够输入多行文本。 • 选中IDC_EDIT2编辑框。 • 选择View菜单的Properties命令。 显示IDC_EDIT2编辑框的特性对话框 • 单击编辑特性对话框的Style标签。 选中Multiline复选框、选中Horizon Scroll,Auto Hscroll,Vertical Scroll,Want Return 和Border复 选框。
C C + + + + 问题 不是复制编辑框2的全部内容,只复制前5个字符 在编辑框2当前文本的最后粘贴,不替换
C + + CObject CCmdTarget CWnd CEdit 小结 CEdit类 是CWnd类的直接派生类,具有CWnd类的功能。 CEdit类中的成员函数: Copy(),Cut(),Paste(),Undo(), SetSel:在编辑框控件中选择字符范围 void SetSel( int nStartChar, int nEndChar) ReplaceSel:用指定的文本代替编辑 框中选择的文本 void ReplaceSel( LPCTSTR lpszNewText)
C + + 小结 CMyEditDlg类 是CDialog类的直接派生类,具有CDialog类的功能。 CWnd类中的成员函数: MessagBox:弹出消息对话框 int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK ); UpdateData:将变量的内容更新控件, 或用控件的内容更新变量。 BOOL UpdateData(BOOL bSaveAndValidate=TRUE); CObject CCmdTarget CWnd CDialog CMyEditDlg CDialog类中的成员函数: OnOK:关闭窗口 void OnOK( );
C C C C + + + + + + + + 小结 如何使用AppWizard设计Windows应用程序的工程和框架文件。 如何使用Visual C++的可视化工具箱可视地 设计编辑框控件和按钮控件。 如何用Class Wizard给对话框的控件连接变量。 如何用Class Wizard给对话框的控件连接代码。
C C C + + + + + + 菜单设计 菜单是用户和应用程序交互时命令的存放处。因 此,菜单在VC++编程中是很重要的。 在此主要介绍: 如何设计菜单栏? 如何连接菜单栏与对话框? 如何给菜单项连接相应代码?
MyMenu应用程序 MyMenu应用程序的结构是对话框,即该应用程序 的主窗口是对话框。