1 / 213

第十一章 Windows 编程

第十一章 Windows 编程. Windows 编程的基本思想. MFC 概述. 典型的 Windows 程序设计. C. C. C. C. C. + +. + +. + +. + +. + +. Windows 编程. Windows 程序的特点:. 界面风格统一,便于用户掌握应用程序. 采用事件和消息机制(消息驱动). 可视化的开发工具使界面生成简单、美观统一,减少开发者劳动量. 提供丰富的程序员接口函数( API ). 面向对象的开发模式. 窗 口. 窗口是 Windows 应用程序的基本的操作单

vicky
Download Presentation

第十一章 Windows 编程

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第十一章 Windows编程 • Windows编程的基本思想 • MFC概述 • 典型的Windows程序设计

  2. C C C C C + + + + + + + + + + Windows编程 Windows 程序的特点: 界面风格统一,便于用户掌握应用程序 采用事件和消息机制(消息驱动) 可视化的开发工具使界面生成简单、美观统一,减少开发者劳动量 提供丰富的程序员接口函数(API) 面向对象的开发模式

  3. 窗 口 窗口是Windows应用程序的基本的操作单 元,是应用程序与用户之间交互的接口环境, 也是系统管理应用程序的基本单位。 最小化 最大化 关闭 菜单栏 标题栏 工具栏 地址栏 垂直滚动条 可调边框 工作区 状态栏 水平滚动条

  4. 窗 口 窗口是Windows应用程序的基本的操作单 元,是应用程序与用户之间交互的接口环境, 也是系统管理应用程序的基本单位。

  5. 消息驱动——程序设计思想 Windows编程是围绕事件或消息的产生驱动运行处理函数的。消息是描述事件发生的信息。 在消息驱动的程序结构中,程序的控制流程不再由事件的预定顺序来决定,而是由实际运行时各种事件的实际发生来触发,而事件的发生可能是随机的、不确定的,并没有预定的顺序。 消息驱动是一种面向用户的程序设计方法,在程序设计过程中除了完成所需要的程序功能外,更多考虑了用户可能的各种输入,并有针对性地设计相应的处理程序。 消息驱动程序设计思想也是一种“被动”式的程序设计方法,程序开始运行时,处于等待消息状态,然后取得消息并对消息作出相应的反应,处理完毕后又返回处于等待消息状态。

  6. 过程驱动——程序设计思想

  7. 消 消息 消息驱动——程序设计思想

  8. 应用程序 Windows 消息队列 键盘消息鼠标消息其他消息 取消息 处理消息 消息驱动——程序设计思想 消息驱动程序的工作流程

  9. 消息的来源 C + + Windows应用程序的消息 1、输入消息:包括键盘和鼠标的输入。这一类消息首先放在系统消息队列中,然后由Windows将它们送入应用程序队列中,由应用程序来处理消息。 2、控制消息:用来与Windows的控制对象,如列表框、按钮、检查框等进行双向通信。 3、系统消息:对程序化的事件或系统时钟中断作出反应。 4、用户消息:这是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。

  10. C + + Windows应用程序的消息 消息的组成 在windows程序中,消息是由MSG结构体来表示的。 typedef struct tagMSG { // msg HWND hwnd; //消息所属窗口 UINT message; //消息的标识符 WPARAM wParam; //消息的附加信息 LPARAM lParam; //同上 DWORD time; //消息投递时间 POINT pt; //鼠标当前位置 } MSG;

  11. 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

  12. C C + + + + Windows应用程序的消息 谁接收消息 一个消息必须由一个窗口接收,在窗口的过程函数(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。 未处理的消息到那里去了? MS为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些用户不处理的消息。

  13. 句柄 句柄是指Windows使用的一个唯一的整数值,是一个4字节长的数值,用于标识应用程序中不同的对象和同类对象中不同的实例,比如:窗口、按钮、图标、滚动条等。

  14. 在VC中windows程序有两种开发 方法: • Windows API • MFC 向导

  15. 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);

  16. Windows API MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }

  17. 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; }

  18. MFC 概述 MFC的英文全称是Microsoft Fundation Class,即微软基础类库,是微软为了简化程序员的开发工作所开发的一套C++类的集合,是一套面向对象的函数库,它是以类的形式提供给用户使用。 MFC将大部分的Windows API函数封装到类中,以类成员函数的形式提供给用户调用。 MFC编程方法充分利用了面向对象的技术的优点,使我们在编程时极少关心对象的实现细节。同时,类库的强大功能足以完成我们程序的绝大部分功能。

  19. 典型的Windows程序设计 1. 编辑框 5. 列表框和组合框 2. 菜单 6. 单选按钮 3. 复选框 7. 显示对话框 4. 滚动条 8. 单文档和多文档

  20. 编辑框 编辑框在Windows用户界面中有着重要的地位。 编辑框主要用来接收用户输入的文本,也可以作显示文本之用,是一种重要的交互工具。 通过选取相应的样式(Style),可使编辑框具有如下功能: 自动转换用户输入; 使用某个字符(*)代替用户输入的显示; 支持多行编辑等。

  21. 应用程序MyEdit MyEdit应用程序窗口

  22. 应用程序MyEdit • 单击Test 1按钮。MyEdit将文本This is a test • 放入上部的编辑框中。

  23. 应用程序MyEdit • 单击Clear 1按钮。MyEdit清除上部编辑框的内容 • 在上部编辑框中单击鼠标,然后输入一些字符。 • 单击Test 2按钮。 MyEdit将文本You clicked the Test 2 button 放置在下部编辑框中。 • 单击Clear 2按钮。 MyEdit清除下部编辑框的内容。

  24. 生成MyEdit应用程序的项目文件 • 启动Visual C++。 • 在File菜单下选中New命令。 • 选择New对话框中的Project标签,然后选择 MFC AppWizard[exe]。 • 输入项目文件名MyEdit 及其存放位置。 • 单击OK。

  25. 生成MyEdit应用程序的项目文件 • 设置Step 1各选项。 确定程序的结构 • 单击Step 1的Next按钮。 • 设置Step 2各选项。 选中About Box复选框,并选中Use 3D Controls 复选框。 确定用户界面。 • 单击Step 2的Next按钮。

  26. 生成MyEdit应用程序的项目文件 • 设置Step 3各选项。确定应用程序的外观 MFC Standard表示标准风格 生成的项目文件包括注释代码 应用程序从动态链 接库中调用MFC • 单击Step 3的 Next按钮。

  27. 生成MyEdit应用程序的项目文件 • 单击Step 4窗口的Finish按钮。 • Visual C++显示New Project Informatino窗口。 • 单击OK按钮。 Visual C++生成应用 程序的项目文件和所有的 框架文件。

  28. MyEdit应用程序的可视化实现 MyEdit应用程序基于对话框,在用AppWizard生成项目文件和框架文件时,AppWizard生成一对话框并把它作为应用程序的主窗口。取名为:IDD_MYEDIT_DIALOG。 The edit box tool The push button tool

  29. MyEdit应用程序的可视化实现 对话框中所有控件的属性如下所示:

  30. MyEdit应用程序的可视化实现 对话框中所有控件的属性如下所示:

  31. MyEdit应用程序的可视化实现

  32. 将变量与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按钮。

  33. 对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按钮。

  34. 对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)用于获取屏幕数据到对话框控件连接的变量中。

  35. 对Test1和Clear1按钮的BN_CLIKED事件连接代码 当单击Clear 1按钮时,将编辑框中文本清除。 • 写入OnClear1Button函数代码 void CMyEditDlg::OnClear1Button() { ///////////////////////// //My Code Starts Here ///////////////////////// m_Edit1=""; UpdateData(FALSE); //////////////////////// //My Code Ends Here ///////////////////////// }

  36. 给下方的编辑框连接控件变量 • 选择View菜单下Class Wizard。显示Class Wizard对话框。 • 选择Member Variables标签。 • 确认Class Name设置为CMyEditDlg。 • 选择IDC_EDIT2项。 • 单击Add Variable按钮。 显示Add Member Variable对话框。设置变量名为m_Edit2、种类为Control,类型为CEdit。

  37. 把Test2按钮与代码相连 当单击Test 2按钮时,将在编辑框中放入文本。 • 单击View菜单下的ClassWizard选项,并选择事件。 CMyEditDlg->IDC_TEST2_BUTTON->BN_CLICIKED • 单击Add Funtion按钮。 • 接受Visual C++建议的函数名OnTest2Button() • 单击Edit Code按钮。 • 写OnTest2Button()函数代码

  38. 把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 //////////////////////// }

  39. 把Clear2按钮与代码相连 当单击Clear 2按钮时,将编辑框中文本清除。 • 写OnClear2Button()函数代码 void CMyEditDlg::OnClear2Button() { ////////////////////////// //My Code Starts Here ///////////////////////// m_Edit2.SetSel(0,-1); m_Edit2.ReplaceSel(" "); //////////////////////// //My Code Ends Here //////////////////////// }

  40. 把Copy按钮与代码相连 • 单击View菜单下的ClassWizard选项,并选择事件。 CMyEditDlg->IDC_COPY_BUTTON->BN_CLICIKED • 单击Add Funtion按钮。 • 接受Visual C++建议的函数名OnCopyButton() • 单击Edit Code按钮。 • 写OnCopyButton()函数代码

  41. 把Copy按钮与代码相连 void CMyEditDlg::OnCopyButton() { ////////////////////////// //My Code Starts Here ///////////////////////// m_Edit2.SetSel(0,-1); m_Edit2.Copy(); //////////////////////// //My Code Ends Here //////////////////////// }

  42. 把Paste按钮与代码相连实现粘贴特性 • 单击View菜单下的ClassWizard选项,并选择事件。 CMyEditDlg->IDC_PASTE_BUTTON->BN_CLICIKED • 单击Add Funtion按钮。 • 接受Visual C++建议的函数名OnPasteButton() • 单击Edit Code按钮。 • 写OnPasteButton()函数代码

  43. 把Paste按钮与代码相连实现粘贴特性 void CMyEditDlg::OnPasteButton() { ////////////////////////// //My Code Starts Here ///////////////////////// m_Edit2.SetSel(0,-1); m_Edit2.Paste(); //////////////////////// //My Code Ends Here //////////////////////// }

  44. 修改IDC_EDIT2编辑框的特性 使之能够输入多行文本。 • 选中IDC_EDIT2编辑框。 • 选择View菜单的Properties命令。 显示IDC_EDIT2编辑框的特性对话框 • 单击编辑特性对话框的Style标签。 选中Multiline复选框、选中Horizon Scroll,Auto Hscroll,Vertical Scroll,Want Return 和Border复 选框。

  45. C C + + + + 问题 不是复制编辑框2的全部内容,只复制前5个字符 在编辑框2当前文本的最后粘贴,不替换

  46. 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)

  47. 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( );

  48. C C C C + + + + + + + + 小结 如何使用AppWizard设计Windows应用程序的工程和框架文件。 如何使用Visual C++的可视化工具箱可视地 设计编辑框控件和按钮控件。 如何用Class Wizard给对话框的控件连接变量。 如何用Class Wizard给对话框的控件连接代码。

  49. C C C + + + + + + 菜单设计 菜单是用户和应用程序交互时命令的存放处。因 此,菜单在VC++编程中是很重要的。 在此主要介绍: 如何设计菜单栏? 如何连接菜单栏与对话框? 如何给菜单项连接相应代码?

  50. MyMenu应用程序 MyMenu应用程序的结构是对话框,即该应用程序 的主窗口是对话框。

More Related