2024年3月6日发(作者:)
MFC
hierarchy chart(类库列表)
MFC与Win32
1 win32:函数,使用API一步一步搭建应用程序。(常使用FileView操作)
2 MFC编程:实现仍然调用API函数,但是是用类封装API函数,使用向导自动生成应
用程序框架。(常使用ClassView操作)
2.1需要掌握的技能
2.1.1断点调试
2.1.2堆栈调用的查看
MFC课程内容
1 MFC:MFC的六大机制,文档式架构,常用的MFC类,(10--12)。
2 COM(组件对象模型):COM的原理和应用(6)。
3 ADO/Socket:MFC访问数据库以及一些简单的网络编程。
MFC应用程序编程
1 MFC的历史 : 92(VC1) 98(VC6)……………………….
2 MFC库基础:
2.1 MFC库,微软基础类库。封装了Windows应用程序编程的各种API以及相关机制
的C++类库
3 类库的相关头文件件
★afx-application framework(应用程序框架 x)
3.1
用来提高编译速度的。(*.pch)(头文件是不参加编译的 但是他参与生成*.pch)
3.2
3.3
MFC应用程序的类型
1 支持MFC的控制台应用程序(控制台的第四个选项)
1.1 多了一个CWinApp(应用程序类,封装类应用程序启动过沉重所涉及到得相
关信息)的全局对象(必须有,而且只能有一个)
1.2 主函数中多了一个AfxWinInit函数,初始化MFC库中的相关信息
2 MFC库程序
2.1 MFC支持的静态库
2.2 MFC支持的动态库
2.2.1 MFC规则库(shared MFC DLL)-可以被各种应用程序调用(非MFC程
序,没有MFC类也可以调用)
★还是有一个CWinApp派生的CMFC_DLLApp类对象
2.2.2 MFC扩展库(using shared MFC DLL)-只能被MFC库所编写的应用程
序所调用(对原有的MFC类扩展)
★DllMain主函数只能被MFC程序调用
3 MFC应用程序-----(注意看父类 ,子类名字可能不一样)
3.1单文档视图应用程序
★CWinApp 应用程序类
★CAboutDlg(对话框-生成关于窗口-和框架没有任何关系)
★CMainFrame(父类是:CFrameWnd)(应用程序主框架窗口类-生成应用程
序的主框架-负责各个对象的协调工作)
★CDocument(它是父类)(文档类-看不到的很重要-管理数据)
★CView(它是父类)(视图类-显示数据并和用户进行交互)
★CSingleDocApp(父类是CWinApp)-(使用前面的3个类来创建对象)
3.2多文档视图架构
★CWinApp 应用程序类
★CAboutDlg(对话框-生成关于窗口-和框架没有任何关系)
★CView(它是父类)(视图类-显示数据并和用户进行交互)
★CDocument(它是父类)(文档类-看不到的很重要-管理数据)
★CMDIChildWnd(子框架窗口类,父类)
★CMDIFrameWnd(主框架窗口类,父类)
我们看到的子窗体其实是★CView和★CMDIChildWnd叠加的
3.3基于对话框的应用程序
★CWinApp 应用程序类
★CDialog(对话框窗口类)
★★m_pMainWnd保存主窗口地址
DoModal 显示对话框
MFC相关类的说明
1继承自CObject
1.1 CObject类:绝大多数MFC类的父类,提供了MFC库的一些机制
1 new/delete操作符,定义了与构造函数相关的内存分配函数
2 assert和dump调试,堆调试的支持
★3 运行时类信息-属于哪个类,还有类的层次结构
★4 动态创建
★5 序列化
1.2 CWinThread: 线程类。
1.2 CwinAPP类:封装了类应用程序,线程等的初始化信息,是应用程序开始创建
的第一个对象,并且也是结束前最后一个执行的对象,启动时应用程序类负责创建其余的对象。
1.3 CDocTemplate类:文档模板类,应用程序打开一个文档时,文档模板定义创
建什么的框架,文档和视图
两个子类CSingleDocTemplate(单文档)和CMultiDocTemplate(多文档)
(注意:InitInstance()函数)
1.4 CFramWnd类:框架窗口类
1.5 CSplitterWnd类:拆分窗口类
1.6 CControlBar类:工具栏类
1.7 CPropertySheet类:属性表单类-一个属性表单里面有很多属性页用
CPropertyPage类创建
1.8 CDialog类:对话框类
CCommonDialog通用对话框(各种颜色,字体,什么对话框)
COlePropertyPage-页对话框
1.9 CView类:视图类
1.10 控件类 :CAnimateCtrl视频类
CButton按钮类
CComboBox组合框类
CLIstBox列表框
1.11 CDucument类:文档类
1.12 CException类:异常处理类
1.13 CFile类:文件处理类 和序列化结合讲解
1.14 画图类:CDC:绘图设备上下文类-(相当于纸)
CGdiObject-(相当于笔)
5.1.15 集合类
CArray 动态数组-查询快-查找都是从头找,如果数组很大,查找效率低
CLIst 链表-底层双向链表-删除,插入块
Cmap 映射-快速查找-(key,value)
CFileFind-文件查找类-同CFile一块用
提供了各种数据结构的相关管理。
2非CObject的子类
第一个MFC程序
1 设置MFC开发环境
1.1修改头文件
1.2设置工程为使用MFC库(Seeting->Use MFC in a share DLL)
以下注意:
★加上::的是调用的全局Win32函数,不加调用的是该类的成员函数
★窗口类对象和窗口(句柄,内存空间标识)有很大区别,窗口类对象是
用来操作窗口的,对象创建出来并不是创建出窗口了
VC6断点调试的操作:
F9(设断点),F5(跳到下一个断点),F10(执行下一条语句),
F11(当前语句如果有函数能进入就进入,不能进入执行一条语句)
(ALT+F9)(打开断点调试列表),ALT+F8(代码自动对齐)
F12(选中宏或者类,能看原型,类型能看原型)
★堆栈工具条里面:下面的调用上边的(有时系统调用我写的,有时我写的函数调用系统的)
2程序的编写
★2.1 定义CWinApp类的子类,并且定义该类的全局变量
例:class CMyWinApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
CMyWinApp theApp;
★2.2 定义CFrameWnd类的子类(主框架窗口类)
例:class CMainFrame:public CFrameWnd
{
virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam );
};
★2.3 在CWinApp类的InitInstance函数中,创建CFrameWnd窗口,并显示
例:BOOL CMyWinApp::InitInstance()
{
//创建应用程序窗口
//创建框架窗口类对象
CMainFrame *pFrame=new CMainFrame();
//创建窗口
pFrame->Create(NULL,"MFC_Wnd");
//将窗口赋值成为当前用用程序的主窗口
m_pMainWnd=pFrame;
//显示主窗口
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateData();
return TRUE;
}
★ 2.4 实现CFrameWnd的WindowProc函数,处理消息
★ 例:LRESULT CMainFrame::WindowProc( UINT message, WPARAM wParam,
LPARAM lParam ){
switch(message){
case WM_PAINT:
PAINTSTRUCT ps={0};
CDC *hDc=BeginPaint(&ps);
hDC->TextOut(hDC,100,100,"Hello MFC",9);
EndPaint(&ps);
break;
}
return CFrameWnd::WindowProc(message,wParam,lParam);
}
MFC程序的启动-(入口函数机制)
1 程序的入口在哪?(MFC的第一个机制:入口函数机制)
★第一步:程序启动,调用CWinApp的构造,将CWinApp的对象theApp的地址保
存到模块状态信息中,将theApp的地址保存到线程状态信息中。
★第二步:WinMain调用AfxWinMain(内核自动调用,不是说哪个函数调用,要不
是声明了一个全局变量,它才是第一步)
★第三步:AfxWinMain函数的执行
3.1获取当前应用程序对象theApp(CFrameWnd类的子类的对象)的地址
使用AfxGetThread()函数从线程信息中获取
使用AFxGetApp()从模块信息中获取。
3.2使用AfxWinInit()初始化MFC库
3.3使用InitApplication()函数初始化应用程序数据
3.4调用CMyWinApp::InitInstance()函数创建并显示窗口
3.5调用App的Run函数进行消息循环处理
3.6结束MFC库,退出程序。
2 MFC的窗口创建过程和Win32创建过程一样
3 CWinApp类
应用程序封装类,父类是CWinThread,封装程序的初始化,信息,消息循环等。
InitInstance-程序的初始化函数,完成窗口的创建等初始化工作
ExitInstance-程序突出时调用的函数,完成资源释放等善后工作
Run-消息循环
OnIdle-空闲处理函数
m_pMainWnd-当前程序的主窗口
一般先创建窗口然后设置为主窗口:m_pMainWnd=pFrame;
窗口的创建-(窗口创建机制)
1 窗口的消息处理函数是AfxWndProcBase,但是窗口类设计时不是他
是Proc=DefWindowProc
2 窗口的创建过程
2.1 如果有的话加载菜单
2.2 调用CWnd的CreateEx创建窗口
2.2.1 PreCreateWindow设计并注册窗口类
此时是将DefWindowProc设置成为窗口的处理函数
2.2.2 调用AfxHookWindowCreate()创建钩子函数,在函数内部调用
SetWindowsHookEx创建WH_CBT(窗口创建就创建钩子),钩子
的处理函数是_AfxCbtFilterHook(Ctrl+F 能查找到在本文件定义
的函数的位置)
2.2.3 调用CreateWindowEx()函数创建窗口立即调用钩子函数
2.2.4 卸载钩子,并返回。
2.3在_AfxCbtFilterHook函数中
2.3.1 调用AfxGetAfxWndProc获取MFC提供的窗口处理函数的地址
2.3.2 使用SetWindowLong函数将该窗口处理函数设置成MFC提供的窗口处
理函数
为什么要替换?
消息处理-(消息映射机制)
不再是所有消息走一个函数而是一个消息对应一个消息处理函数
1 消息映射的使用
1.1在CMainFrame类的定义中,添加消息映射声明DECLARE_MESSAGE_MAP()(宏可没有分号)
1.2在CMainFrame类的实现中,添加消息映射实现宏
BEGIN_MESSAGE_MAP(className(实现类),baseclassName(实现类的父类))
END_MESSAGE_MAP()
1.3在类中定义并且实现消息映射的处理函数。
1.4在消息映射的实现宏中,添加消息与消息处理函数的对应关系
ON_MESSAGE(WM_CREATE(消息),OnCreate(消息处理函数的函数名称))
例:class CMainFrame:public CFrameWnd
{
DECLARE_MESSAGE_MAP()//消息映射声明宏
void OnMyCreate();
void OnMyPaint();
};
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)//消息映射实现宏
ON_MESSAGE(WM_PAINT,OnMyPaint)//对应关系
ON_MESSAGE(WM_CREATE,OnMyCreate)
END_MESSAGE_MAP()
宏的具体实现
★ DECLARE_MESSAGE_MAP()//消息映射声明宏
***************************替换消息映射声明宏代码**************************
private:
static const AFX_MSGMAP_ENTRY【1】 _messageEntries[];
protected:
static AFX_DATA const AFX_MSGMAP【2】 messageMap;
static const AFX_MSGMAP* PASCAL _GetBaseMessageMap();
virtual const AFX_MSGMAP* GetMessageMap() const;
★BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)//消息映射实现宏
ON_MESSAGE(WM_PAINT,OnMyPaint)//对应关系
ON_MESSAGE(WM_CREATE,OnMyCreate)
END_MESSAGE_MAP()
********************************消息映射实现宏*********************************
const AFX_MSGMAP* PASCAL CMainFrame::_GetBaseMessageMap()
{
return &CFrameWnd::messageMap; 【5】
}
const AFX_MSGMAP* CMainFrame::GetMessageMap() const
{
return &CMainFrame::messageMap;【6】
}
AFX_COMDAT AFX_DATADEF const AFX_MSGMAP CMainFrame::messageMap =
{
&CMainFrame::_GetBaseMessageMap,【3】
&CMainFrame::_messageEntries[0]【4】
};
AFX_COMDAT const AFX_MSGMAP_ENTRY CMainFrame::_messageEntries[]
=
{
{ WM_CREATE, 0, 0, 0, AfxSig_lwl,
(AFX_PMSG)(AFX_PMSGW)
(LRESULT (AFX_MSG_CALL CWnd::*)
(WPARAM, LPARAM))&OnMyCreate },
{ WM_PAINT, 0, 0, 0, AfxSig_lwl,
(AFX_PMSG)(AFX_PMSGW)
(LRESULT (AFX_MSG_CALL CWnd::*)
(WPARAM, LPARAM))&OnMyPaint },
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 }
};
2宏代码分析
1.2.1 _messageEntries[]数组(用结构保存每一个消息和其对应处理函数等消息信息,实
现消息映射机制)其类型为AFX_MSGMAP_ENTRY结构【1】
struct AFX_MSGMAP_ENTRY
{
UINT nMessage; // 消息ID或者标识(WM_XXXX)★
UINT nCode; // 通知码或者控制码(消息的分类)
UINT nID; // 空间的ID(是"0"的话代表窗口消息)
UINT nLastID; // 指定一个消息的ID范围的最大值
UINT nSig; // 消息处理函数的类型
AFX_PMSG pfn; // 处理这个消息函数的指针★
};
1.2.2 messageMap的类型AFX_MSGMAP(通过这个结构可以找到所有的相关父子类
中消息)【2】
struct AFX_MSGMAP
{
//保存“获得父类的AFX_MSGMAP函数”的指针(类似链表)
const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();【3】
const AFX_MSGMAP_ENTRY* lpEntries;//当前的_messageEntries[]数组的地址【4】
};
3.1 _messageEntries[]数组
静态数组,类型AFX_MSGMAP_ENTRY数组中的每个元素保存了消息ID和与之
对应的处理函数的地址。
3.2 messageMap
静态变量,类型是AFX_MSGMAP,分别保存了_messageEntries[]数组的地址,以
及_GetBaseMessageMap函数的地址
3.3 _GetBaseMessageMap()
静态函数,获取父类的messageMap变量的地址【5】
3.4 GetMessageMap()
虚函数,获取本类的messageMap变量的地址【6】
CMainFrame::GetMessageMap()
★|->messageMap
★|->_messageEntries[]
★|->消息ID,函数指针
★|->_GetBaseMessageMap()
☆|->CFrameWnd::messageMap
☆|->CFrameWnd::_messageEntries[]
☆|->CFrameWnd的消息ID,CFrameWnd的消息处理函数指针
☆|->CFrameWnd::_GetBaseMessageMap()
○|->CWnd::messageMap
○|->CWnd::_messageEntries[]
○|->CWnd的消息ID,CWnd的消息处理函数指针
○|->CWnd:: GetMessageMap()
◆|->NULL(直到空结束,链表结束)
3 作用
4 调用关系
1.5 执行过程
我们可以定义一些消息的处理,但是许多消息没有自己定义,根据处理机制中的链表关
系,一级一级一直向上找,直至CWnd调用默认处理函数DefWindowProc
★执行过程
1.5.1调用窗口对象的GetMessageMap()(虚函数不是静态的),获得当前类的messageMap
(静态的)地址pMessageMap
1.5.2从pMessageMap的_messageEntries[]数组中查找消息ID所对应的数组元素。如果
找到执行goto语句。
1.5.3如果没有找到,调用pMessageMap中的pBaseMap,获得父类的pMessageMap,
继续查找
1.5.4如果直到pMessageMap为空还没有找到,结束查找,调用 DefWindowProc的默
认处理函数
1.5.5使用查找到的lpEntry,根据数组元素lpEntry中的消息处理函数的类型,调用消息
处理函数。
★根据堆栈调用显示:
1 首先CWnd::WindowProc调用CWnd::OnWndMsg
RESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT lResult = 0;
if (!OnWndMsg(message, wParam, lParam, &lResult))
//直到CWnd都无这个消息,代表OnWndMsg执行失败,调用默认的DefWindowProc
lResult = DefWindowProc(message, wParam, lParam);
return lResult;
}
2 消息找到了,CWnd::OnWndMsg的执行过程
//首先调用当前的GetMessageMap()
const AFX_MSGMAP* pMessageMap; pMessageMap = GetMessageMap();
//进入消息映射链表循环中
for (; pMessageMap != NULL;pMessageMap = pMessageMap->pBaseMap)
{
if (message < 0xC000)
{
if ((lpEntry = AfxFindMessageEntry(pMessageMap->lpEntries,message,
0, 0)) != NULL)
{
pMsgCache->lpEntry = lpEntry;
AfxUnlockGlobals(CRIT_WINMSGCACHE);
goto LDispatch;//跳转到LDispatch
}
}
.........
}
3 执行LDispatch函数得过程(消息与处理函数的匹配)
int nSig;
nSig = lpEntry->nSig;//获得函数指针的类型
if (lpEntry->nID == WM_SETTINGCHANGE)
{
DWORD dwVersion = GetVersion();
if (LOBYTE(LOWORD(dwVersion)) >= 4)//根据不同的函数指针执行不同操作
nSig = AfxSig_vws;
else
nSig = AfxSig_vs;
}
switch (nSig)
{
default:
ASSERT(FALSE);
break;
..................
case AfxSig_lwl:
lResult = (this->*_lwl)(wParam, lParam);
break;
this->*:类的成员函数指针 pfn_lwl 消息响应函数的函数指针 调用CMainWnd
MFC消息的分类
消息的分类从不同的角度,有以下几种分类方式:
从消息的发送途径上看,可以分为队列消息和非队列消息
从消息的来源来看,可以分为系统消息和自定义消息。
★从消息的处理上看,可以分为窗口消息(命令消息)和控件消息(通知消息)。
1 窗口消息(标准消息)-宏实现ON_WM_XXX
大部分窗口,鼠标,键盘等消息,系统提供了标准的处理函数。
消息都是系统规定好的写法不需要自己注册,消息处理函数的写法也是规定好的,可以
通过F12查询
★例:消息映射宏实现:ON_WM_CREATE()
消息处理函数声明:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
2 命令消息
菜单,按钮,工具栏等消息也不需要注册,只需要根据消息来源ID处理。
代码中处理优先级先从位图,位图没有再走窗口,窗口没有最后走CWinApp全局变量)
宏实现:ON_COMMAND(ID,函数名称)
连续的ID段共用一个函数:ON_COMMAND(起始ID,结束ID,函数名称)
★例:消息映射宏实现:ON_COMMAND(1001,OnTest1)
ON_COMMAND_RANGE(1002,1003,OnTestRange)
消息处理函数声明://命令消息
afx_msg void OnTest1();
//一个消息函数响应多个控件的命令消息
afx_msg void OnTestRange(UINT nID);
函数实现:void CMainFrame::OnTestRange(UINT nID)
{
CString strTemp;
("%d",nID);
AfxMessageBox(strTemp);
}
因为窗口消息的处理走CWnd::OnWndMsg所以继承自CWnd的类就可以响应窗口消息
当使命令消息时根据判断跳出循环走CCmdTarget::OnCmdMsg的处理
所以继承自CCmdTarget的类就可以响应命令消息
3 通知消息-宏实现ON_EN_CHANGE(消息ID,处理函数)
控件发生变化通知父窗口,也不需要注册,通过添加的控件的ID来处理
★例:消息映射宏实现:ON_EN_CHANGE(1004,OnEditChange)
消息处理函数声明:afx_msg void OnEditChange();
消息处理函数实现:void CMainFrame::OnEditChange()
{
CWnd *pWnd=GetDlgItem(1004);
CString strText;
pWnd->GetWindowText(strText);
MessageBox(strText);
}
4 系统注册消息(用户自定义消息的一种)-进程间可以通讯
4.1注册消息
UINT RegisterWindowMessage( LPCTSTR lpString//消息的名称 );
返回消息的ID
4.2消息映射宏实现
ON_REGISTER_MESSAGE(注册消息的ID,处理函数)
4.3消息处理函数的原型
afx_msg LRESULT 函数名称(wParam,lParam)
★例:注册消息:
const UINT WM_USERMSG=::RegisterWindowMessage(_T("UserMsg"));
消息映射宏实现:
ON_REGISTERED_MESSAGE(WM_USERMSG,OnUserMsg)
消息处理函数声明:
afx_msg LRESULT OnUserMsg(WPARAM wParam,LPARAM lParam);
消息处理函数实现:
实现是通过SendMessage来实现,想在哪实现就在哪发送消息
可以消息套消息,例如按下一个按钮在按钮的消息处理函数中
发送系统注册消息消息(lparam,wparam自己给值,可以通过这些值实现简
单的进程通信)
void CMainFrame::OnTest1()
{
//发送自定义消息
SendMessage(WM_USERMSG,NULL,NULL);
SendMessage(WM_USERMSG2,NULL,NULL);
}
5 用户自定义消息也可以用宏定义
5.1注册消息
#define 消息的名字 WM_USER+整数(100以上的数)
5.2消息映射宏实现
ON_MESSAGE(消息ID,消息处理函数)
5.3消息处理函数的原型
afx_msg LRESULT 函数名称(wParam,lParam)
★例:注册消息:
#define WM_USERMSG2 WM_USER+101
消息映射宏实现:
ON_MESSAGE(WM_USERMSG2,OnUserMsg2)
消息处理函数的声明:
afx_msg LRESULT OnUserMsg2(WPARAM wParam,LPARAM lParam);
消息处理函数的实现:和系统定义宏一样,想在哪实现自己发送。
★返回应用程序实例句柄函数 HINSTANCE AfxGetInstanceHandle( );
运用自定义消息实现简单的进程通信
Sender:
//自定义消息
#define WM_COMM WM_USER+102
class CMainFrame:public CFrameWnd
{
DECLARE_MESSAGE_MAP()
public:
//宏处理函数
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);//窗口消息
afx_msg void OnTest1();//命令消息
afx_msg void OnTest2();//命令消息
};
//消息映射宏实现
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
ON_WM_CREATE()
ON_COMMAND(1001,OnTest1)
ON_COMMAND(1002,OnTest2)
END_MESSAGE_MAP()
void CMainFrame::OnTest1()
{
CString strTitle="Receiver";
★CWnd *pWnd=FindWindow(NULL,strTitle);//这个函数可以通过名字来返回代表进程指针
if (pWnd)
{
pWnd->SendMessage(WM_COMM,0,0);//发送自定义消息(自定义消息的参数值)
}
}
void CMainFrame::OnTest2()
{
CString strTitle="Receiver";
CWnd *pWnd=FindWindow(NULL,strTitle);
if (pWnd)
{
pWnd->SendMessage(WM_COMM,1,0);
}
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
CreateWindow("BUTTON","Test1",WS_CHILD|WS_VISIBLE,100,100,100,40,
m_hWnd,(HMENU)1001,AfxGetInstanceHandle(),NULL);
CreateWindow("BUTTON","Test2",WS_CHILD|WS_VISIBLE,100,200,100,40,
m_hWnd,(HMENU)1002,AfxGetInstanceHandle(),NULL);
return 0;
}
//窗口创建的过程
class CMyWinApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
CMyWinApp theApp;
BOOL CMyWinApp::InitInstance()
{
CMainFrame *pFrame=new CMainFrame();
pFrame->Create(NULL,"Sender");
m_pMainWnd=pFrame;
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
}
Receiver:
//定义用户自定义消息,和发送端那个一样
#define WM_COMM WM_USER+102
class CMainFrame:public CFrameWnd
{
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnUseMsg(WPARAM wParam,LPARAM lParam);//自定义消息处理函数
};
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
ON_MESSAGE(WM_COMM,OnUseMsg)//自定义消息消息映射实现宏
END_MESSAGE_MAP()
//消息处理函数实现根据发送端发送的消息的参数
void CMainFrame::OnUseMsg(WPARAM wParam, LPARAM lParam)
{
if (wParam==0&&lParam==0)
{
AfxMessageBox("处理按钮1的程序");
}
if(wParam==1&&lParam==0)
{
AfxMessageBox("处理按钮2的程序");
}
}
//窗口的创建过程
class CMyWinApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
CMyWinApp theApp;
BOOL CMyWinApp::InitInstance()
{
CMainFrame *pFrame=new CMainFrame();
pFrame->Create(NULL,"Receiver");
m_pMainWnd=pFrame;
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
}


发布评论