WinMain入口函数的编写及了解,学习MFC之前的必备技能。

本文是基于VS2008的Windows底层基础代码

  1. 帮助初学者了解windows应用程序及相应MFC基础架构
  2. 代码附带详细注释,方便大家复制运行;
  3. 程序实现三个功能:
    Ⅰ:按下键盘程序返回窗口表示收到;
    Ⅱ:在指定区域画图/写文本文字;
    Ⅲ:鼠标点击应用程序界面框显示对应的横纵坐标。
  4. 在系统学习MFC之前需要对底层有一定的初步了解;
  5. 在创建文件夹时需选择win32应用程序,不能选择MFC应用程序。
序号 底层窗口实现具体步骤
WinMain入口函数
创建窗口五步法
窗口过程处理函数
#include <windows.h>底层实现窗口的头文件
//6处理窗口过程 CALLBACK=WINAPI 代表参数的传递顺序(从右到左依次入栈,并在函数返回前,清空堆栈)
LRESULT CALLBACK WindowProc(
       HWND hwnd,//消息所属的窗口句柄(消息从哪个窗口出来的)
       UINT uMsg,//具体消息名称 ,一般为WM_XXXX
       WPARAM wParam,//键盘附加消息
       LPARAM lParam//鼠标附加消息
       )
{
 switch(uMsg)
 {
 case WM_CLOSE:
  DestroyWindow(hwnd);//发送另一个消息 WM_DESTROY,并不会彻底的结束程序
  break;
 case WM_DESTROY:
  PostQuitMessage(0);//会让下面的GetMassage为FALSE,整个进程结束
  break;
 case WM_LBUTTONDOWN://鼠标左键按下
  {
   int xPos = LOWORD(lParam);
   int yPos = HIWORD(lParam);
   char buf[1024];
   wsprintf(buf,TEXT("x = %d,y = %d"),xPos,yPos);//将字符串写入缓存区这个函数除了将内容格式化输出到第一个参数所提供的字符串缓冲区以外,其它功能与printf函数相同。
   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);//可以理解hdc就是一位画家
   TextOut(hdc,100,100,TEXT("HELLO"),strlen("HELLO"));//在坐标(100,100)的位置开始画图
   EndPaint(hwnd,&ps);//结束画图
   break;
  }
  //不括起来会出现错误,c和c+的区别
 }
 //返回值用默认处理方式
 return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
//程序入口函数
//WINAPI代表参数的传递顺序(从右到左依次入栈,并在函数返回前,清空堆栈)
int WINAPI WinMain( 
  HINSTANCE hInstance,  //h是句柄 应用程序实例句柄
  HINSTANCE hPrevInstance,  //上一个应用程序句柄,参数一半为NULL,不起作用
  LPSTR lpCmdLine, //char * argv[]
  int nShowCmd )//显示命令 最大化,最小化,正常
  {
 //1.设计窗口
  HWND  hwnd;
  MSG msg;
  WNDCLASS   wc;//窗口对象所属的类,WND是window的缩写
  wc.cbClsExtra = 0;//类的额外的内存
  wc.cbWndExtra = 0;//窗口额外的内存
  wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景,强制类型转换
  wc.hCursor = LoadCursor(NULL,IDC_HAND);  //设置光标,如果第一个参数为NULL,代表使用系统提供的光标
  wc.hIcon = LoadIcon(NULL,IDI_ERROR);   //设置图标,如果第一个参数为NULL,代表使用系统提供的图标
   wc.hInstance = hInstance;//应用程序实例句柄,传入winmain中的形参即可
  wc.lpfnWndProc = WindowProc; //指定回调函数(窗口过程)
  wc.lpszClassName = TEXT("WIN");//指定窗口类名称
  wc.lpszMenuName = NULL;//菜单名称
  wc.style = 0;//显示风格,0代表默认风格
 //2.注册窗口类
  RegisterClass(&wc);//把wc的地址给扔进去,告诉系统加入自定义的窗口
    //3.创建窗口
    hwnd = CreateWindow(wc.lpszClassName,TEXT("WINDOWS"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
   //1类名 2 窗口的名称 3 窗口风格 用混合风格 4/5 显示坐标 默认值 CW_USEDEFAULT 7/8宽高 9 父窗口,10菜单,11 实例句柄,12 附加值 ,返回一个窗口句柄
    //4.显示和更新
    ShowWindow(hwnd,SW_SHOWNORMAL);//正常显示 SW_SHOWNORMAL用的最多
  UpdateWindow(hwnd);//更新窗口
    //5.通过循环取消息 每一个消息都是一个结构体 
 /* HWND        hwnd; 主窗口句柄
  UINT        message; 具体的消息名称
  WPARAM      wParam;附加消息,键盘消息
  LPARAM      lParam;附加消息 鼠标消息
  DWORD       time;消息产生的时间
  POINT       pt; 附加消息 鼠标消息 x y
  */
  while (1)
  {
   /*   __out LPMSG lpMsg,带p的都是地址,封装好消息的地址
   __in_opt HWND hWnd,捕获窗口,填NULL代表捕获所有的窗口
   __in UINT wMsgFilterMin,最小和最大的过滤的消息,一般填0
   __in UINT wMsgFilterMax,代表捕获所有的消息
   */
    if (GetMessage(&msg, NULL, 0, 0) == FALSE)//点击×就推出程序
   {
    break;
   }
   //不为false则翻译消息 比如有组合键或者其他什么
         TranslateMessage(&msg);
   //分发消息
   DispatchMessage(&msg);
  }
  
  return 0 ; 
  }

猜你喜欢

转载自blog.csdn.net/qq_42308217/article/details/108185983
今日推荐