}
}
hDc = BeginPaint(hwnd, &ps);
TextOut(hDc, 0, 0, \这是一个Paint事件!\这是一个Paint事件!\EndPaint(hwnd, &ps); break;
if (IDYES == MessageBox(hwnd, \确定要关闭当前窗口?\提示\{ }
DestroyWindow(hwnd);//销毁窗口
case WM_CLOSE://关闭消息
break;
PostQuitMessage(0);//在响应消息后,投递一个退出的消息使用程序安全退出 break;
return DefWindowProc(hwnd, uMsg, wParam, lParam);//调用缺省的消息处理过程函数
case WM_DESTROY:
default:
return 0;
Lesson2: 掌握C++基本语法
1. C++主要特点:
封装性(Encapsulation):把数据与操作数据的函数组织在一起,使程序结构更加紧凑,提高类内部数据的安全性。
继承性(Inheritance):增加了软件的可扩充性及代码重用性;
多态性(Polymorphism):使设计人员在设计程序时可以对问题进行更好的抽象,有利于代码的维护和可重用
2. C++中几个特性的实现技术和其它要注意的地方:
构造函数,析构函数,覆盖,隐藏,重载,继承,多态(迟绑定)等技术,算法 类的编写与应用 以下是部分资料:
1。定义结构体和类时。例如Class Point{int x;int y;};要注意一定加上分号,结构体定义默认成员是public,而Class定义默认为private
2。#include
3。类的定义中,如果未指明成员类型,则缺省为private。而结构体中则缺省为public。 4。引用:引用经常用在函数的传参上。另外数值交换函数也经常用引用。例
change(int &x,int &y){int temp;temp=x;x=y;y=x}调用时即可以用 int a=3;int b=4;change(a,b);一般不用指针来作为参数进行数值交换。因为会引起歧义。
5。通常将类的定义放。h文件,而将其实现放在cpp文件中,别忘记了在cpp文件中#include \。h\
6。如何防止类的重复定义? 用#inndef Point_H_H
#define Point_H_H class Point{}; #endif来防止 7。源文件cpp文件单独编译成obj文件。最后由链接器将与将要使用到的C++标准库类链接成exe文件,头文件不参加编译。所以在cpp文件中别忘记了加入#include \。h\8。函数的覆盖,在子类中重写父类的函数,此时采用早期绑定的方法。如果加入了virtual,则将采用迟绑定的技术,在运行时根据对象的类型确定调用哪一个函数。此迟绑定技术是MFC的类的继承的精髓。 9。强制类型转换。如果CFish从CAnimal派生而来。则可以将鱼的对象转换为CAnimal的对象,而反之则不行。从现实中理解也是正常的,鱼可以是动物,而动物却不是鱼。再如int可以强制转换成char型。而反之则出错。
Lesson3: MFC框架程序剖析
1. MFC简介:MFC(Microsoft Foundation Class,微软基础类库)是微软为了简化程序员的开发
工作所开发的一套C++类的集合,是一套面向对象的函数库,以为的方式提供给用户使用.利用这些类,可以有效发帮助程序员完成Windows应用程序的开发
MFC AppWizard是一个辅助生成源代码的向导工具,它可以帮助我们自动生成基于MFC框架的源代码.在向导的每一个步骤中,我们可以根据需要来选择各种特性,从而实现定制应用程序. 2. 窗口类,窗口对象与窗口关系
窗口类中定义一个类型为HWND成员变量,用来保存与之相关的窗口句柄值,可以用一个窗口类的实例即窗口对象来对应一个创建的窗口(是一种资源),窗口对象与窗口之间的关系是:
C++窗口类对象与窗口并不是一回事,它们之间唯一的关系是C++窗口类对象内部定义了一个窗口句柄变量,保存了与这个C++窗口类对象相关的那个窗口的句柄.窗口销毁时,与之对应的C++窗口类对象销毁与否,要看其生命周期是否结束,但C++窗口类对象销毁时,与之相关的窗口将销毁,因为它们之间的纽带(m_hWnd)已经断了,因此这时要回收窗口资源.
窗口销毁时调用DestroyWindow函数,窗口类对象销毁即将m_hWnd变量设置为NULL.
VC 6.0一些常用操作快捷方式: 功能分类 File Ctrl+N Ctrl+O Find Alt+F3/Ctrl+F F3 (查找) Shift+F3 Ctrl+H 快捷键 New新建工程 Open 打开文件 弹出查找对话框 查找下一个 查找上一个 替换 说明 Ctrl+]/Ctrl+E F4 Shift+F4 格式 Ctrl+U Ctrl+Shift+U Alt+F8 Build F7 Ctrl+F7 (建立) Ctrl+F5 Ctrl+Shift+F5 Debug F5 F11 (调试) F10 Ctrl+F10 Shift+F5 F9 Ctrl+Shift+F9 寻找下一半括弧 寻找下一个错误/警告位置 寻找上一个错误/警告位置 将选定区域转换成小写 将选定区域转换成大写 自动格式重排 Build(编绎并链接成exe文件) Compile(编译) Execute(编译+链接+运行) Restarts the program(重新运行程序) Go(顺序执行) step into (顺序执行,进入循环或函数) step over(顺序执行,不进入循环或函数) Run to cursor(自动执行到用户光标所指的语句前) Stop Debugging(停止调试) Insert/Remove breakpoint(在当前行插入/去掉断点) 去掉所有断点
1.在main或WinMain之前,全局变量已经被分配内存并初始化了。
2.在MFC中在WinMain之前有个theApp全局变量先被构造并被初始化,而由于子类构造函数执行前,其父类的构造函数先被执行,所以CTestApp的父类CWinAPP的构造函数先执行。产生了theApp对象后,在WinMain()中的指针*pThread和*pApp就有了内容。 3.MFC大致流程:
CTestApp theApp;//构造全局对象 WinMain() {
AfxWinMain();//调用下面的函数 }
AfxWinMain() {
pThread->Initinstance();//初始化工作和注册窗口类,窗口显示和更新 pThread->Run();//消息循环 }
而在BOOL CTestApp::InitInstance()中的代码 CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CTestView)); AddDocTemplate(pDocTemplate);
完成了将这三个类关联起来的工作。
4.如何在单文档文件中显示一个CButton的对象?
在CMainFrame::OnCreate()中定义一个CButton的对象btn;然后调用btn.Create(\维新\ |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 \的声明。
Lesson4: 简单绘图
1. 在单文档中view挡在MainFrame的前面。此时如果编写针对MainFrame的mouseClick
事件,将不会有反应。因为MFC视类窗口是覆盖在框架窗口上的,因此框架窗口不能感 到鼠标消息.
2. MFC的消息映射机制:
在每个能接收和处理消息的类中,定义一个消息和消息函数对照表,即消息映射表.在消息映射表中,消息与对应的消息处理函数指针成对出现.某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中.当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可知道该类能否处理此消息.如果能处理该消息,则同样依照静态表很容易找到并调用对应的消息处理函数.
MFC消息映射机制是针对能接受消息和处理消息的类来定义对应的消息映射表,而不是由父类来定义所有消息对应的虚函数,由子类来覆盖其函数实现,因为这样做会使程序背着一个很大的虚拟函数表的包袱运行,对内存是一种浪费. MFC工程中一个消息映射在三处添加代码: (1): CDrawView视类的头文件.h //{{AFX_MSG(CDrawView)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //}}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
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP()
如果添加自定义的消息映射,使用ON_MESSAGE(用户定义消息,消息响应函数名)无”;”结尾
(3): 是CDrawView的cpp(源文件)中有函数实现。
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) {
// TOD Add your message handler code here and/or call default m_ptOrigin=m_ptOld=point; m_bDraw=TRUE;
CView::OnLButtonDown(nFlags, point); }
通过分析MFC消息响应函数在程序中有三处属地省:函数原型,用来关联消息和消息响应函数的宏和函数实现.
3. 以下绘图程序,参考代码的注释可解决部分绘图问题
void CLesson3View::OnLButtonUp(UINT nFlags, CPoint point) { // // // // // // //
/*使用客户区绘图类,这个是比较常用的*/
//CClientDC dc(this);//CClientDC的构造函数,使用当前窗口句柄值做为参数 //CClientDC dc(GetParent());//得到关于父类窗口一个设备上下文 dc.MoveTo(m_ptnOrigin); dc.LineTo(point);
/*使用CDC(MFC)关于作图对HDC一个封装*/ CDC *pDc; pDc = GetDC();
pDc->MoveTo(m_ptnOrigin); pDc->LineTo(point); ReleaseDC(pDc);
// TODO: Add your message handler code here and/or call default //作图
/*调用SDK函数获取设备上下文句柄 HDC hdc;
hdc = ::GetDC(m_hWnd);//这个m_hWnd是CWnd类中的保护成员, 保存窗口句柄, //而CLesson3View类是从CWnd类继承来的,所以也有这个成员 MoveToEx(hdc, m_ptnOrigin.x, m_ptnOrigin.y, NULL); LineTo(hdc, point.x, point.y);
::ReleaseDC(m_hWnd, hdc); // 在使用完设备上下文句柄后一定注意释放*/