📄 电子书籍笔记.txt
字号:
VC++学习基础知识
第一部分窗口
学习重点:如何创建一个窗口、销毁一个窗口和控制windows操作系统与窗口的通信问题
基本类型 : overlapped重叠窗口 popup弹出窗口 child子窗口
客户区和非客户区
Windows操作系统提供一个扩展的应用程序接口application program interface(API)用来创建和维护窗口对象
CreateWindow()创建一个窗口对象
SetWindowLong()改变由窗口类定义的特征
MoveWindow()可以移动窗口
DestroyWindow()退出窗口
创建MFC窗口
①创建类CWnd的一个实例
②调用类CWnd的一个成员函数(该成员函数调用API中的CreatWindow()函数)
③返回的窗口句柄保存在类CWnd的成员变量m_hWnd中.
销毁窗口
①须确保销毁该窗口对象及封装该窗口对象的CWnd实例
第一部分
问:怎样应用MFC创建一个窗口
解答:可以用MFC的CWnd类创建一个窗口
CWnd wnd;//创建一个CWnd对象
BOOL b = wnd.CreateEx(ExStyle,ClassName,WindowName,Style,x,y,Width,Height,Parent,Menu,Param);
//调用Windows API函数CreateWindowEx()创建真正的窗口
HWND hwnd=::CreateWindowEx(ExStyle,ClassName,WindowName,Style,x,y,Width,Height,Parent,Menu,Param);
以下是参数说明:
Style和ExStyle指风格和扩展风格参数32位参数
用来指定创建什么类型的窗口
窗口默认风格 WM_OVERLAPPED(重叠窗口)
其它二种窗口分别如下:
WM_CHILD创建一个子窗口 WM_POPUP创建一个弹出窗口
可增添窗口的非客户区特色的风格:
WS_VSCROLL为窗口添加一个垂直滚动条
WS_HSCROLL垂直滚动条
WS_MINIMIZEBOX最小化图标
WS_MAXIMIZEBOX最大化图标
WS_CAPTION 标题栏
WS_SYSMENU系统菜单栏
WS_VISIBLE使窗口可视
WS_DISABLED禁止窗口输入
窗口创建后可用CWnd成员函数ModifyStyle()和ModifyStyleEx()改变窗口风格
如某些风格可能要求重画窗口,给ModifyStyle()函数添加第三个参数,自动激发类CWnd的成员
函数SetWindowPos()做重画窗口工作
示例:
CWnd wnd;
wnd.ModifyStyle(0,WS_BORDER,SWP_NOZORDER);
SetWindowPos()选项:SWP_NOZORDER\SWP_NOMOVE\SWP_NOACTIVATE和SWP_SHOW
ClassName创建窗口里使用的窗口类
WindowName窗口名称参数(零结尾的文本串,用该串指明在窗口标题栏中显示的内容)
亦可用CWnd成员函数SetWindowText()来改变窗口标题栏名称
x和y参数
32位参数,用于以像素为单位指定窗口的位置.CW_USEDEFAULT
Width和Height参数
32位参数,用于以像素为单位指定窗口的大小
父窗口或物主窗口参数(Parent)
该参数用来指向类CWnd对象的指针,根据创建的窗口类型标识是父窗口还是物主窗口
菜单或控件ID参数(Menu)
该参数用来标识菜单(Menu)句柄或控件(Control)ID这要依赖于创建的窗口是子窗口\重叠窗口还是弹出窗口
如果创建的是一个子窗口,用该参数标识控件ID,控件ID通常用来帮助父窗口识别子窗口.
该参数对示一个HMENU变量.示例:(HMENU)102
如果创建的是一个重叠窗口或弹出窗口,用该参数定窗口的菜单
亦可加载一个菜单:
HMENU hMenu=::LoadMenu(AfxGetInstanceHandle(),MAKEINTRESOURCE(XX));
xx指应用程序资源里的菜单ID(menu ID)
第二部分销毁窗口
销毁窗口的同时销毁CWnd对象.在CWnd的派生类中添加下面的重载函数
CYourWnd::PostNcDestory()
{
delete this;
}
窗口进程
窗口与环境的交互是通过发送和接收消息来实现的.如果系统要求窗口自己进行绘制,系统给
它发送一个WM_PAINT消息,如系统要求窗口销毁自己则发送一个WM_DESTROY消息
怎样使用MFC创建一个窗口类
方法1:创建一个窗口类,先创建WNDCLASS结构实例,然后用MFC类库的AfxRegisterClass()注册它
方法2:用MFC类库的AfxRegisterWndClass()来创建一个基于调用参数的WNDCLASS对象
怎么样使用AfxRegisterWndClass()函数注册一个窗口类
略:详见P1
第二部分 基类
基类:CObject、CCmdTarget和CWnd
CObject派生出CCmdTarget类
CCmdTarget派生出CWnd类
CObject派生的类,具有在运行时获得对象大小和名字的能力.
CCmdTarget派生的类,能够处理命令消息
从CWnd派生的类,能够控制它们自已的窗口
CObject类有六个伴生宏完成,功能主要是允许CObject的派生类在运行时获取类名和对象大小,
创建一个类对象而不必知道类名,以及允许从文件设备中存取一个类的实例而不必知道类名。
下面的宏允许类的一个实例在运行时知道它的类名和对象大小:
Declare_dynamic(CYourClass)
Implement_dynamic(CYourClass,CYourBaseClass)
可以用CObject::GetRuntime()获得运行时使用这些宏的类的详情
下面的宏包括了前面两个宏的功能,但是允行在不知道类名的情况下创建一个类的实例
Declare_dyncreate(CYourClass)
Implement_dyncreate(CYourClass,CYourBaseClass)
在不知道类名的情况下可用CRuntimeClass::CreateObject()创建一个运用这些宏的类的实例
下面的宏包括了前面所有宏的功能,但是允行在不知道类名的情况下,把一个类的实例存到磁盘上
Declare_Serial(CYourClass)
Implement_Serial(CYourClass,CYourBaseClass,schema)
由CCmdTarget派生的类,可以接收和处理来自应用程序菜单或工具栏的命令消息。
CWnd的成员函数封装了WindowsAPI中负责维护和创建窗口的函数
CWnd是从CCmdTarget派生的,因此也能接收和处理命令消息
学习应用程序、框架、文档和视图类的介绍
应用程序从四个基类派生:
CWinApp 应用程序的 "应用程序类",负责初始化和运行应用程序
CFrameWnd 应用程序的“框架类”,负责显示和搜寻用户命令
CDocument 应用程序的“文档类”,负责装载和维护文档。文档可以是从文档到网络设备设置的任何内容
CView 应用程序的“视图类”,负责为文档提供一个或多个视图
对话框应用程序 ---只应用了程序类的派生类(CWinApp)
单文档界面应用程序--能在某个时间内装入和编辑一个文档,包含上面四个基类
多文档界面应用程序--一次可装载和编辑多个文档。包括四个基类,并使用了CFrameWnd的两个派生类,
即CMDIFrameWND和CMDIChildWnd
2.2.1 CWinApp(O/C/W)
应用程序类CWinApp是应用程序开始创建的第一个对象,并且是在结束前最后一个执行的对象.
对于一个对应框应用程序,应用程序类应用CDialog创建一个对话框
对于一个SDI应用程序,应用程序类创建一个或多个文档模板,然后用模板打开一个空文档.
对于一个MID应用程序,在主框架类中,应用程序类创建一个或多个文档模板.
应用程序类是由CWinApp派生的 AppWizard以CXxxApp形式进行命名
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -