分享

day01

 拳毛弧的藏经阁 2014-04-07

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);      // 声明窗口过程函数,后面有定义

/*程序入口点WinMain函数*/
int WINAPI WinMain(HINSTANCE hInstance,          // 第一个参数为程序实例句柄,用于标识该程序
       HINSTANCE hPrevInstance,         // 第二个参数用于同一程序多次运行时的标识,但在win32中不再使用,为NULL
       LPSTR lpCmdLine,           // 第三个参数为程序运行参数
       int nShowCmd)           // 第四个参数为程序运行的初始状态(最小化、正常、最大化)
{
 static TCHAR szAppName[] = TEXT("HelloWin");         // 定义一个字符串,保存程序的名字,自由定义
 HWND hwnd;                  // 定义一个句柄,以备后面创建窗体时使用
 MSG msg;                  // 定义一个消息结构,用于后面的消息循环
 WNDCLASS wndclass;                // 定义一个窗口类结构体,该结构体名为wndclass,并在下面几行设置结构体内的数据
 wndclass.style = CS_HREDRAW | CS_VREDRAW;          // CS_HREDRAW为水平方向尺寸,CS_VREDRAW为垂直方向尺寸,这两个标识用于后面调整窗体大小时,中央文本能任意显示在中央
 wndclass.lpfnWndProc = WndProc;             // 将这个窗口类的过程设置为WndProc过程函数,这个过程处理基于这个窗口类创建的所有窗口的全部消息,lpfnWndProc为指向WndProc函数的指针
 wndclass.cbClsExtra = 0;              // 用于在类结构和windows内部保存的窗口结构中预留一些额外空间,程序可以根据需要来使用预留的空间
 wndclass.cbWndExtra = 0;              // 同上
 wndclass.hInstance =  hInstance;            // 程序的实例句柄,由于该窗口属于该程序,这里与WinMain函数中的第一个参数一致
 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);        // 加载图标供应用程序使用,这里使用系统自带的预定义的图标,第一个参数为NULL,第二个参数IDI_APPLICATION是一个简单的窗口小图标,如果要用自己准备的图标,第一个参数为程序实例句柄,第二个参数标识图标
 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);         // 加载鼠标指针供程序使用, LoadCursor函数加载一个预定义的鼠标光标,光标样式为IDC_ARROW,并返回该光标的句柄,这样,当我们将鼠标放到窗体客户区上时,鼠标变成一个小箭头,若果第二个参数是其他样式,则鼠标放在客户区上时,显示不一样的光标
 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);     // 获取绘制窗口背景的刷子,GetStockObject函数返回一个刷子句柄,参数WHITE_BRUSH为白色刷子,所以这里返回的是白色刷子句柄,也可以设置其他颜色,这决定着窗口客户端的背景颜色
 wndclass.lpszMenuName = NULL;             // 指定窗口类菜单,这里不需要菜单,为空
 wndclass.lpszClassName = szAppName;            // 设置一个类名,自由定义,这里我们定义为开头定义的szAppName[]
 RegisterClass(&wndclass);              // 注册刚刚定义的窗口类

 /*根据窗口类创建一个窗口,返回一个窗口句柄保存在hwnd里,同时下面的参数指定有关该窗口更多信息*/
 hwnd = CreateWindow(szAppName,             // 第一个参数为程序注册的窗口类的名称
      TEXT("The Hello Program"),         // 第二个参数为窗口标题栏的内容
      WS_OVERLAPPEDWINDOW,          // 第三个参数为窗口风格,这里WS_OVERLAPPEDWINDOW是一种标准的窗口风格,它有一个标题栏,标题栏左边有一个系统菜单框,标题栏右边有最小化、最大化和关闭按钮,四周还有表示窗口大小的边框
      CW_USEDEFAULT,            // 第四个参数为窗口在屏幕上的水平位置,这里使用默认位置
      CW_USEDEFAULT,            // 第五个参数为窗口在屏幕上的垂直位置,这里也是用默认位置
      CW_USEDEFAULT,            // 第六个参数为窗口宽度,这里使用默认位置
      CW_USEDEFAULT,            // 第七个参数为窗口高度,这里也是用默认位置
      NULL,              // 第八个参数为父窗口句柄,由于这个程序只有一个窗口,这个窗口就是最高级窗口,所以这里留空
      NULL,              // 第九个参数为窗口菜单句柄,这里没有菜单,也留空
      hInstance,             // 第十个参数为程序实例句柄,与前面一样都为hInstance
      NULL);              // 最后为创建参数指针为NULL,可以用这个指针访问以后想要引用的程序中的数据
 ShowWindow(hwnd, nShowCmd);              // 在屏幕上显示该窗口,参数hwnd即为刚刚创建好的窗口句柄,nShowCmd即WinMain函数的第四个参数,决定窗口初始的状态,正常、最小化或最大化
 UpdateWindow(hwnd);                // 使窗口刷新自身

 while (GetMessage(&msg, NULL, 0, 0))           // 进入消息循环,GetMessage函数每执行一次从消息队列中取出一个消息,参数NULL,0,0表示程序接受属于它的所有窗口的所有消息
 {
  TranslateMessage(&msg);              // 将msg结构传递给windows,转换一些键盘消息
  DispatchMessage(&msg);              // 该函数将msg结构传给windows,然后windows将该消息发送给适当的窗口过程,让它处理,本程序中窗口过程即WndProc函数
 }
 return msg.wParam;                // 当退出消息循环后,返回msg结构的wParam数据,该数据是传递给PostQuitMessage函数的值(通常是0)
}

