WinMain和MFC的区别
来源:互联网 发布:mysql单台2000并发写入 编辑:程序博客网 时间:2024/05/05 19:47
API(Application Programming Interface):开放给应用程序调用的系统功能。
一个Windows Application(SDK):
WinMain
ReristerClass
CreateWindow
GetMessage/DispatchMessage
/Window Procedure
various Windows APIs
一个MFC Application:
WinMain由MFC提供
RegisterClass包装于AfxWinInit中
CreateWindow在CWinApp::InitInstance中调用
GetMessage/DispatchMessage包装在CWinApp::Run中
Window Procedure由MFC提供
Windows APIs包装在MFC各类中
Massage Mapping, Message Routing.
Dynamic Creation, Serialization.
CWinApp代表程序本体——取代WndProc
传统上SDK程序的WinMain所完成的工作现在由CWinAoo的三个函数完成:
virtual BOOL InitApplication();
virtual BOOL InitInstance();
virtual int Run();
WinMain只是扮演驾驶它们的角色。
传统的SDK窗口函数写法是:
MFC中使用两个函数OnPaint(),OnAbout()与其对应,MFC中的声明如下:
OnPaint处理WM_PAINT
OnAbout处理WM_COMMAND和IDM_ABOUT
MFC内建的一个Message机制,会把消息自动送到“与消息对应的特定函数”中去,消息与对应函数之间的对应关系由程序员指定。DECLARE_MESSAGE_MAP另搭配其它宏,就可以很便利的将消息与其处理函数关联在一起:
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
ON_WM_PAINT()
ON_COMMAND(IDM_ABOUT, OnAbout)
END_MESSAGE_MAP()
Application object:每一个MFC应用程序都有一个,而且只有一个。
WINMAIN.CPP中,AfxGetApp其实就是取得CMyWinApp对象指针。所以,AfxWinMain中这样的操作:
CWinApp* pApp = AfxGetApp();
pApp->InitApplication();
pApp->InitInstance();
nReturnCode = pApp->Run();
其实就相当于调用:
CMyWinApp::InitApplication();
CMyWinApp::InitInstance();
CMyWinApp::Run();
因而导致调用:
CWinApp::InitApplication(); //因为CMyWinApp并没有改写InitApplication
CMyWinAPP::InitInstance(); //因为CMyWinApp改写了InitInstance
CWinApp::Run(); //因为CMyWinApp并没有改写Run
AfxWinInit——AFX内部初始化操作
WinMain一开始即调用AfxWinInit,注册四个窗口类。
MFC中也会为我们注册窗口类,但不再是在AfxWinInit中完成。
pApp指向CMyWinApp对象(theApp),所以,当程序调用:
pApp->InitApplication();
CMyWinApp继承自CWinApp,而InitApplication又是CWinApp的一个虚拟函数;若我们并没有改写它(大部分情况下不需改写它),上述操作相当于调用:
CWinApp::InitApplication();
与此类似,当程序调用
pApp->InitInstance();
相当于调用:
CMyWinApp::InitInstance();。
CFrameWnd::Create 产生主窗口(并先注册窗口类)
CMyWinApp::InitInstance 一开始new了一个CMyFrameWnd对象,准备用作主框窗口的C++对象。new会引发构造函数:
CMyFrameWnd::CMyFrameWnd()
{
Create(NULL, "Hello MFC", WS_OVERLAPPEDWINDOW, rectDefault, NULL, "MainMenu");
}
其中,Create是CFrameWnd的成员函数,他将产生一个窗口。
CFrame::Create的规格:
BOOL Create(LPCTSTR lpszClassName, //指定WNDCLASS窗口类
LPCTSTR lpszWindowName,//指定窗口标题
DWORD dwStyle = WS_OVERLAPPEDWINDOW,//指定窗口风格
const RECT& rect = rectDefault,//指定窗口的位置与大小
CWnd* pParentWnd = NULL,//指定父窗口
LPCTSTR lpszMenuName = NULL,//指定菜单
DWORD dwExStyle = 0,
CCreateContext* pContext = NULL );//指向CCreateContext结构的指针,framework利用它,在具备Document/View结构的程序中初始化外框窗口.
pApp指向CMyWinApp对象(theApp),所以,当程序调用:
pApp->Run();
相当于调用:
CMyWinApp::Run();
把消息与处理函数连接在一起:Message Map机制
MFC提供给应用程序使用的“很方便的接口”是两组宏。以Hello的主窗口为例,第一个操作是在HELLO.H的CMyFrameWnd加上DECLARE_MESSAGE_MAP:
class CMyFrameWnd : public CFrameWnd
{
public :
CMyFrameWnd();
afx_msg void OnPaint();
afx_msg void OnAbout();
DECLARE_MESSAGE_MAP();
}
第二个操作是在HELLO.CPP的任何位置(当然不能在函数之内)使用宏如下:
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
ON_WM_PAINT()
ON_COMMAND(IDM_ABOUT, OnAbout)
END_MESSAGE_MAP()
MFC把消息主要分为三大类,Message Map机制中对于消息与函数间的对应关系也明确以下三种:
标准Windows消息(WM_xxx)的对应规则:
命令消息(WM_COMMAND)的一般对应规则是:
ON_COMMAND(<id>, <memberFxn>)
例如:
ON_COMMAND(IDM_ABOUT,OnAbout)
ON_COMMAND(IDM_FILENEW,OnFileNew)
ON_COMMAND(IDM_FILEOPEN,OnFileOpen)
ON_COMMAND(IDM_FILESAVE,OnFileSave)
"Notification消息"(由控件产生,例如 BN_xxx)的对应机制的宏分为好几种(因为控件分为好几种),例:
各个消息处理函数均以afx_msg void 为函数类型。
一个Windows Application(SDK):
WinMain
ReristerClass
CreateWindow
GetMessage/DispatchMessage
/Window Procedure
various Windows APIs
一个MFC Application:
WinMain由MFC提供
RegisterClass包装于AfxWinInit中
CreateWindow在CWinApp::InitInstance中调用
GetMessage/DispatchMessage包装在CWinApp::Run中
Window Procedure由MFC提供
Windows APIs包装在MFC各类中
Massage Mapping, Message Routing.
Dynamic Creation, Serialization.
CWinApp代表程序本体——取代WndProc
传统上SDK程序的WinMain所完成的工作现在由CWinAoo的三个函数完成:
virtual BOOL InitApplication();
virtual BOOL InitInstance();
virtual int Run();
WinMain只是扮演驾驶它们的角色。
传统的SDK窗口函数写法是:
long FAR PASCAL WndProc(HWND hWnd, UINT msg, WORD wParam, LONG lParam){switch(msg) {case WM_COMMAND :swtich(wParam) {case IDM_ABOUT :OnAbout(hWnd, wParam, lParam);break;}break;case WM_PAINT :OnPaint(hWnd, wParam, lParam);break;default :DefWindowProc(hWnd, msg, wParam, lParam);}}
MFC中使用两个函数OnPaint(),OnAbout()与其对应,MFC中的声明如下:
class CMyFrameWnd : public CFrameWnd{public :CMyFrameWnd();afx_msg void OnPaint();afx_msg void OnAbout();DECLARE_MESSAGE_MAP()}
OnPaint处理WM_PAINT
OnAbout处理WM_COMMAND和IDM_ABOUT
MFC内建的一个Message机制,会把消息自动送到“与消息对应的特定函数”中去,消息与对应函数之间的对应关系由程序员指定。DECLARE_MESSAGE_MAP另搭配其它宏,就可以很便利的将消息与其处理函数关联在一起:
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
ON_WM_PAINT()
ON_COMMAND(IDM_ABOUT, OnAbout)
END_MESSAGE_MAP()
/***********************************************************//* WINMAIN.CPP *//***********************************************************//* int AFXAPI AfxWinMain (...) *//* { *//* CWinApp* pApp = AfxGetApp(); *//* *//* AfxWinInit(...); *//* *//* pApp->InitApplication(); *//* pApp->InitInstance(); *//* nReturnCode = pApp->Run(); *//* *//* AfxWinTerm(); *//* } *//***********************************************************//* HELLO.CPP *//***********************************************************//* CMyWinApp theApp;//application object *//* *//* BOOL CMyWinApp::initInstance() *//* { *//* m_pMainWnd = new CMyFrameWnd(); *//* m_pMainWnd->ShowWindow(m_nCmdShow); *//* m_pMainWnd->UpdateWindow(); *//* return TRUE; *//* } *//* *//* CMyFrameWnd::CMyFrameWnd() *//* { *//* Create(NULL, "Hello MFC", ..., "MainMenu"); *//* } *//* *//* void CMyFrameWnd::OnPaint() {...} *//* void CMyFrameWnd::OnAbout() {...} *//* *//* BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd) *//* ON_COMMAND(IDM_ABOUT, OnAbout) *//* ON_WM_PAINT() *//* END_MESSAGE_MAP() *//***********************************************************/
Application object:每一个MFC应用程序都有一个,而且只有一个。
WINMAIN.CPP中,AfxGetApp其实就是取得CMyWinApp对象指针。所以,AfxWinMain中这样的操作:
CWinApp* pApp = AfxGetApp();
pApp->InitApplication();
pApp->InitInstance();
nReturnCode = pApp->Run();
其实就相当于调用:
CMyWinApp::InitApplication();
CMyWinApp::InitInstance();
CMyWinApp::Run();
因而导致调用:
CWinApp::InitApplication(); //因为CMyWinApp并没有改写InitApplication
CMyWinAPP::InitInstance(); //因为CMyWinApp改写了InitInstance
CWinApp::Run(); //因为CMyWinApp并没有改写Run
AfxWinInit——AFX内部初始化操作
WinMain一开始即调用AfxWinInit,注册四个窗口类。
MFC中也会为我们注册窗口类,但不再是在AfxWinInit中完成。
pApp指向CMyWinApp对象(theApp),所以,当程序调用:
pApp->InitApplication();
CMyWinApp继承自CWinApp,而InitApplication又是CWinApp的一个虚拟函数;若我们并没有改写它(大部分情况下不需改写它),上述操作相当于调用:
CWinApp::InitApplication();
与此类似,当程序调用
pApp->InitInstance();
相当于调用:
CMyWinApp::InitInstance();。
CFrameWnd::Create 产生主窗口(并先注册窗口类)
CMyWinApp::InitInstance 一开始new了一个CMyFrameWnd对象,准备用作主框窗口的C++对象。new会引发构造函数:
CMyFrameWnd::CMyFrameWnd()
{
Create(NULL, "Hello MFC", WS_OVERLAPPEDWINDOW, rectDefault, NULL, "MainMenu");
}
其中,Create是CFrameWnd的成员函数,他将产生一个窗口。
CFrame::Create的规格:
BOOL Create(LPCTSTR lpszClassName, //指定WNDCLASS窗口类
LPCTSTR lpszWindowName,//指定窗口标题
DWORD dwStyle = WS_OVERLAPPEDWINDOW,//指定窗口风格
const RECT& rect = rectDefault,//指定窗口的位置与大小
CWnd* pParentWnd = NULL,//指定父窗口
LPCTSTR lpszMenuName = NULL,//指定菜单
DWORD dwExStyle = 0,
CCreateContext* pContext = NULL );//指向CCreateContext结构的指针,framework利用它,在具备Document/View结构的程序中初始化外框窗口.
pApp指向CMyWinApp对象(theApp),所以,当程序调用:
pApp->Run();
相当于调用:
CMyWinApp::Run();
把消息与处理函数连接在一起:Message Map机制
MFC提供给应用程序使用的“很方便的接口”是两组宏。以Hello的主窗口为例,第一个操作是在HELLO.H的CMyFrameWnd加上DECLARE_MESSAGE_MAP:
class CMyFrameWnd : public CFrameWnd
{
public :
CMyFrameWnd();
afx_msg void OnPaint();
afx_msg void OnAbout();
DECLARE_MESSAGE_MAP();
}
第二个操作是在HELLO.CPP的任何位置(当然不能在函数之内)使用宏如下:
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
ON_WM_PAINT()
ON_COMMAND(IDM_ABOUT, OnAbout)
END_MESSAGE_MAP()
MFC把消息主要分为三大类,Message Map机制中对于消息与函数间的对应关系也明确以下三种:
标准Windows消息(WM_xxx)的对应规则:
|-----------------------------------------------------------------------------| | 宏名称 | 对应消息 | 消息处理函数(名称已由系统默认) | |-------------------|-------------------|-------------------------------------| | ON_WM_CHAR | WM_CHAR | OnChar | |-------------------|-------------------|-------------------------------------| | ON_WM_CLOSE | WM_CLOSE | OnClose | |-------------------|-------------------|-------------------------------------| | ON_WM_CREATE | WM_CREATE | OnCreate | |-------------------|-------------------|-------------------------------------| | ON_WM_DESTROY | WM_DESTROY | OnDestroy | |-------------------|-------------------|-------------------------------------| | ON_WM_LBUTTONDOWN | WM_LBUTTONDOWN | OnLButtonDown | |-------------------|-------------------|-------------------------------------| | ON_WM_LBUTTONUP | WM_LBUTTONUP | OnLButtonUp | |-------------------|-------------------|-------------------------------------| | ON_WM_MOUSEMOVE | WM_MOUSEMOVE | OnMouseMove | |-------------------|-------------------|-------------------------------------| | ON_WM_PAINT | WM_PAINT | OnPaint | |-----------------------------------------------------------------------------|
命令消息(WM_COMMAND)的一般对应规则是:
ON_COMMAND(<id>, <memberFxn>)
例如:
ON_COMMAND(IDM_ABOUT,OnAbout)
ON_COMMAND(IDM_FILENEW,OnFileNew)
ON_COMMAND(IDM_FILEOPEN,OnFileOpen)
ON_COMMAND(IDM_FILESAVE,OnFileSave)
"Notification消息"(由控件产生,例如 BN_xxx)的对应机制的宏分为好几种(因为控件分为好几种),例:
|-----------------------------------------------------------|| 控件 | 宏名称 |消息处理函数||----------|-----------------------------------|------------|| Button | ON_BN_CLICKED(<id>,<memberFxn>) | memberFxn ||----------|-----------------------------------|------------|| ComboBox | ON_CBN_DBLCLK(<id>,<memberFxn>) | memberFxn ||----------|-----------------------------------|------------|| Edit | ON_EN_SETFOCUS(<id>,<memberFxn>) | memberFxn ||----------|-----------------------------------|------------|| ListBox | ON_LBN_DBLCLK(<id>,<memberFxn>) | memberFxn ||-----------------------------------------------------------|
各个消息处理函数均以afx_msg void 为函数类型。
0 0
- WinMain和MFC的区别
- MFC的WinMain
- MFC wINMain的封装
- 找不到MFC的winmain,why?
- MFC封装WinMain的原理
- mfc-winmain
- main与WinMain的区别
- main WinMain _tmain的区别
- 总结《二》MFC中WinMain和CALLBACK
- MFC在WINMAIN前的初始化
- 关于MFC中Winmain函数的跟踪
- MFC框架中消失的WinMain()
- 【VC++游戏开发#一】深入剖析MFC的WinMain和消息机制
- WinMain传进来的lpCmdLine和GetCommandLineW得到的有啥区别
- MFC中的WinMain函数
- MFC 中的Winmain
- MFC中的winmain
- MFC应用程序WinMain函数
- UVALive 6425 Intercity(bfs)
- 树莓派wiringPi常用的函数介绍
- 分析 Ubuntu 磁盘使用情况
- 类中的常量
- DM8168 自动登录root用户
- WinMain和MFC的区别
- x265
- kali linux nmap
- android点击图片缩放、拖动
- C++基础(四)
- 利用ArcGIS Server REST API实现对Feature的编辑操作
- ipc 消息队列message queue
- HDU 2588 GCD && GCD问题总结
- HDU-4451-Dressing (2012年金华赛区J题)