hello world 注解

//这是我初次编写windows应用程序(窗口),按理说是按书本上的抄录下来的,呵呵

//下面我把代码详细解释一下

 

/**********************一些字符前缀解释****************************************************/

/*cs_:class(类风格选项)WM_:widows message(窗口消息)CW_:creat widows(绘制窗口)

DT_:draw text(绘制文本选项)

RECT:rectangle(巨型)instance:实例 h:handle(句柄,行为,把手) vertical:垂直

horizontal:水平的

*/

#include <windows.h>

 

LRESULT CALLBACK WndProc(

  HWND hwnd,              // handle to window

  UINT Msg,               // message

  WPARAM wParam,          // first message parameter

  LPARAM lParam           // second message parameter

);

 

int WINAPI WinMain(

  HINSTANCE hInstance,      // handle to current instance

  HINSTANCE hPrevInstance,  // handle to previous instance

  LPSTR lpCmdLine,          // command line

  int iCmdShow              // show state

)

{

       static TCHAR szAppName[]=TEXT("HelloWin");

       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_ERROR);  //窗口左上角是一个叉的图标

       wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);  //光标选项(也就是鼠标)

       wndclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);  //客户区背景

       wndclass.lpszMenuName=NULL;  //vc中,有菜单,这个程序,没有菜单,所以为NULL

       wndclass.lpszClassName=szAppName;   //这个类的名字

 

       if(!RegisterClass(&wndclass))   //注册窗口类

       {

              MessageBox(NULL,TEXT("This program requires Windows NT!"),

                     szAppName,MB_ICONERROR);

              return 0;

       }

 

       HWND hwnd;  //定义一个窗口句柄,开始创建窗口

       hwnd=CreateWindow(                     //创建窗口

         szAppName,  // registered class name

         TEXT("The Hello Program"), // window name

      /*********************WS_OVERLAPPEDWINDOW 重叠式窗口****************************************************/

         //创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOXWS_MAXIMIZEBOX风格的重叠式窗口

         /*WS_OVERLAPPEDWINDOW*/WS_MINIMIZEBOX|WS_OVERLAPPED|WS_SYSMENU|WS_THICKFRAME|WS_MAXIMIZEBOX,    

         CW_USEDEFAULT,                // horizontal position of window

         CW_USEDEFAULT,                // vertical position of window

         CW_USEDEFAULT,           // window width

         CW_USEDEFAULT,          // window height

         NULL,      // handle to parent or owner window

         NULL,          // menu handle or child identifier

         hInstance,  // handle to application instance

         NULL       // window-creation data

       );

 

       ShowWindow(hwnd,iCmdShow);    //显示窗口

       UpdateWindow(hwnd);           //更新窗口

       while(GetMessage(&msg,NULL,0,0)) //消息循环(这一步是从消息队列中得到消息)  

       {

              TranslateMessage(&msg);  //消息转换

              DispatchMessage(&msg);  //消息映射(如果在MFC中,这是一个非常难的难点)

       }

       return msg.lParam;  //如果得到一个WM_QUIT消息,退出while()循环,程序返回结束

}

 

//窗口过程函数

LRESULT CALLBACK WndProc(   

  HWND hwnd,              // handle to window

  UINT msg,               // message

  WPARAM wParam,          // first message parameter

  LPARAM lParam           // second message parameter

)

{

       HDC hdc;

       PAINTSTRUCT ps;

       RECT rect;

       switch(msg)

       {

 

              case WM_CREATE:  //创建窗口时由windows发送给窗口过程的,此时消息并没有进入消息队列

                     //     PlaySound(TEXT("hello,war"),NULL,SND_FILENAME|SND_ASYNC);

                            return 0;

              case WM_PAINT: //此消息也不是从消息队列中获得的,也是widows发送的

                     hdc=BeginPaint(hwnd,&ps);  //返回的是一个“设备描述表句柄”

                     GetClientRect(hwnd,&rect);  //通过这个函数可以获得变化后的窗口大小(我也不知道怎么实现的)

                     DrawText(

                       hdc,          // handle to DC

                       TEXT("Hello,Windows xp!"), // text to draw

                       -1,       // text length

                       &rect,    // formatting dimensions

                       DT_SINGLELINE|DT_CENTER|DT_VCENTER     // text-drawing options

                            );

                     EndPaint(hwnd,&ps);

                     return 0;

              case WM_DESTROY:

                     PostQuitMessage(0);

                     return 0;

       }

       return DefWindowProc(hwnd,msg,wParam,lParam);

}

/*分析WM_PAINT消息:如果用户最终单击了关闭按钮,DefWindowProc处理键盘和鼠标输入,检测到close选项后,

给窗口过程发送一个WM_SYSCOMMAND消息,WndProc将这个消息传给DefWindowProc,此函数给窗口过程发送一个WM_CLOSE消息

来响应之,DestroyWindow 导致Windows给窗口过程发送一个WM_DESTROY消息。WndProc再调用PostQuitMessage,将一个WM_QUIT

消息放入消息队列中,以此来响应此消息,这个消息导致WinMain中的消息循环终止,循环结束。*/

 

//消息分为进队消息和不进队消息,从上面可以看出,在窗口没有创建以前,WM_CREATEWM_PAINT

//都是不进队列的,直接由windows发送,不管我们的事

 

发布了33 篇原创文章 · 获赞 19 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章