底层实现窗口

xiaoxiao2021-03-01  21

//底层实现窗口//代码全部抄自黑马程序员学习教程 //时间18-08-21 //基本操作,选中函数或者结构体名称,按F1在线搜索MSDN文档 #include<Windows.h>   //底层实现窗口 的头文件

//6.处理窗口过程 //CALLBACK 代表__stdcall 参数的传递顺序,从左往右依次入栈,并且在函数返回前清空堆栈 LRESULT CALLBACK WindowProc(     HWND   hwnd, //消息所属窗口句柄     UINT   uMsg, //具体消息名称 WM_XXXX 消息名称     WPARAM wParam, //键盘附件消息     LPARAM lParam)  //鼠标附加消息 {     //返回值为默认处理方式     switch (uMsg)     {     case WM_CLOSE:     {                      //注意:所有XXXWindows为结尾的方法,都不会进入消息队列,它直接执行。                          DestroyWindow(hwnd); //DestoryWindow 发送另一个消息 WM_DESTROY                          break;     }     case WM_DESTROY:     {                            PostQuitMessage(0); //真正退出进程                            break;     }     case WM_LBUTTONDOWN:     {                            int xPos = LOWORD(lParam);                            int yPos = HIWORD(lParam);                            char buf[1024];                            //字符串拼接函数wsprintf();                            wsprintf(buf,TEXT("x positon is %d,y postition is %d"), xPos, yPos);                            MessageBox(hwnd,buf, TEXT("鼠标左键按下"), MB_OK);                                                       break;     }     case WM_KEYDOWN:     {                        MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘按下"), MB_OK);                        break;     }     case WM_PAINT:     {                      PAINTSTRUCT ps;//绘图结构体                      HDC hdc = BeginPaint(hwnd, &ps);                      TextOut(hdc, 100, 100, TEXT("Hello!"), strlen("Hello"));                      EndPaint(hwnd,&ps);                      break;

    }

    }     return DefWindowProc(hwnd, uMsg, wParam, lParam); }

//程序入口函数 //WINAPI 代表__stdcall 参数的传递顺序,从左往右依次入栈,并且在函数返回前清空堆栈 int WINAPI WinMain(     HINSTANCE hInstance,    //h代表句柄,instance 实例     HINSTANCE hPrevInstance,  //上一个应用程序句柄,一般为null     LPSTR lpCmdLine,       //char *agv[]     int nShowCmd)      //显示命令:最大化、最小化、正常 {     //1.设计窗口     //2.注册窗口     //3.创建窗口     //4.显示和更新     //5.通过循环取消息     //6.处理消息(窗口过程)

    //1.设计窗口     WNDCLASS wc;     wc.cbClsExtra = 0;//类的额外内存     wc.cbWndExtra = 0;//窗口的额外内存     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景色     wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标     wc.hIcon = LoadIcon(NULL, IDI_ERROR);     wc.hInstance = hInstance; //应用程序实例句柄     wc.lpfnWndProc =  WindowProc;    //回调函数、窗口过程     wc.lpszClassName = TEXT("WIN"); //指定窗口类名称     wc.lpszMenuName = NULL; //菜单名称     wc.style = 0;//显示风格,0代表默认风格

    //2.注册窗口     RegisterClass(&wc);

    //3.创建窗口     /*     #define CreateWindowW(lpClassName, //类名     lpWindowName, //窗口名     dwStyle, //风格     x, //显示坐标,可以使用CW_USEDEFAULT     y,     nWidth, //宽高      nHeight,     hWndParent, //父窗口句柄NULL     hMenu, //菜单句柄NULL     hInstance, //实例句柄     lpParam) //附加值NULL     */     HWND hwnd=CreateWindow(wc.lpszClassName, TEXT("Windows"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance,NULL);

    //4.显示和更新窗口     ShowWindow(hwnd, SW_SHOWNORMAL);     UpdateWindow(hwnd);

    //5.通过循环取消息     MSG msg;     /*     typedef struct tagMSG {     HWND   hwnd;//窗口句柄     UINT   message;//具体的消息名称     WPARAM wParam;//键盘附加消息     LPARAM lParam;//鼠标附加消息,判断左右键     DWORD  time;//消息产生时间     POINT  pt;  //附加消息,鼠标位置     } MSG, *PMSG, *LPMSG;     */     while (TRUE)     {         /*         BOOL WINAPI GetMessage(           _Out_    LPMSG lpMsg, //MSG指针           _In_opt_ HWND  hWnd,  //捕获窗口,填NULL代表捕获所有窗口           _In_     UINT  wMsgFilterMin,  //最大最小过滤值,一般填0,填0代表捕获所有消息           _In_     UINT  wMsgFilterMax         );         */         if (GetMessage(&msg, NULL, 0, 0) == FALSE)         {             break;         }         //翻译消息         TranslateMessage(&msg);         //分发消息         DispatchMessage(&msg);                  }

    //6.处理窗口过程

    return 0; }

转载请注明原文地址: https://www.6miu.com/read-4050116.html

最新回复(0)