Win32 API与MFC创建窗口对比

Win32 API创建窗口

 

新建一个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条件才会为假,结束循环,从而退出整个应用程序

 

 

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;

 

原理分析,详解见:

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

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
学生选课代码中的win32mfc是两种不同的编程框架。 Win32是一种基于Windows操作系统的应用程序编程接口(API),它提供了一系列函数和工具,用于开发应用程序。Win32编程基于C语言,是一种底层编程框架,需要开发者自行处理窗口和消息的创建、处理和管理。它的优势在于对底层细节有很好的控制,可以编写高效、灵活的应用程序,但需要对Windows操作系统的输入、输出、内存管理等方面有深入了解。 MFC(Microsoft Foundation Class)是微软开发的一种在Windows平台上的C++应用程序框架。它提供了一系列类和函数,使开发者能够更快速、简便地开发Windows应用程序。MFC封装了Win32 API,提供了更高层次的抽象和封装,开发者只需要使用MFC提供的类和函数,就能够创建窗口、处理消息等,无需关注底层细节。MFC具有易用性好、开发效率高的优点,也适合快速开发小型应用程序。 在学生选课代码中,如果选择使用Win32编程,开发者可以有更大的灵活性和控制权,能够根据具体需求进行精细调整,但需要花费更多时间和精力处理底层细节。而选择MFC编程,则可以快速方便地进行应用开发,节省开发时间,但可能会有一些性能损失,因为MFC在提供便捷性的同时对底层细节进行了封装。因此,选择使用哪种编程框架,应该根据具体需求和开发者的技术水平来决定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值