MFC高级编程学习笔记
深入浅出MFC学习笔记
AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass *pNewClass) {
pNewClass->m_pNextClass = CRuntimeClass::pFirstClass; CRuntimeClass::pFirstClass = pNewClass; }
在 MFC 中保存了一棵类的家族树,CObject 是根结点,其他的类都是他的后代(有几个特 殊的除外,如: CPoint 等)。由于类的家族树存放的是类的信息——不是对象的信息,因此 只需要保存一个就够了,所以 MFC 将这棵树保存为 static 类型。
MFC 类的家族树和数据结构中的树并不相同,普通的树通过跟结点就可以访问所有的结点 (包括叶子)。但在 MFC 中却不行——它只能逆向地从叶子结点向根结点方向访问(从父 结点访问不到子结点)。
size_t n, size_t size, int (*cmp)(const void *keyval, const void *datum)); 想一想开发 bsearch 函数的人怎么会知道两个元素的是什么,怎么比较大小呢?因此就必须 留给用户要自己定义 cmp 函数了! 回调函数一般都有固定的格式(不知道是否会用变参数的情况),不然可能会发生错误。回
void main() {
A *pa = new B; pa->display(); }
执行的结果却打印是:class B
让人感觉不解的地方就是 pa 明明是类 A 的指针,却是执行了类 B 的函数(不可原谅)!!! 其实有这种感觉的人在不知不觉中就犯了一个形而上的错误:用 C 语言的函数行为来套用 display()的行为。在此我想提醒一点:把 C++当作一个新的语言,C 只是参考,不是金科玉 律,切记!!!
MFC学习笔记
MFC程序也有一个WinMain函数,这个函数是我们在编译链接的时候由链接器将WinMain函数链接进来的。
这个函数在APPMODUL.CPP中。
带有Afx的属于应用程序框架类的函数,应用程序框架是辅助我们生成应用程序的框架模型,这个框架模型把很多类或者类与类之间做了一个有机的集成提供给我们,我们可以根据框架模型提供的类库来设计我们自己的应用程序,Af即Application frame 看看这些类如何和我们WinMain函数关联到一起的?CmainFrame的名字是不会变的,其它的都是C+工程名+App/Doc/View命名。
class CTestApp : public CwinApp,可以看到CtestApp是从CwinApp派生出来的。
当我们双击CtestApp这个类时,我们可以看到VC++6.0上面显示我们进入了Test.h头文件中,当把CtestApp展开时,然后双击任何一个函数名,包括构造函数名,析构函数名…我们可以看到VC++6.0上面显示我们进入了Test.cpp源文件中。
且这种情况和我们直接从Fileview 资源卡中直接进入相应的头文件和源文件是一样的效果。
其它类也是相似的操作进入头文件和源文件。
不管是全局变量还是在全局对象CTestApp theApp;,它们都是在程序运行之前,也就是在入口函数WinMain函数加载之前,就已经为它们分配好了内存空间,作为全局函数,就要调用构造函数创建内存空间。
所以是先运行全局对象CTestApp theApp,调用它的构造函数,然后才运行WinMain。
为什么要定义一个全局对象呢?为什么要让它在WinMain之前完成呢?全局对象theApp又有什么作用?CtestApp是从CwinApp派生出来的,theApp是应用程序对象,是一个全局对象,每一个MFC程序当中有且仅有一个从CwinApp派生出来的类,也只能有一个应用程序类实例化的对象,它就表示了我们应用程序本身。
VCMFC学习笔记六:几个小知识(I)--全域函数,数据类型,CWnd和HWnd等
VCMFC学习笔记六:几个小知识(I)--全域函数,数据类型,CWnd和HWnd等1.常见的Afx全域函数AfxWinInit 被WinMain调用的一个函数,用做MFC GUI 程序初始化的一部份AfxBeginThread 开始一个新的执行线程AfxEndThread 结束一个旧的执行线程AfxMessageBox 类似Windows API 函数MessageBoxAfxGetApp 取得application object(CWinApp衍生对象)的指针AfxGetMainWnd 取得程序主窗口的指针AfxGetInstance 取得程序的instance handleAfxRegisterClass 以自定的WNDCLASS 注册窗口类别MFC独特的数据类型3. CWnd和HWndHWND是Windows系统中对所有窗口的一种标识,即窗口句柄。
这是一个SDK概念。
CWnd是MFC类库中所有窗口类的基类。
微软在MFC中将所有窗口的通用操作都封装到了这个类中,如:ShowWindow等等,同时它也封装了窗口句柄即m_hWnd成员。
由HWnd得到CWnd*:CWnd wnd;HWnd hWnd;wnd.Attach(hWnd);通常一个窗口资源已经和一个CWnd类的对象关联起来的,由于一般来说这个类是自己创建的,所以自然知道怎么得到指向这个类的指针。
由CWnd获取HWnd就容易多了,因为它的一个成员m_hWnd就是所对应窗口的句柄。
wnd->m_hWnd;这里再提一下封装的概念:MFC是对Windows API的封装,使用OOP是对Windows编程的另外一种观点。
MFC认为一个程序是一个对象(CWinApp),该对象管理窗口(CView或CDialog和CFrameWnd)以及该程序所使用的数据(CDocument)。
CWnd是CView和CDialog的父类,主要负责管理程序生成的窗口。
MFC 学习小笔记
7.VS 2005以后的自定义消息处理函数必须为LRESULT xxxx::UpdateMyCtrl(WPARAM hkey, LPARAM lkey)格式!
8.在界面中,坐标处理与数学相同,但是界面处理中Y轴向上为负数,向下为正!
9.ScreenToClient(crect),将控件的坐标转为基于父窗体坐标
23.写UI进程一搬用继承CWinThread和RUNTIME_CLASS(class name)创建线程即启动线程!
obk = mdc.SelectObject(&mbk); //选择绘制对象如钢笔的GDI。返回已替换的对象的指针
mdc.FillSolidRect(0,0,width,heigh,bkcolor); //用纯色填充矩形。
16.一个线程是否拥有消息队列要看它是否调用到了ui模块的功能
如果没有的话,就共用主线程消息队列
17 ::sendmessage vs sendmessage 第一个是系统的,第二个是封装在cwnd类中,第一个可以指定发送目标,第二个个人认为默认发送给自己.
18.CWebBrowser2 类,过
4. CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)xxx,LPVOID(yyy),0,&idtimer) //创建线程,已知XXX为线程函数名,YYY为参数
5.IsIconic() //判断窗口是否为最小化(图标)、
1.双重缓冲:
CDC mdc; //主要思路就是先创建一个虚拟dc和一张虚拟位图,用于将图像输出到虚拟设备上,
//内容在虚拟设备挥好后再输出到真实dc上显示出来,这样在要输出的时候才输出,提高了绘图效率
MFC笔记
文档与视图的关系1。
文档与视图的关系默认情况下,利用MFC应用程序向导创建的应用程序,其主干是文档类和视图类。
MFC 类库中的文档/视图实现将数据本身同其显示分开,并且与用户对数据的操作分离。
数据的所有更改都通过文档类管理。
视图只调用接口来访问和更新数据。
在具有文档/视图结构的应用程序中,MFC文档即为数据源。
文档对象将数据读出或写入永久存储区。
该文档还可能提供到数据所驻留的任何位置(如在数据库中)的接口。
一个单独的视图对象可管理数据显示,包括在窗口中呈现数据,用户选择或编辑数据。
该视图从文档获取显示数据,并将所有数据更改传递回文档。
MFC框架中可见性最大的部分就是文档与视图,它们一起处理用户的输入并绘制结果数据的文本或图形。
文档还承担在数据更改时更新视图的任务。
#defined问题#define AFX_WNDCLASS(s) \_T( "AFX ")_T(s) _T( "42 ") _STA TIC_SUFFIX _UNICODE_SUFFIX _DEBUG_SUFFIX宏定义不但可以定义常量,还可以定义函数.这个就是定义了一个用来联接字符串的函数.当调用AFX_WNDCLASS( "Wnd ")时.它的返回值就是AFX_Wnd_42_STA TIC_SUFFIX_UNICODE_SUFFIX _DEBUG_SUFFIX对于“\”仅仅是换行,也就是把两行数据连接起来框架窗口框架窗口的作用有二:一是为视图提供可视的边框,二是响应标准的窗口信息框架窗口可以分为两类:应用程序主窗口和文档窗口。
单文档程序中,主窗口就是文档窗口。
主窗口是从CFrameWnd派生的。
afx_msgAfx前缀是微软MFC一个小组的名称简写,并没有别的意义,Afx_msg消息声明:如下在头文件(DrawView.h)中声明消息响应函数原型。
//{{AFX_MSG(CDrawView) //注释宏afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//}}AFX_MSG //注释宏说明:在注释宏之间的声明在VC中灰色显示。
MFC学习笔记
//销毁窗口消息响应函数 void my_OnDestroy(HWND hwnd) {
PostQuitMessage(0); }
//左键按下消息响应函数 void my_LButtonDown(HWND hwnd) {
MessageBox(NULL,TEXT("鼠标左键按下"),TEXT("提示"),MB_OK); }
//样式(此处表示长或宽变化都
要重新绘制:redraw)
WndClass.lpfnWndProc = WndProc;
//过程函数名
WndClass.cbClsExtra = 0;
//窗口类相关额外参数
WndClass.cbWndExtra = 0;
//窗口实例相关的额外参数
WndClass.hInstance = hInst;
//消息循环 //这几行代码相当于汽车的发动机,让程序不断地运行 /*在程序的生存期中,Windows向他发送消息来报告用户或环境中其他部分所采取的动作,这些 消息放在一个队列中,用GetMessage可以取出消息*/ /* MSG {
HWND; 所属窗口句柄
UINT; 消息标识符 WPARAM; 消息附加信息 LPARAM; 同上 DWORD; 投递到消息队列时间 POINT; 鼠标当前位置 } */ while(GetMessage(&Msg,NULL,0,0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); }
}
m_strAddr = TEXT("");
UpdateData(FALSE);
}
index = m_ctrlAddr.GetCurSel();
MFC笔记
GetDlgItem:根据ID获取一个子窗口的对象地址(包含窗口句柄) GetDlgItemText和SetDlgItemText:根据ID获取或设置一个子窗口标题文字 GetDlgItemInt和SetDlgItemInt:根据ID获取或设置一个子窗口内显示的数字 GetDlgCtrlID和SetDlgCtrlID:根据窗口对象内的句柄获取或设置该窗口的ID GetParent和IsChild:这两个函数是等价的 GetWIndow: GetNextWIndow:
InitDialog函数用于初始化对话框中的子控件,可操作子窗口 Create函数主要用于 通用窗口的创建函数,如菜单、工具条等,窗口还未显示出来, 只有父窗口,子窗口还没创建 在非模式对话框中: 在使用EndDialog函数关闭时,只有隐藏没有真正关闭 使用DestroyWindow函数进行真正关闭
3—4讲,24分18秒
系统消息和非系统消息
• 系统消息编号:1—WM_USER-1 • 非系统消息:消息编号要大于1024,主要 用于传递数据
SendMessage函数和PostMessage函数的区别: 二者的功能: 能够向指定的窗口发送窗口消息,既可以是本进程内窗口 也可以是其它进程的 可以发送系统和非系统消息 SendMessage是阻塞型函数,用于调用指定窗口的内部程序,直到窗口 程序处理完毕后再返回 是非阻塞型函数,是将一个消息寄送到指定窗口内的消息 队列后立即返回
步骤如下: 1.定义自己的消息宏,如UM_ADD等,消息编号必须是大于 WM_USER,因为从1到WM_USER是系统消息; 2.自动添加消息处理函数 3.将“自定义的消息宏”和“消息处理函数”绑定,利用ON_ MESSAGE宏实现; 4.添加自己的代码,实现具体的功能
MFC心得
MFC学习心得时光如梭,不知不觉短学期已经结束一个月左右了。
对于MFC,这种c++的高级应用,从陌生到熟悉,从茫然到大致了解,从不屑一顾到很感兴趣,在编写飞行棋这个游戏的过程中感触良多,也收获了许多。
MFC跟以前的控制台编程有比较大的差异,实现了部分可视化编程。
对于其中复杂的类和函数,刚开始的时候感到相当的恐慌。
虽然在暑假的时候有看过一些书,但到真正做起来却仍然觉得很吃力。
第一次上MFC的课,老师一下子讲了很多东西,主要是控件,对于如此繁复的知识感觉一片茫然。
整个理论课上了四节,虽然老师也讲了一些东西,但是对于我们要做的系统却是远远不够的。
所以,很多东西都需要我们自学,到图书馆借书,到网上查找资料,问同学,问老师……我们使用各种方法获取知识。
必须学会自学,这是短学期的编程课带给我的一大感触。
虽然我们需要做的只是一个小型的游戏,但对于初次接触窗口编程的我们难度依然是非常大了。
但是,我们克服了,通过我们的团结协作。
要学会团结协作是我另一大感触。
小组中各个组员的通力合作是编程工作能够顺利进行的一大关键,我们进行了明确的分工,却又能互相合作,互相参考,互相帮助。
只有这样,才会有最后的飞行棋游戏新鲜出炉。
在编程过程中,我主要负责的部分是图形设计和界面美化部分。
这部分的特点是:既与大一所学的控制台编程紧密联系,又必须要和现在所学的窗口程序编程相衔接。
代码基本上靠逐行输入,考验的是自己的逻辑思维能力和严谨态度。
其实,这部分的代码并不是特别多,所以编写代码的工作也并不是很难的。
最磨练人的耐性的是将写好的代码进行调试。
由于程序长度相对于原来的编程根本不属于同一个数量级,所以调试理所当然地变得痛苦起来。
并且,这些代码基本上在编译时都能够一次通过,但在实际运行时却老是出错,检查算法和语法又不得要领。
这个时候,就不得不耐着性子,用调试工具逐行调试了。
学会了一些调试技巧,这不得不说是编程过程中我的一大收获。
很久以前,我认为程序就是在头脑中思考一下就立即OK,而且程序先写出来再说, 然后再改就是,人的认识总是慢慢前进的!经过了短学期的编码和试验,彻底打破了以前的一些思维,其实程序只是人的思维的体现而已,因而重要的是思想,所以在构架整体框架的时候,先写一些程序验证是很必要的,而在程序开发的过程中,其如果对工程不是很了解的阶段,也只能算是在为整体框架做必要的验证,所以一般的工程的周期长于我们想象的那样!尽管MFC这门课程已经结束了,但是我还会继续学习下去,希望自己将来能够对编程有更加深入的了解。
MFC学习笔记-匡桂明
第一讲:MFC:Microsoft Foundation ClassAPI: Application Programming Interface按资源的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各类型的句柄。
WM: Window MessagewParam和lParams都是整型。
Specifies additional information about the message. The exact meaning depends on the value of the message member。
WORD:16位的整数。
DWORD:Double WORDtime : 表示消息被投递出去的时间。
pt: 指示了消息被投递时光标在屏幕中的位置。
屏幕坐标通常是以左上角为原点,向右X坐标增加,右下Y坐标增加。
DC Device-Context::GetDC(&hwnd):传入的参数是一个窗口的句柄,这个hwnd可以类比是要画图的那块画布的标识。
得到一个DC,用完后要ReleaseDC(),否则会造成内存泄露。
GetDC() 和ReleaseDC()成对使用。
BeginPaint() 和EndPaint()成对使用。
An application should not call BeginPaint except in response to a WM_PAINT message. Each call to BeginPaint must have a corresponding call to the EndPaint function第二讲:在C语言中,结构体里面是不允许有函数的,但是C++中支持结构体中包含函数在Struct中缺省情况下所有的成员是public的,但是class中缺省的情况下成员是private的第三讲:WinMain函数在C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC的APPMODUL.CPP文件中(_tWinMain函数)全局变量或者全局对象是在main函数加载之前就已经为它们分配内存空间。
MFC第四章心得笔记
一.编写Windows程序的方法:(1)利用Win32应用程序接口提供的函数,用标准的c或c++编写应用程序。
(2)利用MFC提供的类作为基类,采用面对对象的的程序设计方法,用c++语言编写。
(3)即利用MFC又利用MFC AppWizard[exe]向导生成基本的MFC应用程序框架,然后按照MFc 机制和原理向应用程序添加具体的应用代码。
资源:窗体,对话框,控件和菜编写MFC的一般步骤:(1)根据应用程序的特性和外观界面要求在建立程序时勾选对应的选项,创建一个框架。
(2)利用资源编辑器为程序编辑或添加资源,如编辑菜单,添加对话框等。
(3)利用ClassWizard类向导或手工添加类、成员变量和成员函数(4)根据程序功能要求编写具体的函数代码(5)编译、链接程序(6)测试程序的各项功能vc++类程序由头文件和源文件支撑。
头文件包括指明派生类、声明成员变量、和成员函数。
源文件主要定义成员函数的实现代码和消息映射。
二.应用程序函数介绍CAboutDlg 对话框类CMainFrame 主框架类CView 视图类CDoc 文档类CApp 应用程序类1.框架窗口类头文件MainFram.h CMainFrame类是CFrameWnd类的派生类,主要负责标题栏,菜单栏,工具栏和状态栏。
声明了工具栏m_wndToolBar、状态栏m_wndStatusBar两个成员变量。
四个函数:(1)AssertValid() 主要用于诊断对戏那个是否有效(2)Dump()输出对象的状态消息主要用于调试的(3)OnCreate()主要用于创建工具栏m_wndToolBar和状态栏m_wndStatusBar 通过调用OnCreateClient()函数创建的。
(4)PreCreateWindow();虚函数,创建一个非默认风格的窗口,可以重载该函数,在函数中通过修改CREATESTRUCT结构参数cs来改变窗口类,窗口风格,窗口的大小和位置。
MFC学习笔记之二
MFC学习笔记之二前面已经知道,在一个windows程序中,winmain函数作为程序的入口函数,一个程序的是:设计窗口(给窗口设置相应的属性)注册窗口创建窗口显示并且更新窗口消息循环;但是当创建一个MFC程序时候,并没有看到winmain函数之类的东西,并且之前的程序框架与MFC也大有不同。
现在,先来看看MFC中的程序框架以及程序运行机制吧。
因为MFC是对其SDK的封装,所以程序运行规律方式应当是一样的。
在MFC程序中,同样还是有winmain函数参加,但是这个WinMain函数是在程序编译衔接时,由链接器将该函数链接到程序的。
知道WinMain 的存在后,那么WinMain又是怎么跟其他类组织在一起的呢?(1)CxxxApp中,有一个theApp对象的全局对象,该对象就表示了应用程序本身。
对于全局对象theApp,它是在程序进入WinMain函数之前为其分配的空间,同时,定义其时候会调用它的构造函数。
在程序中看到CxxxApp是CWinApp的子类,当调用CxxxApp的构造函数之前,会调用其父类的构造函数。
程序的初始化在CWinApp构造函数完成。
(2)AfxWinMain函数:WinMain函数事实上是通过调用AfxWinMain函数来完成其功能的。
AfxWinMain源代码在MFC源代码的WINMAIN.CPP文件中。
AfxWinMain首先通过调用AfxGetThread函数获得一个CWinThread 类型的指针,接着调用AfxGetApp函数获得一个CWinApp类型的指针。
因为CWinApp继承自CWinThread,AfxGetThread函数事实上返回的是AfxGetApp函数的结果,因此上面所说的AfxGetThread函数获得一个CWinThread类型的指针,接着调用AfxGetApp函数获得一个CWinApp 类型的指针所得到的两个指针事实上是全都的。
都指向theApp全局对象。
MFC编程笔记(更新)
MFC编程笔记(更新)目录控件及其变量 (1)多线程编程 (3)信号量使用 (4)定时器使用 (4)Socket编程 (5)关于Socket的一些使用的小技巧 (10)控件及其变量每个控件有一个ID号标识其本身,通过ID号,可以获得控件的句柄,通过句柄可以调控控件类的各种操作。
MFC中的控件可以在ClassWizard中为其添加变量,其变量有两种:成员变量及控制变量。
(View->ClassWizard->Member Variables)其中成员变量代表控件的值,可以通过成员变量随时对控件的值进行修改。
而控制变量代表控件本身,通过控制变量,可以调用控件类的各种操作。
跟句柄的作用是类似的。
对控件的内容进行操作的方式:(以获取以及修改文本框的内容为例)方式1:通过获得控件的指针,来调用对于控件的操作。
例子:Char str[10];10);GetDlgItem(IDC_EDIT1)->GetWindowText(str,GetDlgItem(IDC_EDIT1)->SetWindowText(str);方式2:直接通过函数对控件内容进行操作。
例子:num;intCharstr[10],str,10);GetDlgItemText(IDC_EDIT1,str);SetDlgItemText(IDC_EDIT1,=GetDlgItemInt(IDC_EDIT1);Numnum);//第三个参数是确定有符号是否生效,默认为真, SetDlgItemInt(IDC_EDIT1,即可进行有符号数的运算。
方式3:将控件关联成员变量,用成员变量控制控件上面的数据。
原理:添加变量后,会发现在AFX_DATA的宏之间定义了新的变量在x.Dlg的构造函数当中分别对变量进行了初始化0。
其变量与控件的关联是在DoDataExchange中完成的。
其函数类型类似于:DDX_Text(pDX, IDC_EDIT1, m_num1); DDX的函数有很多,它主要针对不同的控件来应用。
MFC 学习笔记之 CRect类
LPCRECTlpRect2
) throw( );
Determines whetherCRectis empty.
BOOL IsRectEmpty( ) const throw( );
Determines whether the top, left, bottom, and right values ofCRectare all equal to 0.
CSize Size( ) const throw( );
Makes the dimensions of theCRectequal to the subtraction oflpRectSrc2fromlpRectSrc1.
BOOL SubtractRect(
LPCRECTlpRectSrc1,
LPCRECTlpRectSrc2
void MoveToY(
inty
) throw( );
Determines whether the specified point lies withinCRect.
BOOL PtInRect(
POINTpoint
) const throw( );
Sets the dimensions ofCRectto the specified coordinates.
BOOL EqualRect(
LPCRECTlpRect
) const throw( );
Calculates the height ofCRectby subtracting the top value from the bottom value.
int Height( ) const throw( );
深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真类
第三章:MFC六大关键技术之仿真:类型识别深入理解MFC的内部运行原理,是本次学习《深入浅出MFC》的主要目的。
要模仿的六大技术包括:1:MFC程序的初始化过程。
2:RTTI(Runtime type identification)运行时类型识别。
3:Dynamic creation 动态创建4:Persistence永久保存5:消息映射6:消息传递。
RTTI(运行时类型识别)IsKindOf能够侦测某个对象是否属于某种类。
即判断某一对象所属的类是否是父类或当前类;要达到动态类型识别的能力,必须在构建类继承体系时记录必要的信息,这被称为类型型录表。
MFC以链表的方式建立了此表。
类型型录表的每个元素为CRuntimeClass类型,其定义为:1class CRuntimeClass23{45public:67LPCSTR m_lpszClassName;//对象所属类名89 Int m_nObjectSize;//对象大小1011UINT m_wSchema;//模式号1213 CObject *(PASCAL*m_pfnCreateObject)();//构建函数抽象类为NULL1415 CRuntimeClass *pBaseClasss;//基类CRuntimeClass对象指针。
1617 Static CRuntimeClass *pFirstClass;//链表头指针。
1819 CRuntimeClass *m_pNextClass;//下一指针。
2021};MFC使用此类作为每个类的成员变量。
使用宏定义为每个类定义了自己的CRuntimeClass成员变量。
DECLAR_DYNAMIC和IMPLENMENT_DYNAMIC宏使用这两个宏将CRuntimeClass对象不知不觉放到类之中。
DECLARE_DYNMIC宏定义如下:22#define DELCARE_DYNMIC ( class_name ) \2324public:\2526static CRuntimeClass class##class_name \2728virtual CRuntimeClass *GetRuntimeClass()const;##用来告诉编译器把两个字符串连接起来。
MFC笔记
MFC 课程特点一个编程框架的学习基于框架,添加和修改代码代码的调试技巧断点调试。
call stack 查看函数的调用关系由理论到实践实践到理解理论的过程课程连续性比较强掌握MFC课程的知识点之外还需要掌握代码的调试技巧阅读别人的代码day01一 MFC的概念Microsoft Foundation Classes 微软基础类库包括两个方面:1 一个编程框架,快速开发。
2 庞大的类库,可以满足我们基本的编程要求二 MFC发展历程Borland公司-----菲利普斯.康和安德鲁斯.海尔斯伯格在1983年创建,以编译器起家的。
早在doc年代,Borland c/c++ , microsoft c/c++在win3.x 年代, Borland c/c++ 3.0/3.192 年 visual c++ 1.0 开始挖墙角,Borland公司主要开发人员(尤金.王)离职,Microsoft 与 borland 的编译器之争。
visual c++ 2.0 集成的MFC3.0 主要面向32位的程序开发。
visual c++4.0 集成的MFC的4.0 加入了对internet的支持visual c++5.0 集成ATL库。
98年9月份推出visual c++ 6.0 对类库及界面做了优化。
安德鲁斯.海尔斯伯格 c#语言之父。
vs2010,集成MFC 10.0三、展开讲解MFC1 MFC类的介绍继承关系的介绍1.1 CObject类及派生类1.1.1 CObject类—MFC的顶层父类,定义了MFC的一些基本特性和机制,例如运行时类信息动态创建和序列化等。
1.1.2 CCmdTarget类----在该类中,对命令消息做了相应的处理(例如点击菜单工具栏产生wm_command消息。
)如果一个类处理命令消息,继承自CCmdTarget。
1.1.3 CWinApp类—应用程序类,几乎所有的MFC程序都要使用该类。
贯穿了整个程序的始终。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
No.3 /*SystemParametersInfo*/
//设置桌面壁纸
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,lpPath,0);
//屏蔽掉系统键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE);
(4)获取函数指针:PFUNC pFunc=(PFUNC)GetProcAddress(hdll,"函数名");
(5)调用函数后,释放DLL:FreeLibrary(hdll);
3.资源的导入使用(显式链接,以菜单导入为例)
(1)进行1中的步骤(1)(2);
(2)载入DLL库:HINSTANCE hdll=LoadLibrary("*.dll");
原型:
WINSHELLAPI HINSTANCE APIENTRY ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd);
2.文件删除:
BOOL DeleteFile(LPTSTR lpFileName);
3.文件复制:
BOOL CopyFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists);其中参数bFailIfExists告诉系统当目标文件存在时如何操作,当bFailIfExists为true时,如果目标文件存在,则函数执行失败;当bFailIfExists为false时,如果目标文件存在,则覆盖目标文件。
(2)导出类:在H文件的类声明第一行改为“class AFX_EXT_CLASS 类名”即可;
(3)资源导出:创建或导入资源过程与平时一样,只要最后将所创建资源ID号的定义代码(如“#define IDR_MENU_TEST 1000 ”)拷贝到H文件中即可;
(4)完成上述操作,点击Build,则在Debug文件夹中生成dll文件和lib文件,注意保留H文件。
GetUserName(LPTSTR lpName,LPDWORD lpSize);
GetComputerName(LPTSTR lpName,LPDWORD lpSize);
lpSize表示字符串长度的最大值。
/*获取程序的全路径名*/
DWORD WINAPI GetModuleFileName(HMODULE hModule,LPSTR lpFilename,DWORD nSize);
No.9 /*使用动态链接库*/
1.函数与类的导入使用(隐式链接)
(1)包含原链接库文件对应的H文件;
(2)将dll文件和相应lib文件复制到工程文件夹下;
(3)在【Project】->【Settings】->【Link】选项卡中,【Object/Library modules】框中填入lib文件的文件名和后缀名;
函数名n @序号n
2.扩展MFC动态链接库的生成(创建时类型选择第三个--MFC Extension DLL(using shared MFC DLL))
(1)导出普通函数:在H文件的函数声明前加上 “extern "C" AFX_EXT_API”即可(AFX_EXT_API表示_decspec(dllexport)或_decspec(dllimport),也可按第二种方法导出,在DEF文件中添加函数列表);
(3)菜单加载与绘制:
HMENU hmenu=LoadMenu(hdll,MAKEINTRESOURCE(资源ID));
::SetMenu(this->GetSafeHwnd(),hmenu);
No.4 /*文件处理之浏览文件*/
1.定义:
OPENFILENAME file={0};
2.为file.lpstrFile申请空间:
char lpPath[260]={0};
file.lpstrFile=lpPath;
3.为file赋其他初值:
file.lStructSize=sizeof(OPENFILENAME);
file.lpstrFile=lpPath;
file.nMaxFile=260;
file.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files\0*.*\0\0";
file.nFilterIndex=1;
4.调用GetOpenFileName函数:
BOOL IsNormal();
BOOL IsReadOnly();
BOOL IsSystem();
BOOL IsTemporary();
No.6 /*文件处理之一般处理*/
1.进入文件夹(设置工作文件夹):
chdir(LPTSTR path);
SetCurrentDirectory(LPCTSTR lpPathName);
2009.07.31
No.1 /*调用外部程序*/
::ShellExecute(NULL,"open","NOTEPAD.EXE","E:\\学习\\计算机学习\\面向对象程序设计\\学习笔记\\MFC学习笔记.txt","E:\\学习\\计算机学习\\面向对象程序设计\\学习笔记\\MFC学习笔记.txt",SW_SHOWDEFAULT);
(1)Dots: "."表示本层目录,".."表示上一层目录,此时ff.IsDots()返回值为TRUE;
(2)Directory: 子目录,此时ff.IsDirectory()返回值为TRUE;
(3)文件
4.对每个查找到的文件可以查看文件信息:
(1)BOOL GetCreationTime(CTime &); 或BOOL GetCreationTime(FILETIME*);
BOOL GetLastAccessTime(CTime &); 或BOOL GetLastAccessTime(FILETIME*);
BOOL GetLastWriteTime(CTime &); 或BOOL GetLastWriteTime(FILETIME*);
(2)CString GetFileName(); //文件名.后缀名
获得自己的全路径名时第一个参数用NULL,路径名保存在lpFilename中。
2009.8.1
No.8 /*动态链接库(dll文件)的生成*/
1.非MFC动态链接库生成
(1)创建 Win32 Dynamic-Link Library 工程;
(2)方法一:在H文件中要导出的函数前加上 extern "C" _decspec(dllexport),编译链接即可在Debug文件夹下产生dll文件和lib文件。
(3)CString GetFilePath(); //全路径+文件名.后缀名
(4)CString GetFileTitle(); //只有文件名
(5)CString GetRoot();
(6)DWORD GetLength(); 或__int64 GetLength64();
(7)BOOL IsHidden();
(4)若原H文件中有_decspec(dllexport),则改为_decspec(dllimport);
则动态链接库中的类和函数均可正常使用。
2.函数的导入使用(显式链接)
(1)进行上面的步骤(1)(2);
(2)定义函数指针类型:typedef (*PFUNC) (形参列表);
(3)载入DLL库:HINSTANCE hdll=LoadLibrary("*.dll");
No.2 /*以命令行方式调用外部程序*/
::WinExec("NOTEPAD.EXE E:\\学习\\计算机学习\\面向对象程序设计\\学习笔记\\MFC学习笔记.txt",SW_SHOWDEFAULT);
原型:
WINBASEAPI UINT WINAPI WinExec(LPCSTR lpCmdLine,UINT uCmdShow);
AnsiString ExtractFileName(AnsiString FileName);
7.返回指定文件的扩展名:
AnsiString ExtractFileExt(AnsiString FileName);
8.创建新文件夹:
BOOL CreateDirectory( LPCTSTR lpPathName,LPSECURITY_ATTRIBUTES lpSecurityAttributes);lpSecurityAttributes为安全属性。
if(GetOpenFileName(&file)!=0)
{...};
就可得到文件名,在lpPath所指字符串中。
No.5 /*文件处理之搜索文件*/
1.初始化,设置搜索条件(路径,后缀名等,例中由dir决定):
CFileFind ff;
CString dir("D:\\MyDir\\*.txt");
9.移动存在的文件或目录:
BOOL MoveFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName);