1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT,WPARAM, LPARAM);
/*窗口消息处理程序声明;
LRESULT为函数返回值类型,宏定义为LONG
CALLBACK说明的是函数参数的进栈顺序(从左到右)
WndProc为函数名,可任意改
4个函数参数为message结构体中的前四个参数。
*/
int  WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPreInstance,
                 PSTR szCmdLine,  int  iCmdShow)
                 /*双击QQ快捷方式, 会启动一个qq程序, 假设给它个编号9527;
再双击QQ快捷方式, 又启动了一个新的qq, 假设编号9528;
对于9528来说, hInstance=9528, hPrevInstance=9527;
不过, msdn说hPrevInstance的这个判断没效果, hPrevInstance实际上是无意义的, 不用鸟它
iCmdShow表示窗口的初始状态, 最大化, 最小化, 隐藏, 还是一般大小的显示等等
szCmdLine是命令行参数, 在windows的命令行工具cmd中启动程序的话, 有时能带上其它参数, 比如
"ping www.qq.com -t"
这个命令就带了很多参数, 用空格分开了, 分别是 ping,    www.qq.com,    -t           */
{
     static  TCHAR szAppName[]=TEXT ( "HELLO" ); //定义一个字符数组,并附以初值“helloworld”,这个helloworld是程序的名称。
     //是要进操作系统的注册表的!是告诉操作系统这个程序的名称是什么。
                                    
     HWND hwnd; //定义窗口句柄
     MSG msg; //结构体类型MSG的变量声明,该结构体中与偶六个成员变量,储存有关信息的值。
                                    
     WNDCLASS wndclass; //结构体类型WNDCLASS的声明变量,以下为初始化
     wndclass.style      =   CS_HREDRAW|CS_VREDRAW; //CS_HRESULT表示水平重画,即水平拖动窗口时,会调用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); //装载图标函数,也可装载自己的光标
     wndclass.hCursor    =   LoadCursor(NULL,IDC_ARROW); //装载光标函数,也可装载自己的光标
     wndclass.hbrBackground      =   (HBRUSH)GetStockObject (WHITE_BRUSH); //该字段为依据该类别建立的窗口背景颜色,此程序为白背景
     wndclass.lpszMenuName   =   NULL; //该字段指定窗口类别菜单,该程序中没有设置菜单
     wndclass.lpszClassName= szAppName; //类别名称,该类别名称与程序相同
     RegisterClass (&wndclass);
     /*if(!RegisterClass (&wndclass)) //向操作系统注册窗口类,即向操作系统申请内存
     {
         MessageBox(NULL,TEXT("WINDOWS 7"),//第一个参数为视窗代号,第二个为主体内容,第三个为标题
         /*第四个参数可以是在WINUSER.H中定义的一组以字首MB_开
始的常数的组合。您可从第一组中选择一个常数指出希望在对话方块中显示的
按钮:
#define   MB_OK                            0x00000000L
#define   MB_OKCANCEL                      0x00000001L
#define   MB_ABORTRETRYIGNORE              0x00000002L
#define   MB_YESNOCANCEL                   0x00000003L
#define   MB_YESNO                         0x00000004L
#define   MB_RETRYCANCEL                   0x00000005L
如果在HELLOMSG中将第四个参数设置为0,则仅显示「 OK 」按钮。可以
使用C语言的OR(|)操作符号将上面显示的一个常数与代表内定按钮的常数组*/
         szAppName,MB_ICONERROR);
         return  0 ;
     }
