创建一个windows窗体主要的代码就是以下的内容:
#include "stdafx.h"
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
static TCHAR szAppName[] = "HelloWin";
HWND hWnd;
MSG msg;
WNDCLASS WndClass;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInstance;
WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = szAppName;
if(!RegisterClass(&WndClass))
{
MessageBox(NULL,TEXT("This program requires windows NT"),TEXT(szAppName),MB_ICONERROR);
return 0;
}
hWnd = CreateWindow(szAppName,
TEXT("The Hello Program."),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//窗口消息处理函数
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(uMsg)
{
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
DrawText(hdc,TEXT("This is a test for HelloWin."),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
实际上,每一个Windows程序代码中都包括程序的大部分。没人能真正记住此程序的全部写法;通常,Windows程序写作者在开始写一个新程序时总是会复制一个现有的程序,然后再做相应的修改。
Windows函数呼叫
HELLOWIN至少呼叫了18个Windows函数。下面以它们在HELLOWIN中出现的次序列出这些函数以及各自的简明描述:
- LoadIcon 加载图标供程序使用。
- LoadCursor 加载鼠标光标供程序使用。
- GetStockObject 取得一个图形对象(在这个例子中,是取得绘制窗口背景的画刷对象)。
- RegisterClass 为程序窗口注册窗口类别。
- MessageBox 显示消息框。
- CreateWindow 根据窗口类别建立一个窗口。
- ShowWindow 在屏幕上显示窗口。
- UpdateWindow 指示窗口自我更新。
- GetMessage 从消息队列中取得消息。
- TranslateMessage 转译某些键盘消息。
- DispatchMessage 将消息发送给窗口消息处理程序。
- PlaySound 播放一个声音文件。
- BeginPaint 开始绘制窗口。
- GetClientRect 取得窗口显示区域的大小。
- DrawText 显示字符串。
- EndPaint 结束绘制窗口。
- PostQuitMessage 在消息队列中插入一个「退出程序」消息。
- DefWindowProc 执行内定的消息处理。
这些函数均在Platform SDK文件中说明,并在不同的表头文件中声明,其中绝大多数声明在WINUSER.H中。
大写字母标识符
读者可能注意到,HELLOWIN.C中有几个大写的标识符,这些标识符是在Windows表头文件中定义的。有些标识符含有两个字母或者三个字母的前缀,这些前缀后头接着一个底线:
这些是简单的数值常数。前缀指示该常数所属的类别,如表3-1所示。
表3-1 |
前缀 | 类别 |
CS | 窗口类别样式 |
CW | 建立窗口 |
DT | 绘制文字 |
IDI | 图示ID |
IDC | 游标ID |
MB | 消息框 |
SND | 声音 |
WM | 窗口消息 |
WS | 窗口样式 |
奉劝程序写作者不要费力气去记忆Windows程序设计中的数值常数。实际上,Windows中使用的每个数值常数在表头文件中均有相应的标识符定义。