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启动流程

精简以上代码,就会发现其实是一样的 1.初始化主框架,保存参数 : if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))...
  • comwise
  • comwise
  • 2013年11月27日 15:59
  • 2322

MFC程序启动过程

// appcore.cpp CWinApp::CWinApp(LPCTSTRlpszAppName) {      if (lpszAppName !=NULL)          m_ps...
  • wishfly
  • wishfly
  • 2013年03月31日 23:27
  • 1488

MFC窗口程序启动运行机制剖析

本文的测试环境: IDE:VS2010 + VC助手(GO按钮对后面的跟踪调试很有用) 操作系统:Win8.1...
  • eldn__
  • eldn__
  • 2014年07月18日 21:13
  • 3141

MFC启动过程(二)

今天我想看看MFC生成的所有的文件是干什么用的,先从基本的对话框程序下手。 新建一个名字为MFC的MFC基本对话框程序,编译连接并运行。之后便会生成所有的文件,包括exe。以下的截图便是所有的文件。 ...
  • LIKUI123456789
  • LIKUI123456789
  • 2013年12月05日 22:01
  • 472

MFC启动过程&单文档MFC程序的启动详细过程

MFC启动过程&单文档MFC程序的启动详细过程
  • eickandy
  • eickandy
  • 2016年01月22日 16:14
  • 282

MFC启动过程&单文档MFC程序的启动详细过程

MFC启动过程 1. 首先说一下MFC程序的启动过程. 每个MFC程序都有一个全局的应用程序类的对象, 在面向对象程度非常好的MFC程序中, 应该只有这一个全局的对象. MFC应用程序启动...
  • limingmcu
  • limingmcu
  • 2014年05月22日 11:12
  • 490

MFC启动过程&单文档MFC程序的启动详细过程

MFC启动过程 1. 首先说一下MFC程序的启动过程. 每个MFC程序都有一个全局的应用程序类的对象, 在面向对象程度非常好的MFC程序中, 应该只有这一个全局的对象. MFC应用程序启...
  • simple__happyness
  • simple__happyness
  • 2016年02月03日 22:47
  • 226

MFC数据库操作 - 存储过程

①、什么是存储过程? 存储过程(Stored Procedure)是数据库系统中,一组为了完成特定功能的SQL语句集, 经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程...
  • a550853006a
  • a550853006a
  • 2015年04月12日 22:27
  • 643

深入理解MFC中程序框架

新建一个Example单文档工程,应用向导可以自动地生成MFC应用的各个C++类。 1. 应用类及全局对象(CExampleApp) theApp 是唯一一个在程序形成的时候就存在的全局变量,C...
  • liulianglin
  • liulianglin
  • 2014年01月09日 16:49
  • 1299

VS2010-MFC通过ADO调用SQLServer存储过程

首先,贴出我失败的尝试吧,问题没有解决,希望日后有高手指点 简单的存储过程例子 USE [VIPDataTest_DB] GO /****** Object: StoredProcedure [...
  • shizhoulei
  • shizhoulei
  • 2015年04月29日 09:13
  • 977
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC启动过程(一)
举报原因:
原因补充:

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