windows应用程序开发系列二:windows窗口应用程序开发的步骤

在说今天的内容之前呢,我先说一下我的笔记风格,我的笔记分为两部分,第一部分进行理论知识讲解,第二部分进行代码的实例演示,我会详细注释windows程序开发中新出现的每一个函数,每一个参数,但是如果笔记中以前出现过相同的代码,那么我将不会再次注释,希望大家理解我这也是为了节省时间,讲解更多的内容。从今天开始,我将带领大家一步一步的走进windows应用程序开发的殿堂,让大家逐渐认识从普通的软件到刺激的游戏,从炫图的图形处理软件到丰富的多媒体软软件等等一系列软件的开发的基础知识、和开发过程,当然了,我自己也是入门时间不长,希望各位大侠们多多指教。好了,言归正传,进行今天的内容,windows窗口应用程序开发的步骤。

一、理论知识讲解

写一个windows应用程序的步骤:

1 定义WinMain函数(一般开发程序自己生成)

2 定义窗口处理函数 (自己定义,处理消息)

3 注册窗口类(向XP里边写入数据)

4 创建窗口 (在内存中创建窗口,注意只是在内存中,还看不见)

5 显示窗口(根据内存数据,在显示器中绘制出来)

6 消息循环( 提取/翻译/派发消息)

7 消息处理

编写任何一个windows窗口应用程序都是是按照上面的流程来进行。

二、实现一个简单的windows窗口程序,废话不多说,详细注释过的代码,每一步都有顺序编号,按照这个顺序来进行代码阅读将更加方便。

#include "stdafx.h"

/*
 2 定义一个窗口处理函数
*/
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
{
	return DefWindowProc(hWnd,nMsg,wParam,lParam);
}


/*
 1 定义一个入口函数,创建项目的时候系统已经提供好了
*/
  int APIENTRY WinMain(HINSTANCE hInstance,  
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{

	/* 
	 3 注册窗口类
	*/
	WNDCLASS wc = {0};  // 定义一个窗口类,然后给这个结构体的所有成员赋值
	
	wc.cbClsExtra = 0;	// 开缓存区
	wc.cbWndExtra = 0;	// 开缓冲区
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);	// 背景颜色
	wc.hCursor = NULL;	// NULL的意思是默认光标
	wc.hIcon = NULL;	// NULL的意思是默认图标
	wc.hInstance = hInstance;	// 当前程序实例句柄
	wc.lpfnWndProc = (WNDPROC)WndProc;	// 指定窗口处理函数,第二步中定义,需要强转一下
	wc.lpszClassName = "Main";	// 给要注册的窗口类起个名字
	wc.lpszMenuName = NULL;	// 不要菜单
	wc.style = CS_HREDRAW | CS_VREDRAW;	//表示当窗口的水平和垂直发生变化时,强行重新绘制窗口,专业术语就刷新
	
	RegisterClass(&wc);	// 将以上所有的赋值全部写入操作系统,这就是注册窗口


	/*
	 4 创建窗口(申请一块内存,向内存中扔关于窗口的数据)		
	*/
	HWND hWnd = CreateWindow("Main" // 窗口类的名字,也就是第三部指定的注册窗口类的名字 
				, "winidow" // 标题栏的信息
				, WS_OVERLAPPEDWINDOW // 窗口的风格,这个风格表示这个窗口既有标题栏,也有边框,有最大化和最小化按钮
				, 100,100 //创窗口的位置
				, 500,500 // 窗口的宽和高
				, NULL // 父窗口
				, NULL // 菜单
				,hInstance // 当前程序实例句柄
				,NULL // 最后一个参数置空
				); // 返回值为一个窗口句柄,通过这个句柄可以找到这个窗口内存数据

	
				   
	/*
	 5 显示窗口(将内存中的数据画到显示器上)
	*/
	ShowWindow(hWnd // 内存数据,可以通过窗口句柄找到
			,SW_SHOW // 显示方式,这里设置为原样显示
			);
	UpdateWindow(hWnd);	// 刷新窗口,可以不调用


	/*
	 6 消息循环
	*/
	MSG uMsg = {0}; // 定义一个消息结构体,顾名思义
	while (GetMessage(&uMsg,NULL,0,0) /* 这个函数专门负责抓消息,在操作系统的消息队列中抓取消息,将消息放入uMsg中 */)
	{
		TranslateMessage(&uMsg); // 翻译消息
		DispatchMessage(&uMsg); // 派发消息,将消息派发给我们自己定义的窗口处理函数
	}

	return 0;
}
程序写好后,编译运行,下面是我的程序运行的截图:

windows应用程序开发系列二:windows窗口应用程序开发的步骤_第1张图片

最后,这个程序有一个问题,如果你编译运行一次,关掉窗口之后,再次编译运行就会报一个错误,错误信息如下:

LINK : fatal error LNK1168: cannot open Debug/WinCreate.exe for writing

这是因为,我们点击退出按钮之后,这个程序并没有真正的退出,如果你打开任务管理器,会发现这个进程依然存在,我们只是在点击关闭按钮的时候,关闭掉了窗口的界面而已,这里先大概提一下,这是因为我们的窗口处理函数中没有处理点击关闭时的消息,后面会详解。当然了,如果你还想看看你的界面效果,先杀掉这个进程,再次重新运行就行了,今天的内容到这里。





你可能感兴趣的:(windows编程)