/*定义窗口过程,窗口过程确定了在窗口的客户区域显示什么,以及窗口怎样响应用户的输入*/
LRESULT CALLBACK WndProc(HWND hwnd,             // 第一个参数hwnd是接收消息的窗口的句柄
       UINT message,            // 第二个参数message是标识该消息的数字
       WPARAM wParam,            // 32位的消息参数,提供了关于消息的更多信息
       LPARAM lParam)            // 32位的消息参数,提供了关于消息的更多信息
{
 HDC hdc;                     // 定义一个设备描述表句柄,这里指显示输入设备句柄
 PAINTSTRUCT ps;                 // 该结构体内包含了一些窗口过程,用来刷新窗口客户区的内容
 RECT rect;                  // 定义一个RECT结构体,用于后面保存窗口客户区域的尺寸

 switch (message)                // 处理消息,这里我们定义的WndProc过程窗口函数只处理两种消息
 {
 case WM_PAINT:                 // 当我们调整窗口边框时,整个窗口将变成无效的,窗口过程收到此WM_PAINT消息,接下来我们需要重新绘制窗口,这也是使得中央文本能一直保持在中央的原因
  hdc = BeginPaint(hwnd, &ps);            // 开始窗口绘制,第一个参数为程序的窗口句柄,第二个参数为指向PAINTSTRUCT结构体的指针,该结构体内包含一些窗口过程,用来刷新窗口客户区的内容。BeginPaint函数返回一个设备描述表句柄,保存在hdc里
  GetClientRect(hwnd, &rect);             // 获取窗口客户区的尺寸,第二个参数为之前定义的RECT结构体,用于保存窗口客户区域的尺寸
  DrawText(hdc, TEXT("Hello, Windows XP!"), -1, &rect,      // 显示窗口中心文本,第一个参数为设备表描述句柄,第二个参数为要显示的文本字符串,第三个参数为-1,指示字符串是以字符0结束的,第四个参数是保存客户区尺寸的结构体
   DT_SINGLELINE|DT_CENTER|DT_VCENTER);
  EndPaint(hwnd, &ps);              // 结束窗口绘制,参数同开始窗口绘制
  return 0;
 case WM_DESTROY:                // 单机右上角关闭按钮时触发此消息
  PostQuitMessage(0);               // 在消息队列中插入一条“退出”消息,这使得WinMain函数退出消息循环,程序终止
  return 0;
 }
 return DefWindowProc(hwnd, message, wParam, lParam);       // DefWindowProc为默认消息处理函数,窗口过程不处理的消息传递给该函数
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多