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
分享到:
相关推荐
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 () 函数注册一...
在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。 3...
CAsyncSocket类在较低层次上封装了Windows Socket API,并且通过内建一个(隐藏的)窗口,实现了适合Windows应用的异步机制(Windows Socket API默认情况下工作在阻塞模式,不方便直接在消息驱动的Windows程序上使用)...
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 () 函数注册一...
熟悉Virsual Basic开发方式的朋友们在使用Visual C++时,一定发过...首先,你要有一本MFC大全,照着它来添加各种控件类的实例,截取它用到的各种Windows消息……这些也就是对于VC++制作窗口程序,笔者没学下去的原因。
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 ...
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 ...
一,一些项目的主体程序原本使用SDK方式开发,直接调用windows api创建用户界面的软件项目,受制于SDK开发方式的弱点,开发周期较长,开发难度较高. 由于这类项目不适合采用大型类库MFC开发,甚至本身开发语言就不是VC,...
CruiseYoung提供的带有详细书签的电子书籍目录 ... 该资料是《Visual C++ 2005入门经典》的源代码及课后练习答案 ... 11.2.3 简单的Windows程序 598 11.3 Windows程序的组织 600 11.4 MFC 601 ...
·指导读者用c++和c++/cli设计和创建大量的windows应用程序 ·为帮助读者掌握编程技巧,提供了大量可运行的示例和练习 作译者 Ivor Horton是撰著Java、C和C++编程语言图书的杰出作家之一。大家一致认为,...
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...
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...
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...
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...
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...
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...
第二个选项用User权限的用户来启动进程限制的地方比较多,所以,增加第三个功能,以一个限制级的Admin用户来启动程序 启动的程序是以Admin的用户,不过权限只剩下默认User用户有的权限,一些危险权限全部删除...
9.3 面向对象的分析 .105 9.4 面向对象的设计 .107 9.5 小 结 .110 第十章 类 .112 10.1 类 的 声 明 .112 10.2 类 的 成 员 .113 10.3 构造函数和析构函数 .119 10.4 小 结 .122 第十一章 方 法 ....