/*
Name: hellowin
Copyright:
Author:
Date: 16-10-07 22:09
Description:
*/
#include <windows.h>
/*声明WndProc()视窗信息处理函数*/
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
/*WinMain()*/
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ; //这个是窗口类别的文字名称
HWND hwnd ; //程序句柄
MSG msg ; //消息结构 在windows.h中定义
WNDCLASS wndclass ; //为WNDCLASS定义一个结构,它一共有十个成员
//注意这里是WNDCLASS 最后是两个S,原程序是一个S
//WNDCLASS 为视窗类别结构,在windows.h中定义
wndclass.style = CS_HREDRAW | CS_VREDRAW ;//使用C的位「或」运算子结合了两个「
//窗口类别样式」标识符。CS前缀为窗口类别
wndclass.lpfnWndProc = WndProc ; //这个重要
//第二个字段(lpfnWndProc) 是依据这个类别来建立的所有窗口所使用的窗口消息处理程序的地址。
//这个过程将处理依据这个窗口类别建立的所有窗口的全部消息。
//下面这两个字段用于在窗口类别结构和Windows内部保存的窗口结构中预留一些额外空间:
//程序可以根据需要来使用预留的空间。本程序没有使用它们,所以设定值为0。
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
//这个字段就是程序的执行实体句柄(它也是WinMain的参数之一)
wndclass.hInstance = hInstance ;
//为所有依据这个窗口类别建立的窗口设置一个图标。
//要取得预先定义图示的句柄,可以将第一个参数设定为NULL来呼叫LoadIcon。
//在加载程序写作者自订的图标时(图标应该存放在磁盘上的.EXE程序文件中),
//这个参数应该被设定为程序的执行实体句柄hInstance。
//第二个参数代表图示。对于预先定义图示,此参数是以IDI开始的标识符(「ID代表图示」),
//标识符在WINUSER.H中定义。IDI_APPLICATION图标是一个简单的窗口小图形
//LoadIcon函数传回该图示的句柄。我们并不关心这个句柄的实际值,它只用于设置hIcon字段元的值。
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
//LoadCursor函数加载一个预先定义的鼠标光标(命名为IDC_ARROW),并传回该游标的句柄。
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
//下一个字段指定依据这个类别建立的窗口背景颜色。hbrBackground字段名称中
//的hbr前缀代表「handle to a brush(画刷句柄)」。
//画刷是个绘图词汇,指用来填充一个区域的着色样式。
//Windows有几个标准画刷,也称为「备用(stock)」画刷。
//这里所示的GetStockObject呼叫将传回一个白色画刷的句柄:
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);//(HBRUSH) GetStockObject (WHITE_BRUSH) ;
//下一个字段指定窗口类别菜单。HElLOWIN没有应用程序菜单,所以该字段被设定为NULL:
wndclass.lpszMenuName = NULL ; //这里应该是lpszMenuName,在最后边有个e,原程序里没有
//最后,必须给出一个类别名称。对于小程序,类别名称可以与程序名相同,
//即存放在szAppName变量中的「HelloWin」字符串。
wndclass.lpszClassName = szAppName ; //这个重要
//最后一个字段是窗口类别的文字名称。程序写作者可以随意定义其名称。
//在只建立一个窗口的程序中,窗口类别名称通常设定为程序名称。
//注册窗口类
if (!RegisterClass (&wndclass))
{
MessageBox ( NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow( szAppName, // window class name
TEXT ("QQ用户登录"),// window caption标题栏上标题名字
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU |
WS_BORDER | WS_MINIMIZEBOX,//禁用最大化
/ _OVERLAPPEDWINDOW, // window style窗口样式
345,//CW_USEDEFAULT, // initial x position初始坐标位置
232,//CW_USEDEFAULT, // initial y position
330, // initial x size
250, // initial y size
HWND_DESKTOP,//parent window handle父窗口句柄,原为NULL,我给改为了桌面窗口句柄HWND_DESKTOP
NULL, // window menu handle菜单句柄
hInstance, // program instance handle程序实体句柄
NULL) ; // creation parameters
//ShowWindow函数在显示器上显示窗口。
//第一个参数是刚刚用CreateWindow建立的窗口句柄
//第二个参数是作为参数传给WinMain的iCmdShow
ShowWindow (hwnd, iCmdShow) ;
//重画显示区域(刷新窗口)
UpdateWindow (hwnd) ; //我试了,这个也可以不要
/*消息循环*/
//程序通过执行一块称之为「消息循环」的程序代码从消息队列中取出消息:
//消息循环以GetMessage呼叫开始,它从消息队列中取出一个消息:
//消息循环以GetMessage呼叫开始,它从消息队列中取出一个消息:
//第二、第三和第四个参数设定为NULL或者0,表示程序接收它自己建立的所有窗口的所有消息。
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;//将msg结构传给Windows,进行一些键盘转换。
DispatchMessage (&msg) ;//又将msg结构回传给Windows。然后,Windows将该消息发送给
//适当的窗口消息处理程序( WndProc() ),让它进行处理。这也就是说,Windows将呼叫窗口消息处理程序。
}
//处理完消息之后,WndProc传回到Windows。此时,Windows还停留在DispatchMessage呼叫中。
//在结束DispatchMessage呼叫的处理之后,Windows回到HELLOWIN,
//并且接着从下一个GetMessage呼叫开始消息循环。
return msg.wParam ;
}
/*WndProc() 消息处理函数*/
//程序通常不直接呼叫窗口消息处理程序,窗口消息处理程序通常由Windows本身呼叫。
//通过呼叫SendMessage函数,程序能够直接呼叫它自己的窗口消息处理程序。
//窗口消息处理程序确定了在窗口的显示区域中显示些什么以及窗口怎样响应使用者输入。
//窗口消息处理程序总是定义为如下形式:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ; //设备内容句柄,HDC数据类型定义为32位的unsigned int
PAINTSTRUCT ps ; //为窗口保存"绘图"信息结构"
RECT rect ;
int iLength ;
TCHAR szBuffer [40] ;
iLength = wsprintf (szBuffer, TEXT ("QQ:"),NULL) ;
//窗口消息处理程序所接受的每个消息均是用一个数值来标识的,也就是传给窗口消息处理程序的message参数。
//Windows表头文件WINUSER.H为每个消息参数定义以「WM」(窗口消息)为前缀开头的标识符。
switch (message)
{
//没有音乐文件,所以把这段代码注释掉了
// case WM_CREATE:
// PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
// return 0 ;
case WM_PAINT:
//*************
hdc = BeginPaint (hwnd, &ps) ;//返回设备内容句柄
GetClientRect (hwnd, &rect) ;
//DrawText可以输出文字(正如其名字所表明的一样)
// DrawText(hdc, TEXT ("这部分是由窗口消息处理程序WndProc()实现的"), -1, &rect,
// DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
TextOut(hdc,0,0,szBuffer,iLength);
EndPaint (hwnd, &ps) ;//呼叫EndPaint即可释放设备内容句柄。
//******************
return 0 ;
//WM_DESTROY消息是另一个重要消息。这一个消息指示,Windows正在根据使用者的指示关闭窗口。
//该消息是使用者单击Close按钮或者在程序的系统菜单上选择 Close时发生的
case WM_DESTROY:
//HELLOWIN通过呼叫PostQuitMessage以标准方式响应WM_DESTROY消息:
PostQuitMessage (0) ;
return 0 ;
}
//呼叫DefWindowProc来为窗口消息处理程序不予处理的所有消息提供内定处理,这是很重要的。
//不然一般动作,如终止程序,将不会正常执行
return DefWindowProc (hwnd, message, wParam, lParam) ;//内定窗口消息处理程序
}