HELLOWIN.C程序代码注释
/*------------------------------------------------------------
HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
(c) Charles Petzold, 1998
------------------------------------------------------------*/
//====================================================================
//Name : HELLOWIN.C
//Author : LaoDing
//Version :
//Copyright : Your copyright notice
//Description : 代码注释
//====================================================================
#include <windows.h>//系统自带头文件,位置在:C:\Program Files\Microsoft Visual Studio\VC98\Include\
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
/*WndProc回调函数声明,类型为CALLBACK,WndProc为标识符,被定义为__stdcall,它指定了window和应用程序之间函数调用的特定次序;
返回值LRESULT 等价于LONG数据类型,CALLBACK是回调,UINT 类型,即unsigned int,表示一个32位的值。
WPARAM为32位UINT类型,LPARAM为32位LONG型 */
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
/*int 表示函数返回值为int, WINAPI为函数调用约定,定义为__stdcall,它指定了window和应用程序之间函数调用的特定次序;WinMain 为Windows程序主函数,
HINSTANCE为实例句柄,为一个数值,程序用来标识我们这个程序,把句柄当作调用参数。
同一程序所有实例都可以享受代码和只读存储器;PSTR为指向非宽字符串的指针,即char*,用来运行程序的命令行,有时是把程序装入内存;
iCmShow 用来定义程序如何显示,或正常显示,或全屏显示。
*/
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;//窗口句柄,(非常重要),句柄本质上是引用某个对象数值(一个32位数值)
MSG msg ;//消息结构
WNDCLASS wndclass ;//窗口类结构
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;//前缀lpfn表示“指向函数的长指针
wndclass.cbClsExtra = 0 ;//前缀cb表示“字节数”(count of byte),常用在一个表示字节尺寸的变量名称中
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;//前缀h表示一个句柄
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;//加载图标函数,供程序使用
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;//加载光标函数,供程序使用,鼠标变成一个小箭头,也可以定义为其他样式
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;//前缀hbr表示画刷的句柄,handle to a brush;获取一个图像对象,参数表示用来对窗体背景进行重绘的画刷
wndclass.lpszMenuName = NULL ;//前缀lpszb表示指向以零为结束的字符串的指针long pointer to a string terminated with a zero,不带任何菜单
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))//RegisterClass函数为应用程序注册一个窗口类
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;//MessageBox函数是显示消息框;
//用来显示短信息的,显示一个小小的对话窗口,第一个参数是通常是一个窗口句柄,第二个参数是要在信息框中显示的文字内容,
//第三个参数是将要在标题拦上位置显示的文本,第四个参数是以MB打头的常量组合,常量值表示对话框里希望用哪种按钮。。
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name,CreateWindow函数-基于窗口类创建一个窗口
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position “CW”表示创建窗口选项
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
/*在屏幕上显示窗口,第一个参数指向由CreateWindow创建的句柄,第二个参数是winMain函数接收的iCmdShow值,
这个参数决定窗口是正常显示,还是最小化或最大化窗体,如果正常显示,则从winMain传给ShowWindow的参数值为SW_SHOWNORMAL。
若窗体最大化显示,则SW_SHOWMAXMIZED,若窗体只是显示在任务栏,则为SW_SHOWMINNOACTIVE*/
UpdateWindow (hwnd) ;//指示窗口对其自身进行重绘
while (GetMessage (&msg, NULL, 0, 0))//从消息队列获取消息
/* msg是一个结构变量,定义于WINUSER.h文件中
tyfedef struct tagMSG{
HWND hwnd;//指向窗口的句柄
UINT message;//消息标识符,用来标识消息的数字,比如,在客户区,按下鼠标左键,windows会收到一个以WM(Windows message)为前缀的message字段为
//WM_LBUTTONDOWN(值为0x0201)的消息放入消息队列。
WPARAM wparam;//32为消息字段,取决于具体的消息
LPARAM lparam;//32消息字段
DWORD time;//消息进入队列的时间
POINT pt;//消息进入消息队列中时,鼠标指针的位置坐标。
}MSG, *PMSG;
*/
{
TranslateMessage (&msg) ;//翻译一些键盘消息
DispatchMessage (&msg) ;//将消息发送给窗口过程
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;//设备环境句柄
PAINTSTRUCT ps ;//绘制结构
RECT rect ;//矩形结构
switch (message)
{
case WM_CREATE:
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_SYNC) ;//播放声音文件
/* 解决无法播放声音文件的方法:从Project菜单中选setting菜单项, 如何选Link选项,在object/library modules中添加WINMM.LIB (windows 多媒体对象库
PlaySound函数,第一个参数是波形文件名称 ,第二个参数只有声音文件是资源文件时才可用,第三个参数指定一组选项
*/
return 0 ;
case WM_PAINT:/*这个消息在windows编程中非常重要,
当窗口的客户区部分、全部“无效”(比如首次创建、调整窗口大小,最小化后恢复、遮挡)时,且必须更新,应用程序将得到通知,这意味着窗口必须重绘。
*/
//PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_SYNC) ;
hdc = BeginPaint (hwnd, &ps) ;//标明窗口绘制开始,BeginPaint函数必须跟EndPaint函数成对出现。第一个参数hwnd为程序的窗口句柄,
//第二个参数为指向PAINTSTRUCT结构的指针。
GetClientRect (hwnd, &rect) ;//获取窗口客户区的尺寸
DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;//显示一个文本字符串
//第一个参数为设备资源分配表的句柄,第二个参数为所要绘制的文本内容,第三个参数设为-1,表示文本字符串以0位结尾。
//最后一个参数为一组位标记,这些位标记位的定义于WINUSER.h文件中,这些标记表示在第四个参数矩形里显示,并且水平和垂直居中显示。
EndPaint (hwnd, &ps) ;//结束窗口绘制
return 0 ;
case WM_DESTROY:
//PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_SYNC) ;
PostQuitMessage (0) ;//将“退出”消息插入消息队列
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;//对所以窗口过程没有处理的消息执行默认的消息处理,这一点非常重要,否则其他正常行为无法执行。
}