当前位置: 首页 > news >正文

Windows编程模型与API调用示例

Windows编程模型与API调用示例

 

Windows编程模型示意图:

  

 

 

打开VS2010,选择语言VC++,创建一个WIN32项目,例如叫DEMO。

 

打开DEMO.CPP文件,会看到VS已经帮我们写了几个函数(这几个函数其实是VS帮我们包了一层,原生函数后面会介绍):

 

注册窗体函数

ATOM                                   MyRegisterClass(HINSTANCEhInstance);

 

初始化

BOOL                                    InitInstance(HINSTANCE,int);

 

处理windows消息的函数

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

 

注册窗口

WNDCLASSEX wcex;
 
         wcex.cbSize = sizeof(WNDCLASSEX);
         wcex.style                           = CS_HREDRAW | CS_VREDRAW;窗口的风格
         wcex.lpfnWndProc  = WndProc;窗口消息处理函数的指针
         wcex.cbClsExtra                = 0;分配给窗口类结构之后的额外字节数
         wcex.cbWndExtra             = 0;分配给窗口实例之后的额外字节数
         wcex.hInstance                 = hInstance;窗口所对应的应用程序句柄
         wcex.hIcon                         =LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CGAMEDEMO));窗口的坐标
         wcex.hCursor           = LoadCursor(NULL, IDC_ARROW);窗口的鼠标
         wcex.hbrBackground       = CreateSolidBrush(RGB(100,0,0)); 窗口的背景(这里调用了CreateSolidBrush API函数)
         wcex.lpszMenuName      = NULL,//MAKEINTRESOURCE(IDC_CGAMEDEMO);窗口的菜单资源名称
         wcex.lpszClassName       = szWindowClass;窗口类的名称
         wcex.hIconSm          = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
         return RegisterClassEx(&wcex);注册窗口


 

创建窗口

hWnd =CreateWindow(
           szWindowClass,创建窗口所用的窗口类的名称
          NULL,// szTitle, 窗口标题
          WS_OVERLAPPEDWINDOW,窗口风格,定义为普通型
      0,窗口位置的X坐标
          0,窗口位置的Y坐标
          1000,窗口的宽度
          1000, 窗口的高度
          NULL,父窗口句柄
          NULL, 菜单句柄
          hInstance,应用程序句柄
          NULL);一般为NULL


 

显示窗口

if (!hWnd)
   {
      return FALSE;
   }
   告诉系统显示窗口
   ShowWindow(hWnd, nCmdShow);
 
   立即显示窗口
   UpdateWindow(hWnd);
 


消息循环

 

         // 主消息循环:
         while (GetMessage(&msg, NULL, 0,0))
         {
                   if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
                   {
                            TranslateMessage(&msg);
                            DispatchMessage(&msg);
                   }
         }
 


消息处理函数以及API调用

 

/*

为了演示鼠标事件,在这里放了几个变量,存鼠标的坐标

*/

int a ,b;
char ac[25];
char bc[25];
char ret[50];
 
HWND hWnd,窗口句柄
UINT message,主消息
WPARAM wParam,副消息1(例如,如果主消息是键盘消息,这里存键值)
LPARAM lParam副消息2
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam)
{
         intwmId, wmEvent;
         PAINTSTRUCTps;
         HDC hdc;
 
         switch(message)
         {
        
        case WM_KEYDOWN:键盘消息
                   switch(wParam){从副消息中拿出键盘值
         caseVK_SPACE:
                   MessageBox(hWnd,_T("按下了空格键"),_T("test"),MB_OK);
                   break;
                   }
                   break;
 
         右键按下
         caseWM_RBUTTONDOWN:
                  
                   a= LOWORD(lParam);从副消息里面拿鼠标点击的X坐标
                   b= HIWORD(lParam);拿Y坐标
                   itoa(a,ac,10);
             itoa(b,bc,10);
 
                   strcat(ret,ac);
                   strcat(ret,",");
                   strcat(ret,bc);
 
                   MessageBoxA(hWnd,ret,"test",MB_OK);
                   strcpy(ret,"");
 
                   break;
         左键按下
         caseWM_LBUTTONDOWN:
 
                  
                   MessageBoxA(hwnd,
“按下了左键","test",MB_YESNO|MB_HELP|MB_ICONERROR);
                   break;
 
 
         caseWM_COMMAND:菜单消息(因为用的VS,所以创建项目时候IDE给带了这个)
                   wmId    = LOWORD(wParam);
                   wmEvent= HIWORD(wParam);
                   //分析菜单选择:
                   switch(wmId)
                   {
                   caseIDM_ABOUT:
                            DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                            break;
                   caseIDM_EXIT:
                            DestroyWindow(hWnd);
                            break;
                   default:
                            returnDefWindowProc(hWnd, message, wParam, lParam);
                   }
                   break;
         caseWM_PAINT:
                   hdc= BeginPaint(hWnd, &ps);
                   //TODO: 在此添加任意绘图代码...
                   EndPaint(hWnd,&ps);
                   break;
         caseWM_DESTROY:窗体销毁
                   PostQuitMessage(0);
                   break;
         default:
                   returnDefWindowProc(hWnd, message, wParam, lParam);
         }
         return0;
}


相关文章:

  • UltraWebGrid禁止编辑单元格
  • winApi一日一练之 SetTextColor (和Textout)函数
  • 网页自动满屏
  • winApi一日一练之 CreateSolidBrush(和FillRect)
  • 非常抱歉,非常感谢——反省与感恩——企业文化不可缺少的两大内核
  • DOTA 快捷键助手
  • locale问题
  • C#网络爬虫与搜索引擎调研
  • Flex与.NET互操作(七):了解FluorineFx的环境配置(远程对象、网关、通道、目的地)...
  • 摘自《卓有成效的程序员》
  • vbscript脚本1-读取xml格式的配置文件
  • vbscript脚本2-实现include的办法
  • C# xml反序列化
  • C# 获得本地IP地址
  • [ListView.View=List]的垂直滚动条
  • @jsonView过滤属性
  • 【EOS】Cleos基础
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 5、React组件事件详解
  • axios 和 cookie 的那些事
  • Brief introduction of how to 'Call, Apply and Bind'
  • ES2017异步函数现已正式可用
  • FineReport中如何实现自动滚屏效果
  • HTML5新特性总结
  • JavaScript DOM 10 - 滚动
  • JS函数式编程 数组部分风格 ES6版
  • Python连接Oracle
  • Python爬虫--- 1.3 BS4库的解析器
  • select2 取值 遍历 设置默认值
  • vue 配置sass、scss全局变量
  • vue自定义指令实现v-tap插件
  • 机器学习 vs. 深度学习
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 技术:超级实用的电脑小技巧
  • 将回调地狱按在地上摩擦的Promise
  • 精彩代码 vue.js
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $.each()与$(selector).each()
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (第一天)包装对象、作用域、创建对象
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (一)VirtualBox安装增强功能
  • .gitignore文件设置了忽略但不生效
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 命令行参数包含应用程序路径吗?
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .netcore如何运行环境安装到Linux服务器
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • @GlobalLock注解作用与原理解析