Windows窗口华丽大方, 框架组成也很复杂,一般来说一个应用程序往往包括以下组成部分:
1、基本窗口 包括标题栏和四个边框构成的工作区,这是程序的基本框架,所有显示的文字、图片、对话框都是在这个窗口框架当中显示,如果这个窗口关闭,那么相应的所有内容也都会关闭,有时也称作“父窗口”;
2、程序菜单、显示的文字、图片、弹出式对话框这些都是作为程序使用到的资源;
3、基于对话框上所显示的标签、文本框、列表框、滚动条等等称作是控件,它们可以完成一些特定的功能,它们不能独立存在;
4、键盘、显示器是输入输出设备,归Windows系统管理,应用程序使用之前需要向系统申请;
5、程序的启动、运行,各个组件之间,是通过“消息”相互沟通的,程序启动后会自动发出一个“创建”消息,向系统申请内存、调入资源、构建程序窗口;
比较常见的是鼠标消息,鼠标单击、双击或者移动什么的,都会发送出相应的消息,程序就会显示一小段文字提示,要不就是按钮弹起来按下去等等,
有的消息系统帮着处理了,有的消息就得程序自己动手处理 ;
下面我们来创建一个较为完整的应用程序窗口:
1、启动VC,新建一个名为“SmlWin”的Win32 Application工程,工程位置在自己的文件夹中;
2、新建一个名为“SmlWin”的头文件,方法是单击“新建”命令,在左边选择C++源程序上面的C/C++ Header File ,再在右边空白“文件”名称输入SmlWin,单击“确定”,
头文件包含源程序文件用到的函数申明,输入下面的代码(绿色部分是注释,必须以双斜杠“//”开头,先可以不输入),
有的一行太长会自动折到下一行,代码先抄到本子上,或者打印出来, 注意I和l两个字母不同,代码使用缩进格式,规范化;
//代码开始
//申明一些源程序(SmlWin.cpp)中用到的函数原型;
//申明和定义分开,互不干扰,定义在源程序中;
//定义好的函数,在WinMain主函数中调用;
LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);
//申明一个消息处理函数
BOOL InitApplication(HINSTANCE);
//申明一个初始化窗口的函数
BOOL InitInstance(HINSTANCE,int);
//申明一个创建窗口的函数
char *myStr="拉开窗帘,阳光照射进来。";
//申明并定义一个用到的字符串
3、新建一个名为“SmlWin”的C++源程序文件,单击“确定”进入文本区输入下面的程序:
///////////////////////////////
// 程序名:SmlWin.cpp
// 用途是:显示一个简单窗口
///////////////////////////////
//包含头文件*.h
#include <windows.h> //运行在Windows系统下
#include <string.h> //用到字符串
#include "SmlWin.h" //函数的申明
HINSTANCE hInst;//申明当前实例句柄
HWND hWndMain; //申明主窗口句柄
////////////////////////////////////////////////////
// 函数名: WinMain(HINSTANCE,HINSTNCE,LPSTR,int)
// 用途是: 程序入口,调用初始化函数,处理消息循环,
////////////////////////////////////////////////////
int APIENTRY WinMain(//主函数有四个参数
HINSTANCE hInstance,//当前实例句柄
HINSTANCE hPrevInstance,//前一实例句柄
LPSTR lpCmdLine,//命令行字符串
int nCmdShow)//窗口显示方式
//函数头结束,开始定义函数
{
MSG msg; //申明一个消息,消息是结构变量;
//调用函数,初始化窗口数据,并注册窗口类;
if(!InitApplication(hInstance))//调用InitApplication函数
{
MessageBox(NULL,"InitApplication函数错误","提示",MB_OK);
//用于调试,找出程序没反应的错误
return (FALSE);
}
//调用函数,创建和显示窗口;
if(!InitInstance(hInstance,nCmdShow))//调用InitInstance函数
return (FALSE);
//进入消息循环,从应用程序消息队列中检取消息;
while (GetMessage(&msg,NULL,0,0))
{//把虚拟键消息翻译为字符消息;
TranslateMessage(&msg);
//把消息分配到相应的窗口过程中去;
DispatchMessage(&msg);
}
return (msg.wParam);//返回附加的消息
}
//**下面是定义要用到的函数,定义了主函数才能调用**
///////////////////////////////////////////
// 函数名:InitApplication(HINSTANCE)
// 用途是:供主函数用,初始化窗口,并注册窗口
///////////////////////////////////////////
BOOL InitApplication(HINSTANCE hInstance)//当前实例句柄
{//窗口类定义
WNDCLASS SmlWin;//定义一个WNDCLASS 结构对象SmlWin;
SmlWin.style=0;//对象的基本窗口风格
SmlWin.lpfnWndProc=(WNDPROC)MainWndProc;//处理消息的函数
SmlWin.cbClsExtra=0;//分配给窗口类结构之后的额外字节数
SmlWin.cbWndExtra=0;//分配给窗口实例后的额外字节数
SmlWin.hInstance=hInstance;//标识窗口过程所在的实例
SmlWin.hInstance=hInstance;//标识窗口过程所在的实例
SmlWin.hIcon =LoadIcon(hInstance,IDI_APPLICATION);//加载图标
SmlWin.hCursor=LoadCursor(NULL,IDC_ARROW);//标识类的鼠标指针
SmlWin.hbrBackground=(HBRUSH)(14);//蓝色窗口
//填充背景色用(HBRUSH)强制转换数据类型;
SmlWin.lpszMenuName=NULL;//无菜单
SmlWin.lpszClassName="SmlWinWClass";//标识本类名称的字符串
return (RegisterClass(&SmlWin)); //注册窗口类
}//函数定义完毕,下面是另一个定义
///////////////////////////////////////
// 函数名:InitIstance(HINSTANCE,int)
// 用 途:供主函数用,初始化窗口的各个属性
///////////////////////////////////////
BOOL InitInstance(//有两个参数;
HINSTANCE hInstance,//一个是实例句柄,
int nCmdShow)//另一个是窗口的显示方式;
{
hInst=hInstance;
//保存当前实例句柄,供其他函数调用,hInst是一个全局变量在WinMain函数之前定义
hWndMain=CreateWindow(//调用API函数
"SmlWinWClass",//上一个函数定义的窗口类名称
"蓝色荡漾",//窗口标题
WS_OVERLAPPEDWINDOW,//创建标题栏的风格
CW_USEDEFAULT,CW_USEDEFAULT,//默认的窗口位置(x,y)
CW_USEDEFAULT,CW_USEDEFAULT,//默认的窗口大小(宽度,高度)
NULL,//父窗口句柄
NULL,//当前菜单句柄
hInstance,//当前实例句柄
NULL);//创建窗口的大小
if(!hWndMain)//判断是否成功创建窗口,判断hWndMain句柄的值
return (FALSE);
ShowWindow (hWndMain,nCmdShow);//显示窗口
//hWndMain是指定要显示窗口的句柄
//nCmdShow是从WinMain()函数的nCmdShow传递来的显示方式
UpdateWindow(hWndMain);//更新窗口客户区
return (TRUE);//返回值TRUE
}
////////////////////////////////////////////////
// 函数名:MainWndProc(HWND,UINT,WPARAM,LPARAM)
// 用途是:处理窗口消息
////////////////////////////////////////////////
LRESULT CALLBACK MainWndProc(//有四个参数
HWND hWnd,//窗口句柄
UINT message,//消息类型
WPARAM wParam,//消息附带信息
LPARAM lParam)//消息附带信息
{
HDC hdc; //需要显示器设备来显示文本
PAINTSTRUCT ps; //使用设备的方法
switch(message) //需要自己处理的消息
{
case WM_PAINT: //接收WM_PAINT消息,本消息自动产生
hdc=BeginPaint(hWnd,&ps); //申请设备
TextOut(hdc,20,30,myStr,lstrlen(myStr));
//myStr已经在头文件SmlWin.h中定义为字符串
EndPaint(hWnd,&ps); //结束设备使用
break;//本条消息处理完毕,
case WM_DESTROY://退出应用程序,
PostQuitMessage(0);//向系统发送一条WM_QUIT消息,
break;
default: //让系统帮着处理的消息
return (DefWindowProc(hWnd,message,wParam,lParam));
}
return(0);//函数返回值
}//代码结束
记着经常保存,输入完成后单击“编译条”上的构建按钮,检查一下是否有错误,注意拼写错误、字母大小写,一句结束的分号,和使用英文标点符号,大括号的配对,修改后及时保存,
“构建”通过以后再单击“执行”按钮,看看倾注自己心血的程序窗口;
本节学习了应用程序的框架结构,可以看出有四个部分:主函数WinMain、初始化函数InitApplication、创建函数InitInstance和消息函数MainWndProc,
如果你成功地完成了练习,理解了窗口的各个组成代码,请继续学习下一课内容;