底层窗口实现

  1 #include <windows.h>
  2 
  3 //处理窗口过程
  4 LRESULT CALLBACK WindowProc(
  5     HWND hwnd,            //消息所属的窗口句柄
  6     UINT uMsg,            //具体的消息名称 WM_XXX消息名 (WindowMessage)
  7     WPARAM wParam,        //键盘附加消息
  8     LPARAM lParam        //鼠标附加消息
  9     )
 10 {
 11     switch (uMsg){
 12     case WM_CLOSE:
 13         //所有xxxWindow为结尾的方法,都不会进入到消息队列中 而是直接执行
 14         DestroyWindow(hwnd);    //DestroyWindow发送另一个消息 WM_DESTROY
 15         break;
 16 
 17     case WM_DESTROY:
 18         PostQuitMessage(0);
 19         break;
 20 
 21     case WM_LBUTTONDOWN:        //鼠标左键按下
 22     {
 23         int xPos = LOWORD(lParam);
 24         int yPos = HIWORD(lParam);
 25         char buf[1024];
 26         wsprintf(buf, TEXT("x = %d, y = %d"), xPos, yPos);
 27         MessageBox(hwnd, buf, TEXT("标题"), MB_OK);
 28         break;
 29     }
 30 
 31     case WM_KEYDOWN:            //键盘
 32         MessageBox(hwnd, TEXT("键盘按下"), TEXT("标题"), MB_OK);
 33         break;
 34 
 35     case WM_PAINT:                //绘图
 36     {
 37         PAINTSTRUCT ps;        //绘图结构体
 38         HDC hdc = BeginPaint(hwnd, &ps);
 39 
 40         TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELLO"));
 41 
 42         EndPaint(hwnd, &ps);
 43         break;
 44     }
 45 
 46     }
 47 
 48     //返回值用默认处理方式
 49     return DefWindowProc(hwnd, uMsg, wParam, lParam);
 50 }
 51 
 52 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE PreInstance, LPSTR lpCmdLine, int nShowCmd){
 53     //设计窗口
 54     //注册窗口
 55     //创建窗口
 56     //显示和更新
 57     //通过循环取消息
 58     //处理消息(窗口过程)
 59     
 60     
 61     //设计窗口
 62     WNDCLASS wc;
 63     wc.cbClsExtra = 0;   //类的额外的内存
 64     wc.cbWndExtra = 0;    //    窗口额外的内存
 65     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    //设置背景
 66     wc.hCursor = LoadCursor(NULL, IDC_HAND);    //设置光标, 如果第一个参数为NULL,代表使用系统提供的光标
 67     wc.hIcon = LoadIcon(NULL, IDI_ERROR);//图标  如果第一个参数为NULL,代表使用系统提供的图标
 68     wc.hInstance = hInstance;//应用程序的实例句柄 传入WinMain中的形参即可
 69     wc.lpfnWndProc = WindowProc;//回调函数 窗口过程
 70     wc.lpszClassName = TEXT("WIN");//指定窗口的类名称
 71     wc.lpszMenuName = NULL; //菜单名称
 72     wc.style = 0; //显示的风格 0代表默认风格
 73 
 74 
 75 
 76     //注册窗口类
 77     RegisterClass(&wc);
 78 
 79 
 80 
 81     //创建窗口
 82     /*
 83     lpClassName,  类名
 84     lpWindowName, 标题名
 85     dwStyle,      一般用WS_OVERLAPPDWINDOW风格
 86     x,              显示的坐标
 87     y,
 88     nWidth,          宽高
 89     nHeight,                    CW_USEDEFAULT默认值
 90     hWndParent,   父窗口 null
 91     hMenu,          菜单 null
 92     hInstance,    实例句柄 hInstance
 93     lpParam       附加值 鼠标的附加值 NULL
 94     */
 95     HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
 96 
 97 
 98 
 99     //显示和更新
100     ShowWindow(hwnd, SW_SHOWNORMAL);
101     UpdateWindow(hwnd);
102 
103 
104 
105     //循环取消息
106     /*
107         HWND        hwnd;        主窗口句柄
108         UINT        message;    具体的消息名称
109         WPARAM      wParam;        附加消息 键盘消息
110         LPARAM      lParam;        附加消息 鼠标消息(左右键)
111         DWORD       time;        消息产生的时间
112         POINT       pt;            附加消息 鼠标消息(x y)
113     */
114     MSG msg;
115     while (1){
116         /*
117         _Out_ LPMSG lpMsg,            消息
118         _In_opt_ HWND hWnd,            捕获窗口 填NULL代表捕获所有的窗口
119         _In_ UINT wMsgFilterMin,    最小和最大的过滤消息 一般填0
120         _In_ UINT wMsgFilterMax);    填0代表捕获所有的消息
121         */
122         if (GetMessage(&msg, NULL, 0, 0) == FALSE){
123             break;
124         }
125 
126         //翻译消息
127         TranslateMessage(&msg);
128         //不为False 分发
129         DispatchMessage(&msg);
130     }
131 
132 
133 
134     //处理窗口过程
135 
136 
137 
138     return 0;
139 }

 

posted @ 2019-05-24 19:24  企鹅君  阅读(154)  评论(0)    收藏  举报