VC深入详解自学笔记Word下载.docx
- 文档编号:4993301
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:147
- 大小:634.16KB
VC深入详解自学笔记Word下载.docx
《VC深入详解自学笔记Word下载.docx》由会员分享,可在线阅读,更多相关《VC深入详解自学笔记Word下载.docx(147页珍藏版)》请在冰点文库上搜索。
光标句柄(HCURSOR),图标句柄(HICON)。
3.消息与消息队列
Windows程序设计是一种基于消息的事件驱动方式的程序设计模式。
消息:
在Windows中由结构体MSG来表示,
typedefstructtagMSG{
HWNDhwnd;
//消息所属的窗口句柄
UINTmessage;
//消息本身标识符,由一数值表示,系统对消息定//义为WM_XXX宏(WM为WindowsMessage缩写)
WPARAMwParam;
//随消息的不同附加信息也不同
LPARAMlParam;
//消息的附加参数
DWORDtime;
//消息投递的时间
POINTpt;
//鼠标当前位置
}
消息队列:
每当一个Windows应用程序创建后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序一的窗口的消息,消息产生后被投递到消息队列中,应用程序通过一个消息循环不断的消息队列中取出消息进行响应。
响应过程由系统向应用程序发送消息,实际就是调用应用程序的消息处理函数。
4.创建一个完整的Win32程序,该程序实现创建一个窗口,其中主要步骤为
A.WinMain函数的定义
B.创建一个窗口创建一个完整的窗口的四个步骤SDK,1设计窗口类,2注册窗口类,3创建窗口,4显示窗口
C.进行消息循环
D.编写窗口过程函数
回调函数的实现机制:
(1)定义一个回调函数
(2)提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者
(3)当特定的事件或条件发和的时候,调用使用函数指针调用回调函数对事件进行处理
针对Windows的消息处理机制,窗口过程函数被调用的过程如下:
A.在设计窗口类的时候,将窗口赛程函数的地址赋值给lpfnWndProc成员变量
B.调用RegisterClass(&
wndclass)注册窗口类,那么系统就有了我们所编写的窗口过程函数的地址
C.当应用程序接收到某一窗口的消息,调用DispatchMessage(&
msg)将消息加值给系统。
系统则利用先前注册窗口类时得到函数指针,调用窗口过程函数对消息进行处理。
HICONLoadIcon(HINSTANCEhInstance,LPCTSTRlpIconName);
//加载窗图标,返回系统分配给该图标的句柄,LPCTSTR被定义为CONSTCHAR*(指向常量的字符指针),图标的ID是一个常数,要使用MAKEINTRESOUCE宏把资源ID标识转换为需要的LPCTSTR类型
5.sprintf格式化字符,其头文件为stdio。
h,在MFC中格式化字符用CString。
Format
6.GetDC()与ReleaseDC()要成对使用,否则会内存泄漏。
同样,BeginPaint()与
EndPaint(),这两个Parint只能在影响WM_PAINT消息中调用。
7.GetStockObject()得到画笔、画刷、字体、调色板的句柄,使用时必须用类型
转换。
如:
hbrBackground=(HBRUSH)GetStockObject(NULL_BRUSH)//创建空画刷
8.什么时候用NULL,什么时候用0。
答,对指针赋值时用NULL,对变量赋值
时用0。
9.什么是野指针?
答:
将指针指向的变量的内存释放后,此指针即变成野指针!
如何避免野指针?
将此指针指向NULL即可。
p=NULL;
#include<
stdio.h>
windows.h>
stdexcept>
usingnamespacestd;
//回调函数原型声明,返回长整形的结果码,CALLBACK是表示stdcall调用
LRESULTCALLBACKWinProc(
HWNDhwnd,//handletowindow
UINTuMsg,//messageidentifier
WPARAMwParam,//firstmessageparameter
LPARAMlParam//secondmessageparameter
);
//
(1)WinMain函数,程序入口点函数
intWINAPIWinMain(
HINSTANCEhInstance,//handletocurrentinstance
HINSTANCEhPrevInstance,//handletopreviousinstance
LPSTRlpCmdLine,//commandline
intnCmdShow//showstate
){
//
(2)
//一.设计一个窗口类,类似填空题,使用窗口结构体
WNDCLASSwnd;
wnd.cbClsExtra=0;
//类的额外内存
wnd.cbWndExtra=0;
//窗口的额外内存
wnd.hbrBackground=(HBRUSH)GetStockObject(NULL_BRUSH);
//创建一个空画刷填充背景
//加载游标,如果是加载标准游标,则第一个实例标识设置为空
wnd.hCursor=LoadCursor(NULL,IDC_CROSS);
wnd.hIcon=LoadIcon(NULL,IDI_ERROR);
wnd.hInstance=hInstance;
//实例句柄赋值为程序启动系统分配的句柄值
wnd.lpfnWndProc=WinProc;
//消息响应函数
wnd.lpszClassName="
gaojun"
;
//窗口类的名子,在注册时会使用到
wnd.lpszMenuName=NULL;
//默认为NULL没有标题栏
wnd.style=CS_HREDRAW|CS_VREDRAW;
//定义为水平和垂直重画
//二.注册窗口类
RegisterClass(&
wnd);
//三.根据定制的窗口类创建窗口
HWNDhwnd;
//保存创建窗口后的生成窗口句柄用于显示
//如果是多文档程序,则最后一个参数lParam必须指向一个CLIENTCREATESTRUCT结构体
hwnd=CreateWindow("
"
WIN32应用程序"
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,800,600,NULL,NULL,hInstance,NULL);
//四.显示窗口
ShowWindow(hwnd,SW_SHOWDEFAULT);
//五.更新窗口
UpdateWindow(hwnd);
//(3).消息循环
MSGmsg;
//消息结构体
//如果消息出错,返回值是-1,当GetMessage从消息队列中取到是WM_QUIT消息时,返回值是0
//也可以使用PeekMessage函数从消息队列中取出消息
BOOLbSet;
while((bSet=GetMessage(&
msg,NULL,0,0))!
=0){
if(-1==bSet)
{
return-1;
}
else{
TranslateMessage(&
msg);
DispatchMessage(&
}
return0;
//程序结束,返回0
//消息循环中对不同的消息各类进行不同的响应
HWNDhwnd,//handletowindow
UINTuMsg,//messageidentifier
WPARAMwParam,//firstmessageparameter
LPARAMlParam//secondmessageparameter
){
switch(uMsg)
{
caseWM_CHAR:
//字符按键消息
charszChar[20];
sprintf(szChar,"
charis%d;
"
wParam);
//格式化操作,stdio.h
MessageBox(hwnd,szChar,"
0);
//输出操作windows.h中
break;
caseWM_LBUTTONDOWN:
//鼠标左键按下消息
MessageBox(hwnd,"
thisisclickevent!
点击"
HDChdc;
hdc=GetDC(hwnd);
//获取设备上下文句柄,用来输出文字
//在x=0,y=50(像素)的地方输出文字
TextOut(hdc,0,50,"
响应WM_LBUTTONDONW消息!
strlen("
));
ReleaseDC(hwnd,hdc);
//在使用完DC后一定要注意释放
caseWM_PAINT:
//窗口重给时报消息响应
HDChDc;
PAINTSTRUCTps;
hDc=BeginPaint(hwnd,&
ps);
TextOut(hDc,0,0,"
这是一个Paint事件!
strlen("
EndPaint(hwnd,&
caseWM_CLOSE:
//关闭消息
if(IDYES==MessageBox(hwnd,"
确定要关闭当前窗口?
提示"
MB_YESNO))
DestroyWindow(hwnd);
//销毁窗口
}
caseWM_DESTROY:
PostQuitMessage(0);
//在响应消息后,投递一个退出的消息使用程序安全退出
default:
returnDefWindowProc(hwnd,uMsg,wParam,lParam);
//调用缺省的消息处理过程函数
掌握C++基本语法
1.C++主要特点:
封装性(Encapsulation):
把数据与操作数据的函数组织在一起,使程序结构更加紧凑,提高类内部数据的安全性。
继承性(Inheritance):
增加了软件的可扩充性及代码重用性;
多态性(Polymorphism):
使设计人员在设计程序时可以对问题进行更好的抽象,有利于代码的维护和可重用
2.C++中几个特性的实现技术和其它要注意的地方:
构造函数,析构函数,覆盖,隐藏,重载,继承,多态(迟绑定)等技术,算法
类的编写与应用
以下是部分资料:
1。
定义结构体和类时。
例如ClassPoint{intx;
inty;
};
要注意一定加上分号,结构体定义默认成员是public,而Class定义默认为private
2。
xxx。
h>
与#include"
h"
的区别:
<
>
不查找运行时目录,"
查找运行时目录!
(#include<
xxx>
引入是源文件,要用上usingnamespacexxx;
)
3。
类的定义中,如果未指明成员类型,则缺省为private。
而结构体中则缺省为public。
4。
引用:
引用经常用在函数的传参上。
另外数值交换函数也经常用引用。
例
change(int&
x,int&
y){inttemp;
temp=x;
x=y;
y=x}调用时即可以用inta=3;
intb=4;
change(a,b);
一般不用指针来作为参数进行数值交换。
因为会引起歧义。
5。
通常将类的定义放。
h文件,而将其实现放在cpp文件中,别忘记了在cpp文件中#include"
6。
如何防止类的重复定义?
用#inndefPoint_H_H
#definePoint_H_H
classPoint{};
#endif来防止
7。
源文件cpp文件单独编译成obj文件。
最后由链接器将与将要使用到的C++标准库类链接成exe文件,头文件不参加编译。
所以在cpp文件中别忘记了加入#include"
8。
函数的覆盖,在子类中重写父类的函数,此时采用早期绑定的方法。
如果加入了virtual,则将采用迟绑定的技术,在运行时根据对象的类型确定调用哪一个函数。
此迟绑定技术是MFC的类的继承的精髓。
9。
强制类型转换。
如果CFish从CAnimal派生而来。
则可以将鱼的对象转换为CAnimal的对象,而反之则不行。
从现实中理解也是正常的,鱼可以是动物,而动物却不是鱼。
再如int可以强制转换成char型。
而反之则出错。
MFC框架程序剖析
1.MFC简介:
MFC(MicrosoftFoundationClass,微软基础类库)是微软为了简化程序员的开发工作所开发的一套C++类的集合,是一套面向对象的函数库,以为的方式提供给用户使用.利用这些类,可以有效发帮助程序员完成Windows应用程序的开发
MFCAppWizard是一个辅助生成源代码的向导工具,它可以帮助我们自动生成基于MFC框架的源代码.在向导的每一个步骤中,我们可以根据需要来选择各种特性,从而实现定制应用程序.
2.窗口类,窗口对象与窗口关系
窗口类中定义一个类型为HWND成员变量,用来保存与之相关的窗口句柄值,可以用一个窗口类的实例即窗口对象来对应一个创建的窗口(是一种资源),窗口对象与窗口之间的关系是:
C++窗口类对象与窗口并不是一回事,它们之间唯一的关系是C++窗口类对象内部定义了一个窗口句柄变量,保存了与这个C++窗口类对象相关的那个窗口的句柄.窗口销毁时,与之对应的C++窗口类对象销毁与否,要看其生命周期是否结束,但C++窗口类对象销毁时,与之相关的窗口将销毁,因为它们之间的纽带(m_hWnd)已经断了,因此这时要回收窗口资源.
窗口销毁时调用DestroyWindow函数,窗口类对象销毁即将m_hWnd变量设置为NULL.
VC6.0一些常用操作快捷方式:
功能分类
快捷键
说明
File
(文件)
Ctrl+N
New新建工程
Ctrl+O
Open打开文件
Find
(查找)
Alt+F3/Ctrl+F
弹出查找对话框
F3
查找下一个
Shift+F3
查找上一个
Ctrl+H
替换
Ctrl+]/Ctrl+E
寻找下一半括弧
F4
寻找下一个错误/警告位置
Shift+F4
寻找上一个错误/警告位置
格式
Ctrl+U
将选定区域转换成小写
Ctrl+Shift+U
将选定区域转换成大写
Alt+F8
自动格式重排
Build
(建立)
F7
Build(编绎并链接成exe文件)
Ctrl+F7
Compile(编译)
Ctrl+F5
Execute(编译+链接+运行)
Ctrl+Shift+F5
Restartstheprogram(重新运行程序)
Debug
(调试)
F5
Go(顺序执行)
F11
stepinto(顺序执行,进入循环或函数)
F10
stepover(顺序执行,不进入循环或函数)
Ctrl+F10
Runtocursor(自动执行到用户光标所指的语句前)
Shift+F5
StopDebugging(停止调试)
F9
Insert/Removebreakpoint(在当前行插入/去掉断点)
Ctrl+Shift+F9
去掉所有断点
1.在main或WinMain之前,全局变量已经被分配内存并初始化了。
2.在MFC中在WinMain之前有个theApp全局变量先被构造并被初始化,而由于子类构造函数执行前,其父类的构造函数先被执行,所以CTestApp的父类CWinAPP的构造函数先执行。
产生了theApp对象后,在WinMain()中的指针*pThread和*pApp就有了内容。
3.MFC大致流程:
CTestApptheApp;
//构造全局对象
WinMain()
{
AfxWinMain();
//调用下面的函数
AfxWinMain()
pThread->
Initinstance();
//初始化工作和注册窗口类,窗口显示和更新
Run();
//消息循环
而在BOOLCTestApp:
:
InitInstance()中的代码
CSingleDocTemplate*pDocTemplate;
pDocTemplate=newCSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CMainFrame),//mainSDIframewindow
RUNTIME_CLASS(CTestView));
AddDocTemplate(pDocTemplate);
完成了将这三个类关联起来的工作。
4.如何在单文档文件中显示一个CButton的对象?
在CMainFrame:
OnCreate()中定义一个CButton的对象btn;
然后调用btn.Create("
维新"
WS_DISABLED|WS_CHILD|WS_VISIBLE|BS_AUTO3STATE,
CRect(0,0,300,100),/*GetParent(),*/this,123);
注意点:
(1).此处btn不能是局部变量,否则它的生命周期太短,将不能显示。
(2).在CBUTTON类的Create函数的第二个参数中加入WS_VISIBLE参数才行。
否则必须调用ShowWindow也可以在view的OnCreate消息响应函数中加入
(3).CButton类的定义头文件在afxwin.h中,而stdafx.h包含了afxwin.h,所以可以直接使用。
因为MFC中的每一个类中都有#include"
stdafx.h"
的声明。
简单绘图
1.在单文档中view挡在MainFrame的前面。
此时如果编写针对MainFrame的mouseClick
事件,将不会有反应。
因为MFC视类窗口是覆盖在框架窗口上的,因此框架窗口不能感
到鼠标消息.
2.MFC的消息映射机制:
在每个能接收和处理消息的类中,定义一个消息和消息函数对照表,即消息映射表.在消息映射表中,消息与对应的消息处理函数指针成对出现.某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中.当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可知道该类能否处理此消息.如果能处理该消息,则同样依照静态表很容易找到并调用对应的消息处理函数.
MFC消息映射机制是针对能接受消息和处理消息的类来定义对应的消息映射表,而不是由父类来定义所有消息对应的虚函数,由子类来覆盖其函数实现,因为这样做会使程序背着一个很大的虚拟函数表的包袱运行,对内存是一种浪费.
MFC工程中一个消息映射在三处添加代码:
(1):
CDrawView视类的头文件.h
//{{AFX_MSG(CDrawView)
afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
两个AFX_MSG注释宏(因为加了注释符)之间,afx_msg是限定符(也是宏),表明函数是一个消息响应函数的声明,如果是用户自定义的消息函数响应声明则在注释宏下,DECLARE_MESSAGE_MAP之上加写代码
(2):
CDrawView的cpp(源文件)的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间,定义了CDrawView类的消息映射表,其中ON_WM_LBUTTONDOWN映射宏就是将鼠标左键按下消息(WM_LBUTTONDOWN)与一个消息响应函数(OnLButtonDown)关联.
BEGIN_MESSAGE_MAP(CDrawView,CView)
//{{AFX_MSG_MAP(CDrawView)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
//Standardprintingcommands
ON_COMMAND(ID_FILE_PRINT,CView:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:
OnFilePrintPreview)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 深入 详解 自学 笔记
![提示](https://static.bingdoc.com/images/bang_tan.gif)