*/   //消息对话框,用于异常处理
     hwnd=CreateWindow(szAppName, //window class name 应用程序在操作系统注册表的名称
     TEXT( "huany" ), //window caption 应用程序标题栏名称
     WS_OVERLAPPEDWINDOW, //window style窗口样式
     CW_USEDEFAULT, //initial x position窗口显示时距屏幕左上角的x坐标
     CW_USEDEFAULT, //initial y position窗口显示时距屏幕左上角的y坐标
     CW_USEDEFAULT, //initial x size窗口宽度
     CW_USEDEFAULT, //initial y size 窗口高度
     NULL, //parent windowhandle父窗口句柄,此程序没有。
     NULL, //window menu handle菜单句柄
     hInstance, //program instance handle程序实例句柄
     NULL); //creation Parameter  创建参数指针
     ShowWindow(hwnd,iCmdShow); //该函数在显示器上显示函数
     /*第一次调用窗口回调函数WndProc注意WndProc函数不是ShowWindows函数来调用
     而是ShowWindows操作系统发送消息,是操作系统根据发送的消息来调用WndProc函数
     操作系统调用WndProc函数后并响应WM_CREAT消息
     */
                                    
     UpdateWindow(hwnd); //刷新窗口函数,操作系统调用WndProc函数并响应WM_PAINT消息
                                    
     while (GetMessage(&msg,NULL, 0 , 0 )) //这是所有windows程序的核心,消息循环处理过程,这里是接受消息和发送消息的地方
     /*这一呼叫传给windows的一个指标,指向为msg的MSG结构。
     第二、第三和第四个参数设定位NULL或0,表示接受自己建立的所有窗口飞所有
     windows用从消息队列中取出的下一个消息结构的各个字段。
     Getmwssage函数从操作系统的消息队列中获取消息,一个一个的处理,来一个处理一个
       直接获取退出消息,也就是点击应用程序右上角的叉子退出消息循环,并效应WM_Quitmessge*/
     {
         TranslateMessage(&msg); //将msg结构传给windows进行一些键盘转换。进行虚拟键盘消息的转换
         DispatchMessage(&msg); //将msg结构传给窗口过程,由操作系统调用消息处理WndProc
     }
     return  msg.wParam;
}
//主函数结束
//窗口回调函数,此函数有操作系统调用,因此只有声明和定义;
LRESULT CALLBACK WndProc(HWND   hwnd ,UINT message,WPARAM  wParam,LPARAM lParam)
{
     HDC     hdc; //设备描述句柄
     PAINTSTRUCT     ps; //绘图结构变量
     RECT    rect; //矩形结构变量
     switch  (message) //message消息类型:分别处理不同的消息;
     {
     case  WM_CREATE: //此消息是一个应用程序发送的第一个消息,也是唯一的一次:在窗口显示之前该消息juice已经执行了
             PlaySound (TEXT ( "start.wav" ),NULL,SND_FILENAME|SND_SYNC); //播放声音文件
         return  0 ;
                                        
     case  WM_LBUTTONUP:
     PlaySound (TEXT ( "arrow.wav" ),NULL,SND_FILENAME|SND_SYNC); //播放声音文件
         return  0 ;
     case  WM_PAINT: //这个消息在windows是很重要的
//当窗口显示区域的一部分显示内容或者全部为无效,以至于更新画面时,将由这个消息通知程序响应
         hdc = BeginPaint(hwnd,&ps); //开始窗口绘制(hdc无效区)
         GetClientRect(hwnd,&rect); //获得客户区的尺寸
         DrawText (hdc,TEXT ( "huangy" ),- 1 ,&rect,
             DT_SINGLELINE|DT_CENTER|DT_VCENTER); //显示文本串
             PlaySound (TEXT ( "msg.wav" ),NULL,SND_FILENAME|SND_SYNC); //播放声音文件
         EndPaint(hwnd,&ps); //结束窗口绘画
         return  0 ;
     case  WM_DESTROY: //处理退出消息
             PlaySound (TEXT ( "start.wav" ),NULL,SND_FILENAME|SND_ASYNC); //播放声音文件
         PostQuitMessage( 0 ); //在消息队列中插入一条退出消息
         return  0 ;
     }
     return  DefWindowProc (hwnd, message,wParam,lParam); //执行默认的消息处理,处理一些闲杂以及一些不可预料的消息
}

本文转自lilin9105 51CTO博客,原文链接:http://blog.51cto.com/7071976/1220389,如需转载请自行联系原作者