• 底层窗口实现


      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 }
  • 相关阅读:
    测试工作——XML
    js call apply
    JavaScript 作用域和作用域链
    hybird app
    正则表达式
    浏览器渲染原理
    head 头标签(转发)
    参考资料地址
    unix 常用命令
    phantomjs 自动化测试
  • 原文地址:https://www.cnblogs.com/Kingpenguin/p/10919833.html
Copyright © 2020-2023  润新知