zoukankan      html  css  js  c++  java
  • 底层窗口实现

      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 }
  • 相关阅读:
    HDU 5583 Kingdom of Black and White 水题
    HDU 5578 Friendship of Frog 水题
    Codeforces Round #190 (Div. 2) E. Ciel the Commander 点分治
    hdu 5594 ZYB's Prime 最大流
    hdu 5593 ZYB's Tree 树形dp
    hdu 5592 ZYB's Game 树状数组
    hdu 5591 ZYB's Game 博弈论
    HDU 5590 ZYB's Biology 水题
    cdoj 1256 昊昊爱运动 预处理/前缀和
    cdoj 1255 斓少摘苹果 贪心
  • 原文地址:https://www.cnblogs.com/Kingpenguin/p/10919833.html
Copyright © 2011-2022 走看看