新建一个Win32 Project,命名为MyWin32APIForm
///////////////////////////////////MyWin32APIForm.cpp////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MyWin32APIForm.h"
/*回调函数MyProc,又称为窗口函数或窗口过程,被系统调用处理窗口消息*/
LRESULT WINAPI MyProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
switch (message){
case WM_DESTROY:
PostQuitMessage(0);break; /*关闭窗口时退出程序,为了例子简单,这里不处理其他message了.不然可以有很多个case条件*/
default:
return DefWindowProc(hWnd, message, wParam, lParam); /*由windows默认的函数来处理信息.*/
}
return 0;
}
/*这是main函数,程序执行的入口点.有四个参数.hInstance是应用程序的句柄,hPrevInstance在以前16的系统中有用,现在32位或64位windows系统中没啥
//用处了.如果用windows start 的Run命令启动应用程序,lpCmdLiney就是传入的相关信息.nCmdShow是窗口显示样式.*/
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
/*(1).使用windows API的一个结构体,并初始化它.其实就相当于实例化一个窗体类,并初始化.只不过以前C中还没有类的概念,用结构体来表示一个窗体.*/
static LPCTSTR szWindowClass = L"Arwen"; //窗体类的名字
WNDCLASSEX windowClass;
windowClass.cbSize = sizeof(WNDCLASSEX); //结构体占用内存大小
windowClass.style = CS_HREDRAW | CS_VREDRAW; //窗体样式
windowClass.lpfnWndProc = MyProc; //指定窗口的回调函数.
windowClass.cbClsExtra = 0;
windowClass.cbWndExtra = 0;
windowClass.hInstance = hInstance; //当前应用程序的句柄,Main函数中传进来的参数
windowClass.hIcon = 0;
windowClass.hCursor = 0;
windowClass.hbrBackground = 0;
windowClass.lpszMenuName = 0; //窗体的菜单栏,这里让它为空
windowClass.lpszClassName = szWindowClass; //前面定义的窗体类名字.在后面创建窗体的函数中会用到
windowClass.hIconSm = 0;
//(2)注册创建的窗体类
RegisterClassEx(&windowClass);
/*(3)注册完了后就可以真正创建窗体.下面只简单的创建一个,其实你可以随便创建多个.只要再调用下CreateWindow,和ShowWindow函数即可*/
HWND hWnd; //声明一个窗体句柄,当有多个窗体时可以用它来识别不同的窗体
hWnd = CreateWindow(szWindowClass, L"Hello Arwen.", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInstance, 0); /*szWindowClass是前面定义的窗体结构体名字也就是Arwen,hInstance应用序
//句柄,其他是窗体相关的属性,比如位置啊,背景色啥的.Hello Arwen是窗体标题*/
ShowWindow(hWnd, nCmdShow); //显示窗体
//(4)循环获取该程序的windows信息
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) /*while真的条件会一直为真,直到MyPorc函数中表示退出时才会让此条件为假,从而结束整个应用程序*/
{
TranslateMessage(&msg); //把捕获到的信息转换下
DispatchMessage(&msg); //把消息传给windows API,然后API再调用MyProc函数,并把msg作为参数传过去
}
return 0;
}
调用API创建窗体主要分为这么4个主要步骤
1.首先是用API的一个结构体来指定要创建一个啥样的窗体.比如窗体的图标啊,菜单栏等一些属性
2.注册窗口
3.调用API函数创建窗体,第一步创建的结构体会做为参数传进来.最后显示出来
4.获取程序的windows信息.这里有点特殊的是,获取到了message之后不会直接调用程序MyProc,而且先把message转换下,然后先传给windows API,然后windows再去调用MyProc.之所以没直接调用此函数的原因貌似是由于windows上会同时运行很多程序.同时使用CPU,windows会做一些调度,只要当轮到该应用程序用CPU了才调用你的MyProc函数去作相应的处理
main函数中的while循环会一直循环去获取信息,只有当MyProc函数中调用了PostQuitMessage(0)后,while条件才会为假,结束循环,从而退出整个应用程序
新建一个project,类型选MFC Application.向导全部为默认选择,点finish.项目名字为MyMFCForm
找到MyMFCForm.cpp,把里面的代码全部删掉.敲入下面的代码.
#include "MyMFCForm.h"
#include "stdafx.h"
class CMyApp :public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CMyWnd : public CFrameWnd
{
public :CMyWnd()
{
Create(0,L"This is an application of Arwen.");
}
};
BOOL CMyApp::InitInstance(void)
{
m_pMainWnd = new CMyWnd; //m_pMainWnd ,m_nCmdShow都是继承的成员变量
m_pMainWnd->ShowWindow(m_nCmdShow);
return TRUE;
}
CMyApp arwen;
原理分析,详解见:
MFC中的Main函数哪去了见: http://blog.csdn.net/weiwenhp/article/details/8455471
MFC怎么封装CreateWindow见: http://blog.csdn.net/weiwenhp/article/details/8796337
这是用MFC创建一个简单的窗体,代码少了很多,因为MFC对windows API做了很多封装,由于封装的太厉害,我们也不容易从这里看出调用API那样流程和原理了.
连程序的入口点都不知道哪去了,据说是在CWinApp或者它的父类里面封装了Main函数,所以一个MFC应用程序中哪个类是继承了CWinApp,就可以把它当作是整个应用程序的入口点吧.
由于那些API都被封装了,我们只要重写CWinApp继承下来的虚函数InitInstance来创建窗口了,像之前那些指定啥窗体样式,注册窗体啊都不用管了.然后此处还定义了一个类继承
CFrameWnd,就实例化这个类来创建窗体.
我猜上面调用API时的四大步骤封装后在这里,可能就是第一步的操作封装到CFrameWnd中去了,2,3步封装到了CWinApp了,第四步就不知道跑哪去了.
不过在MFC,处理信息就简单的用这样的宏就行了.发现MFC到处是宏,大部分东东都是用宏搞来搞去给你封装了.
BEGIN_MESSAGE_MAP
END_MESSAGE_MAP