MFC启动过程(一)

原创 2013年12月04日 18:06:13
#include <windows.h>
#include <stdio.h>

LRESULT CALLBACK WinSunProc(
	HWND	hwnd,
	UINT	uMsg,
	WPARAM	wParam,
	LPARAM	lParam
	);

int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR	  lpCmdLine,
	int  nCmdShow
	)
{	
	WNDCLASS wndcls;
	wndcls.cbClsExtra = 0;
	wndcls.cbWndExtra = 0;
	wndcls.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
	wndcls.hIcon = LoadIcon (NULL,IDI_ERROR);
	wndcls.hCursor = LoadCursor (NULL,IDC_CROSS);
	wndcls.hInstance = hInstance;
	wndcls.lpfnWndProc = WinSunProc;	//这个是什么函数?自己写的吗?
	wndcls.lpszClassName = "wenxin";
	wndcls.style = CS_HREDRAW | CS_VREDRAW;
	wndcls.lpszMenuName = NULL;

	RegisterClass(&wndcls);	//注册窗口类

	HWND hwnd;
	hwnd = CreateWindow ("wenxin","测试窗口", WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL );
	ShowWindow (hwnd, SW_SHOWNORMAL);
	UpdateWindow (hwnd);

	MSG  msg;
	while (GetMessage (&msg, NULL, 0, 0 ))
	{
		TranslateMessage (&msg);
		DispatchMessage (&msg);
	}
	return 0;



}


LRESULT CALLBACK WinSunProc(
	HWND	hwnd,
	UINT	uMsg,
	WPARAM	wParam,
	LPARAM	lParam
	)
{
	switch(uMsg)
	{
	case WM_CHAR:
		char szChar[20];
		sprintf (szChar , "char is %d",wParam);
		MessageBox(hwnd,szChar,"wenxin",0);
		break;
	case WM_LBUTTONDOWN:
		MessageBox(hwnd,"mouse clicked","wenxin",0);
		HDC hdc;
		hdc = GetDC(hwnd);
		TextOut (hdc,0,50,"测试窗口",strlen("测试窗体"));
		ReleaseDC (hwnd,hdc);
		break;
	case WM_PAINT:
		HDC hDC;
		PAINTSTRUCT ps;
		hDC = BeginPaint(hwnd,&ps);
		TextOut(hDC,0, 0, "个性飞扬",strlen("个性飞扬"));
		EndPaint(hwnd,&ps);
		break;
	case WM_CLOSE:
		if(IDYES == MessageBox(hwnd,"是否真的结束?","要退出第一个写的程序吗?",MB_YESNO))
		{
			DestroyWindow(hwnd);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);

		break;
	default:
		return DefWindowProc(hwnd,uMsg, wParam, lParam);
	}

	return 0;
}

以上代码是产生一个小的简单的窗体,这个窗体虽然简单,但是所有的机制都还算健全。先分析这些代码能帮我们理解windows的运行机制。

首先代码中声明了一个函数WndSunProc(),这个函数有一个特殊的关键字CALLBACK,经这个关键字定义的函数为回调函数,供操作系统调用,对于CALLBACK关键字这里不再做其他的解释。

接下来便是程序的启动函数WinMain(),程序启动时便会进入此函数,在此函数中首先定义了WNDCLASS类型的对象(这里暂称wndcls为对象),接下来对wndcls便做了很多的赋值操作,结构WNDCLASS包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性在赋值操作中最重要的算是对wndcls.lpfnWndProc的赋值了,这个变量指向了一个函数,窗体有消息需要处理时便会调用此函数来处理消息,因此WndSunProc()函数为消息处理函数,故在下面的代码中在该函数中添加了对部分消息的处理。对wndcls赋值完成之后算是设计好了窗体的外观。接下来便是注册窗口类操作RegisterClass(&wndcls)。

注册好窗体类之后定义了一个窗体句柄变量(hwnd)用来记录建立窗体的句柄,接下来调用CreateWindow()函数来创建一个窗体,这个函数只负责创建窗体,创建的窗体并不能立刻显示出来。之后的ShowWindow()函数负责将窗体显示出来。

窗体显示出来之后还是不能处理任何消息的并且如果不写循环获取消息代码,窗口进程会在建立之后瞬间杀死(具体原因还在分析之中)。所以接下来的代码是循环获取Message消息,并转化处理消息。

WinMain()函数之后的WinSunProc()函数便是消息处理函数的函数体,其中具体的代码这里就不分析了。

这里对最基本、最简单的窗体代码进行了简单的分析,目的是与后面的MFC代码做对比只用。MFC启动过程(二)中将会分析简单的MFC窗口建立的过程,并对比这两个过程。

以上代码是本菜鸟从孙鑫视频配套的文件中获得的,下面的解析是根据自己的理解写的。如有错误,欢迎指正,如想与本菜鸟联系,邮箱:likui360@hotmail.com。

相关文章推荐

MFC程序的启动过程与相关函数的执行顺序

[转自:http://wenku.baidu.com/view/3bbcffdda58da0116c17499f.html] [JOEY:本篇实为《深入浅出MFC》第6章 MFC程序的生死因果的...

MFC程序启动过程(VS 2005代码剖析)

启动前做的事:初始化全局变量。大概做了以下四件事:appmodul.cpp 67行 通过调用函数AfxInitialize初始化了MFC的线程局部存储功能和程序全局信息,这些信息最重要的有以下两个:a...

MFC程序的启动过程与相关函数执行顺序

原文地址:http://hi.baidu.com/chuntian1919/blog/item/f5b7f5fd898e2c1408244d3c.html      了解MFC程序的启动过程,对于初学...

MFC函数启动执行过程

了解MFC程序的启动过程,对于初学者来讲,了学习MFC很有帮助;对于不常用VC的人来说,过一段时间就会忘记。还是来记下来,方便以后查阅。 1、创建Application object对象theA...

VS2010的MFC对话框程序中添加菜单栏的过程

VS2010的MFC对话框程序中添加菜单栏的过程最近在看一个用MFC写的界面的项目的代码,在代码和界面中一直没有看到关于菜单控件是如何添加进对话框的,于是就百度了下。结果,与其它控件(Button等)...

MFC创建过程

  • 2016年03月10日 16:47
  • 232KB
  • 下载

MFC程序执行过程剖析

  • 2013年02月27日 16:02
  • 3KB
  • 下载

MFC六大关键技术之初始化过程

MFC六大关键技术之初始化过程 我并不认为MFC减轻了程序员们的负担,MFC出现的目的虽然似乎是为了让程序员不用懂得太多就可以进行视窗编程,但本人在MFC里徘徊了很久很久(因为那时没有书本详细介...
  • gws1229
  • gws1229
  • 2013年11月07日 17:09
  • 1009
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC启动过程(一)
举报原因:
原因补充:

(最多只允许输入30个字)