日期:2014-05-16  浏览次数:20735 次

Windows学习笔记第二课---第一个windows程序Hello Windows!

一、自己的窗口

        在前面,我们使用了同一个函数MessageBox来向使用者输出文字。MessageBox函数会建立一个「窗口」。但这只是一个功能有限的特殊窗口。消息窗口有一个带关闭按钮的标题列、一个选项图标、一行或多行文字,以及最多四个按钮。当然,必须选择Windows提供给您的图标与按钮。

在Windows中,「窗口」一词有确切的含义。一个窗口就是屏幕上的一个矩形区域,它接收使用者的输入并以文字或图形的格式显示输出内容。

  

我们不能在消息框中显示图形,而且也不能在消息框中添加菜单。要添加这些对象,就需要建立自己的窗口,现在就开始。

建立窗口很简单,只需呼叫CreateWindow函数即可。


桌面上常见的窗口:
应用程序窗口:
显示程序名称的标题列、菜单甚至可能还有工具列和滚动条。
对话框:它可以有标题列也可以没有标题列。装饰对话框表面的还有各式各样的按键、单选按钮、复选框、清单方块、滚动条和文字输入区域。其中每一个小的视觉对象都是一个窗口。更确切地说,这些都称为「子窗口」或「控件窗口」或「子窗口控件」。

所谓「Windows给程序发送消息」,是指Windows呼叫程序中的一个函数,该函数的参数描述了这个特定消息。这种位于Windows程序中的函数称为「窗口消息处理程序」。

窗口通常是在「窗口类别」的基础上建立的。窗口类别标识了处理窗口消息的窗口消息处理程序。使用窗口类别使多个窗口能够属于同一个窗口类别,并使用同一个窗口消息处理程序。

程序建立的每一个窗口都有相关的窗口消息处理程序。这个窗口消息处理程序是一个函数,既可以在程序中,也可以在动态链接库中。

对象是程序与数据的组合。窗口是一种对象,其程序是窗口消息处理程序。数据是窗口消息处理程序保存的信息和Windows为每个窗口以及系统中那个窗口类别保存的信息。

Windows程序开始执行后,Windows为该程序建立一个「消息队列」。这个消息队列用来存放该程序可能建立的各种不同窗口的消息。程序中有一小段程序代码,叫做「消息循环」,用来从队列中取出消息,并且将它们发送给相应的窗口消息处理程序。有些消息直接发送给窗口消息处理程序,不用放入消息队列中。

建立一个窗口首先需要注册一个窗口类别,那需要一个窗口消息处理程序来处理窗口消息。处理窗口消息对每个Windows程序都带来了些负担。


代码及其详细注释如下:

/*------------------------
HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
(c) Charles Petzold, 1998
------------------------*/

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;//窗口消息处理程序声明:
                                                       //LRERULT为函数返回值类型,宏定义为LONG;
                                                       //CALLBACK说明的是函数参数的进栈顺序(从左到右)
                                                       //WndProc为函数名,可任意改
                                                       //4个函数参数为message结构体中的前4个参数,

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)       //主函数,Windows程序进入点;其中,int为函数返回值类型,WINAPI说明的是函数的进栈顺序。
					                                    //第一个参数为执行实体(程序自身)句柄,唯一的标识该程序;第二个参数在32位的Windows中已失去了意义,总是NULL;
														//第三个参数是用于执行程序的命令列;第四个参数指出窗口最初的显示方式,最小化、最大化、还是正常显示。
{
	static TCHAR szAppName[] = TEXT ("HelloWin") ;      //定义一个字符串数组,并赋以初值“HelloWin”,这个“HelloWin”是程序的名字
	                                                    //是要进操作系统的注册表的!是告诉操作系统你这个程序的名字是什么!
	HWND         hwnd ;                                 //定义窗口句柄
	MSG          msg ;                                  //结构体类型MSG的变量申明,该结构体中有六个成员变量,储存有关消息的信息
	WNDCLASS     wndclass ;                             //结构体类型WNDCLASS的变量申明,以下为该变量成员的初始化
	
	wndclass.style         = CS_HREDRAW | CS_VREDRAW ;  //CS_HREDRAW表示水平重画,即水平拖动窗口时,会调用WM_PAINT消息重画窗口,调整窗口尺寸
	                                                    //CS_VREDRAW表示垂直重画,即垂直拖动窗口时,会调用WM_PAINT消息重画窗口,调整窗口尺寸
	wndclass.lpfnWndProc   = WndProc ;                  //该字段是依据这个窗口类别来建立的所有窗口的消息处理程序的地址
	wndclass.cbClsExtra    = 0 ;                        //预留空间的附加值,此程序没用到这个域!
	wndclass.cbWndExtra    = 0 ;                        //预留空间的附加值,此程序没用到这个域!
	wndclass.hInstance     = hInstance ;                //该字段为执行实体句柄,初始化为WinMain中的第一个参数
	wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;                //装载图标函数。当装载自己的图标时,第一个参数设为hInstance
	wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;                    //装载光标函数。也可装载自己的光标
	wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH) ;           //该字段为依据该类别建立的窗口背景颜色。此程序中设为黑色背景,可根据需要设置颜色
	wndclass.lpszMenuName  = NULL ;