`
lovnet
  • 浏览: 6724530 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    Visual C++ MFC编程详解和实例

    1.3 怎样应用MFC创建一个窗口 5 1.4 怎样使用MFC销毁一个窗口 9 1.4.1 捆绑到一个已有的窗口 9 1.4.2 窗口类 10 1.4.3 窗口进程 10 1.5 怎样使用MFC创建一个窗口类 11 1.5.1 使用AfxRegisterWndClass () 函数注册一...

    C++MFC教程

    在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。 3...

    MFC网络编程之自制浏览器

     CAsyncSocket类在较低层次上封装了Windows Socket API,并且通过内建一个(隐藏的)窗口,实现了适合Windows应用的异步机制(Windows Socket API默认情况下工作在阻塞模式,不方便直接在消息驱动的Windows程序上使用)...

    china-pub的精品MFC教程(超清晰)

    1.3 怎样应用MFC创建一个窗口 5 1.4 怎样使用MFC销毁一个窗口 9 1.4.1 捆绑到一个已有的窗口 9 1.4.2 窗口类 10 1.4.3 窗口进程 10 1.5 怎样使用MFC创建一个窗口类 11 1.5.1 使用AfxRegisterWndClass () 函数注册一...

    VC++.NET中使用Windows.Forms

    熟悉Virsual Basic开发方式的朋友们在使用Visual C++时,一定发过...首先,你要有一本MFC大全,照着它来添加各种控件类的实例,截取它用到的各种Windows消息……这些也就是对于VC++制作窗口程序,笔者没学下去的原因。

    Visual C++ 6.0编程实例详解.part2

    3.2 创建简单的Windows应用程序 3.3 AppWizard——生成结果 3.3.1 分类 3.3.2 传递和接收 3.3.3 处理 3.4 实例 第4章 对话框及控件 4.1 对话框 4.1.1 组成与分类 4.1.2 CDiaiog类 4.1.3 ...

    Visual C++ 6.0编程实例详解.part1

    3.2 创建简单的Windows应用程序 3.3 AppWizard——生成结果 3.3.1 分类 3.3.2 传递和接收 3.3.3 处理 3.4 实例 第4章 对话框及控件 4.1 对话框 4.1.1 组成与分类 4.1.2 CDiaiog类 4.1.3 ...

    原创开源项目TinyFC代码

    一,一些项目的主体程序原本使用SDK方式开发,直接调用windows api创建用户界面的软件项目,受制于SDK开发方式的弱点,开发周期较长,开发难度较高. 由于这类项目不适合采用大型类库MFC开发,甚至本身开发语言就不是VC,...

    Visual C++ 2005入门经典--源代码及课后练习答案

    CruiseYoung提供的带有详细书签的电子书籍目录 ... 该资料是《Visual C++ 2005入门经典》的源代码及课后练习答案 ... 11.2.3 简单的Windows程序 598 11.3 Windows程序的组织 600 11.4 MFC 601 ...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

     ·指导读者用c++和c++/cli设计和创建大量的windows应用程序  ·为帮助读者掌握编程技巧,提供了大量可运行的示例和练习 作译者  Ivor Horton是撰著Java、C和C++编程语言图书的杰出作家之一。大家一致认为,...

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    11.1.5 WindowsAPI 11.1.6.Windows数据类型 11.1.7 Windows程序中的符号 11.2 Windows程序的结构 11.2.1 WinMain()函数 11.2.2消息处理函数 11.2.3简单的Windows程序 11.3 Windows程序的组织 11.4 MFC 11.4.1 MFC...

    Visual C++ 2005入门经典.part04.rar (整理并添加所有书签)

    11.1.5 WindowsAPI 11.1.6.Windows数据类型 11.1.7 Windows程序中的符号 11.2 Windows程序的结构 11.2.1 WinMain()函数 11.2.2消息处理函数 11.2.3简单的Windows程序 11.3 Windows程序的组织 11.4 MFC 11.4.1 MFC...

    Visual C++ 2005入门经典.part07.rar (整理并添加所有书签)

    11.1.5 WindowsAPI 11.1.6.Windows数据类型 11.1.7 Windows程序中的符号 11.2 Windows程序的结构 11.2.1 WinMain()函数 11.2.2消息处理函数 11.2.3简单的Windows程序 11.3 Windows程序的组织 11.4 MFC 11.4.1 MFC...

    Visual C++ 2005入门经典.part09.rar (整理并添加所有书签)

    11.1.5 WindowsAPI 11.1.6.Windows数据类型 11.1.7 Windows程序中的符号 11.2 Windows程序的结构 11.2.1 WinMain()函数 11.2.2消息处理函数 11.2.3简单的Windows程序 11.3 Windows程序的组织 11.4 MFC 11.4.1 MFC...

    Visual C++ 2005入门经典.part05.rar (整理并添加所有书签)

    11.1.5 WindowsAPI 11.1.6.Windows数据类型 11.1.7 Windows程序中的符号 11.2 Windows程序的结构 11.2.1 WinMain()函数 11.2.2消息处理函数 11.2.3简单的Windows程序 11.3 Windows程序的组织 11.4 MFC 11.4.1 MFC...

    Visual C++ 2005入门经典.part06.rar (整理并添加所有书签)

    11.1.5 WindowsAPI 11.1.6.Windows数据类型 11.1.7 Windows程序中的符号 11.2 Windows程序的结构 11.2.1 WinMain()函数 11.2.2消息处理函数 11.2.3简单的Windows程序 11.3 Windows程序的组织 11.4 MFC 11.4.1 MFC...

    StrongOD v0.2.6

    第二个选项用User权限的用户来启动进程限制的地方比较多,所以,增加第三个功能,以一个限制级的Admin用户来启动程序 启动的程序是以Admin的用户,不过权限只剩下默认User用户有的权限,一些危险权限全部删除...

    C#微软培训资料

    9.3 面向对象的分析 .105 9.4 面向对象的设计 .107 9.5 小 结 .110 第十章 类 .112 10.1 类 的 声 明 .112 10.2 类 的 成 员 .113 10.3 构造函数和析构函数 .119 10.4 小 结 .122 第十一章 方 法 ....

Global site tag (gtag.js) - Google Analytics