人亦已歌 发表于 2023-2-15 12:04:57

C语言CreateWindow()创建窗口及消息处理过程 纯PAI创建

分为四步:
一、定义窗口类
二、初始化窗口
三、创建窗口
四、处理消息


#include <windows.h>
HINSTANCE hinst;
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
      //主函数里创建窗口
      //定义窗口类
      WNDCLASSEX wcx;//窗口类变量
      HWND hwnd;//窗口句柄,创建窗口后得到
      MSG msg;//消息变量
      BOOL fGotMessage;//是否取到了消息
      hinst=hinstance;//保存实例句柄

      //初始化窗口类
      wcx.lpszClassName="MainWClass";//窗口名称
      wcx.cbSize=sizeof(wcx);//窗口大小
      wcx.style=CS_HREDRAW|CS_VREDRAW;//是否重画
      wcx.lpfnWndProc=MainWndProc;//窗口过程
      wcx.cbClsExtra=0;//不适用类内存
      wcx.cbWndExtra=0;//不适用窗口内存
      wcx.hInstance=hinstance;//实例句柄
      wcx.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口大图标
      wcx.hIconSm=(HICON)LoadImage(hinstance,//窗口小图标
                MAKEINTRESOURCE(5),//从5号资源取图片
                IMAGE_ICON,//图片类型
                GetSystemMetrics(SM_CXSMICON),//图片的宽为标准小图标的宽度
                GetSystemMetrics(SM_CYSMICON),//图片的高为标准小图标的高度
                LR_DEFAULTCOLOR//默认颜色
                );
      wcx.hCursor=LoadCursor(NULL, IDC_ARROW);//鼠标形状
      wcx.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景
      wcx.lpszMenuName=NULL;//窗口菜单


      //注册窗口类
      if(!RegisterClassEx(&wcx)){//如果注册失败则返回
                return 1;
      }


      //创建窗口
      hwnd=CreateWindow("MainWClass",
                "Hello",//窗口标题
                WS_OVERLAPPEDWINDOW,//窗口样式
                CW_USEDEFAULT,//窗口位置 x坐标
                CW_USEDEFAULT,//窗口位置 y坐标
                CW_USEDEFAULT,//宽度
                CW_USEDEFAULT,//高度
                (HWND)NULL,//父窗口句柄
                (HMENU)NULL,//窗口没有菜单,则使用窗口类的菜单,窗口类也没有菜单,所以最终没有菜单
                hinstance,//实例句柄--main函数的第一个参数
                (LPVOID)NULL);//创建窗口的初始数据

      if(!hwnd){//如果窗口创建失败
                return 1;
      }

      ShowWindow(hwnd,//显示窗口
                nCmdShow);//显示方式-main函数的最后一个参数
      UpdateWindow(hwnd);//立即显示

      //消息循环,去消息队列里取消息
      while(fGotMessage=GetMessage(&msg,(HWND)NULL,0,0)!=0){//取到了消息
                TranslateMessage(&msg);//翻译消息
                DispatchMessage(&msg);//转发消息--转发给窗口过程
      }

      return msg.wParam;//返回消息参数

}

LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
      //处理窗口消息
      switch(uMsg){//对窗口转发过来的消息进行处理
      case WM_DESTROY://关闭窗口时
      PostQuitMessage(0);//退出消息循环,自动结束窗口
      //ExitThread(0);//退出主线程
      return 0;
      default://其它消息交由windows处理,DefWindowProc是系统默认的窗口过程
                return DefWindowProc(hwnd,uMsg,wParam,lParam);

      }

};



小洲 发表于 2023-2-19 22:36:01

任重道远啊~~~~~

老王家小子 发表于 2023-2-20 21:45:45

好贴! 支持!

北仑色 发表于 2023-2-21 13:55:35

世上有些问题,有许多种解法!当然,今天看了你的贴子!让人感触很深!如果做为程序员来讲,当然讲求效率为先!不然还真的没有什么人可以成为杰出或是优秀的程序员了!

射月天狼 发表于 2023-2-22 06:01:08

写的很好,想成为一个好的程序员,需要努力努力再努力!!!

dbvdb 发表于 2023-2-23 03:11:43

虽然看不懂,但真的不错!!谢谢!!

MIKESUN 发表于 2023-2-25 02:27:14

^你好!我想问你一道题:试分别以顺序表和单链表作存储结构,各写一个实现线性表的就地(既使用尽可能少的附加空间)逆置的算法,在原表的存储空间内将线性表(a1,a2,.....an)逆置为(an,.....,a2,a1).

451230007 发表于 2023-2-26 02:38:52

大哥能帮忙吗   

leo731 发表于 2023-2-26 17:44:42

^做为一个刚入门程序的我都感触良多..向你表示120分的敬意

shixingq 发表于 2023-2-28 11:53:36

有同感
页: [1] 2 3 4
查看完整版本: C语言CreateWindow()创建窗口及消息处理过程 纯PAI创建