Windows API与MFC创建简单窗口对比分析

Windows API创建窗口.

先手动创建一个project,不要用向导生成的代码,全部自己写代码.步骤如下

new一个Win32 Project.向导全部保持默认值,点Finish.项目名字为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; //这个地方指如果窗口中有啥事件发生,比如点鼠标啥的,就会调用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条件才会为假,结束循环,从而退出整个应用程序

MFC创建简单窗体

新建一个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;

原理分析,详解见: http://blog.csdn.net/weiwenhp/article/details/8455471

这是用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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值