Directx11学习笔记【二】 将HelloWin封装成类

我们把上一个教程的代码封装到一个类中来方便以后的使用。

首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面

 

MyWindow.h文件

 1 /************************************************************************
 2 Directx11学习笔记【2】 将HelloWin封装成类
 3 2016.01 by zhangbaochong
 4 /************************************************************************/
 5 #pragma once
 6 #include <windows.h>
 7 
 8 static bool isPushEsc = false;//是否按下Esc键
 9 
10 class MyWindow
11 {
12 public:
13     MyWindow();
14     ~MyWindow();
15 public:
16     HWND GetHandle();//返回窗口句柄
17     bool Create(int &width, int &height);//创建窗口
18     void Run();//处理消息循环
19     LRESULT CALLBACK MessageHandler(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);//消息处理
20 private:
21     HWND m_hwnd;
22     HINSTANCE m_hinstance;
23     LPCWSTR m_name;
24 };

 

MyWindow.cpp

因为定义窗口的时候必须指定一个回调函数,所以我们定义一个静态的WndProc,因为在WndProc中需要调用其他消息的处理函数MessageHandler,所以我们又定义一个类的实例句柄applicationHandle。

  1 /************************************************************************
  2 Directx11学习笔记【2】 将HelloWin封装成类
  3 2016.01 by zhangbaochong                                                
  4 /************************************************************************/
  5 
  6 #include "MyWindow.h"
  7 
  8 static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);//静态回调函数
  9 static MyWindow *applicationHandle;//类的一个静态实例
 10 
 11 MyWindow::MyWindow()
 12 {
 13     isPushEsc = false;
 14     m_hwnd = NULL;
 15     m_name = L"HelloWin";
 16 }
 17 
 18 
 19 MyWindow::~MyWindow()
 20 {
 21 }
 22 
 23 
 24 HWND MyWindow::GetHandle()
 25 {
 26     return m_hwnd;
 27 }
 28 
 29 bool MyWindow::Create(int &width, int &height)
 30 {
 31     WNDCLASSEX wnd;
 32     applicationHandle = this;
 33     m_hinstance = GetModuleHandle(NULL);
 34     wnd.cbClsExtra = 0;
 35     wnd.cbSize = sizeof(WNDCLASSEX);
 36     wnd.cbWndExtra = 0;
 37     wnd.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
 38     wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
 39     wnd.hIcon = LoadIcon(NULL, IDI_WINLOGO);
 40     wnd.hIconSm = wnd.hIcon;
 41     wnd.hInstance = m_hinstance;
 42     wnd.lpfnWndProc = WndProc;
 43     wnd.lpszClassName = m_name;
 44     wnd.lpszMenuName = m_name;
 45     wnd.style = CS_VREDRAW | CS_HREDRAW;
 46 
 47     //注册窗口
 48     if ( !RegisterClassEx(&wnd) )
 49     {
 50         MessageBox(NULL, L"注册窗口失败", L"error", 0);
 51         return false;
 52     }
 53     m_hwnd = CreateWindowEx(WS_EX_APPWINDOW, m_name, m_name, WS_OVERLAPPEDWINDOW, 0, 0, width, height,
 54         NULL, NULL, m_hinstance, NULL);
 55     //显示窗口设置其为焦点
 56     ShowWindow(m_hwnd, SW_SHOW);
 57     UpdateWindow(m_hwnd);
 58     return true;
 59 }
 60 
 61 static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
 62 {
 63     switch (message)
 64     {
 65     case WM_DESTROY:
 66         PostQuitMessage(0);
 67         return 0;
 68         //其他消息发送MessageHandler处理
 69     default:
 70         return applicationHandle->MessageHandler(hwnd, message, wparam, lparam);
 71     }
 72 }
 73 
 74 LRESULT CALLBACK MyWindow::MessageHandler(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
 75 {
 76     switch (message)
 77     {
 78         //检测按键消息
 79     case WM_KEYDOWN:
 80         if (wparam == VK_ESCAPE)//用户按下退出键
 81             isPushEsc = true;
 82         return 0;
 83 
 84         //其他消息发送windows缺省处理
 85     default:
 86         return DefWindowProc(hwnd, message, wparam, lparam);
 87     }
 88 }
 89 
 90 void MyWindow::Run()
 91 {
 92     MSG msg;
 93     ZeroMemory(&msg, sizeof(MSG));
 94     bool isRuning = true;//控制是否退出消息循环
 95     while (isRuning)
 96     {
 97         //处理windows消息
 98         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
 99         {
100             TranslateMessage(&msg);
101             DispatchMessage(&msg);
102         }
103         if (msg.message == WM_QUIT)
104         {
105             isRuning = false;
106         }            
107         else//按下esc键也退出
108         {
109             isRuning = !isPushEsc;
110 
111             //渲染等处理可以放在这儿
112         }
113 
114     }
115 }

 

main.cpp

 1 /************************************************************************
 2 Directx11学习笔记【2】 将HelloWin封装成类
 3 2016.01 by zhangbaochong
 4 /************************************************************************/
 5 #include "MyWindow.h"
 6 
 7 int WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
 8 {
 9     int width = 800, height = 600;
10     MyWindow *window = new MyWindow;
11     if (window->Create(width, height))
12     {
13         window->Run();
14     }
15     return 0;
16 }

 

运行结果和上次一样:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Badboy自动化测试工具11 导出脚本用于Jmeter并发测试

本节主要讲解利用Jmeter进行并发测试和引入图像报表 1. 在Jmeter中打开上节课&#xff08;10&#xff09;Badboy导出的在拉手网查询KTV的脚本Lashou_Search.jmx. 2. 右击Lashou节点&#xff0c;Add->Listener->Aggregate Graph & Graph Results 3. 对图像报表进行配置…

ArcGIS实验教程——实验三十九:ArcGIS多元分类(ISO聚类分析、最大似然分类、主成分分析)案例教程

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据)》 文章目录 一、ISO聚类1. ISO聚类简介2. ISO聚类进行非监督分类实验操作二、最大似然分类1. 最大似然简介2. 最大似然分类实验案例三、主成分分析1. 主成分分析简介2. 主成分分析实验案例四、配套实…

ABP Framework 5.3.0 版本新增功能和变更说明

ABP Framework 5.3.0 稳定版已在2022年6月14日正式发布。以下是本版本的新增功能&#xff1a;• “开始”页面提供创建单层项目选项• 启动模板提供 PWA 支持• Volo.Abp.Gdpr.Abstractions 包介绍• 将发件箱中的事件批量发布到事件总线• eShopOnAbp 项目改进和电子书公告• …

智能合约开发——TypeScript 基础(全)

TS 准备 首先我们准备一个目录&#xff0c;使用 dos 进入到某目录&#xff0c;当然你直接 vs 打开终端执行也是没有问题的&#xff1a; 执行以下命令安装 typescrip&#xff08;不用进入目录&#xff0c;直接安装即可&#xff09;&#xff1a; npm install -g typescript我是…

利用Signalr实现手机端App扫码登录web页面

实现原理&#xff1a; 1、web登录页面&#xff0c;利用jquery.qrcode展示一个随机生成的登录码的二维码&#xff1b; 2、手机App扫描二维码取得登录码&#xff1b; 3、手机App将本地用户id登录码通过api提交服务器&#xff1b; 4、服务器api&#xff0c;收到手机App请求&am…

【ArcGIS风暴】ArcGIS栅格影像(NDVI)归一化处理的两种方法精解

【ArcGIS遇上Python】ArcGIS批量处理栅格影像(NDVI)归一化完整案例代码 图像归一化是指对图像进行了一系列标准的处理变换,使之变换为一固定标准形式的过程,该标准图像称作归一化图像。 原始图像在经历一些处理或攻击后可以得到多种副本图像,这些图像在经过相同参数的图像…

以小见大:一个领域建模的简单示例,理解“领域驱动”。

背景&#xff1a;航空公司为了确保飞行路线不发生冲突&#xff0c;需要开发一款飞行路线管理软件。过程&#xff1a;我们先去找这个领域的专家&#xff0c;自然是作为平时管理和维护机场飞行秩序的工作人员&#xff1b;我们第一个目标就是与他们沟通&#xff0c;也许我们并不能…

【ArcGIS遇上Python】ArcGIS批量处理栅格影像(NDVI)归一化完整案例代码

文章《ArcGIS栅格影像(NDVI)归一化处理的两种方法精解》详细介绍了ArcGIS中进行NDVI影像归一化处理的两种方法,但是无法批量进行,本文就放大招用Python实现批量NDVI归一化处理,大大提高了工作效率,还不赶快Get了? 完整Python代码: import arcpy from arcpy import env…

Spark1.0.0 属性配置

1&#xff1a;Spark1.0.0属性配置方式Spark属性提供了大部分应用程序的控制项&#xff0c;而且能够单独为每一个应用程序进行配置。在Spark1.0.0提供了3种方式的属性配置&#xff1a;SparkConf方式 SparkConf方式能够直接将属性值传递到SparkContext&#xff1b;SparkConf能够对…

Lync Server 2010迁移至Lync Server 2013部署系列 Part1: 扩展AD架构

由于最近直在忙Lync 升级&#xff0c;好久没有更新博客了&#xff0c;今天开始将对最近做的Lync Server 2010迁移至Lync Server 2013项目做一个系列的部署操作更新&#xff0c;希望能给即将在企业中部署的兄弟们有所帮助&#xff0c;在这个测试环境中&#xff0c;企业 前端池共…

Hello Playwright:(7)模拟键盘和鼠标

尽管在上一节中&#xff0c;我们已经能够通过FillAsync或ClickAsync来实现输入和点击元素。但是&#xff0c;还有其他场景&#xff0c;我们必须模拟用户使用键盘、鼠标与页面交互。例如在线文档&#xff1a;Page.Keyboard 对象Keyboard提供用于管理虚拟键盘的 API&#xff0c;它…

【ArcGIS遇上Python】Python批量将多个文件夹下的多个影像数据镶嵌至新栅格

ArcGIS虽然可以实现一次多个影像同时参与,拼接成一个整的影像,但是通常情况下,多个影像并不在同一个文件夹下,这样拼接的时候需要逐个手动进行添加,如果数据量大的话,跟不就不可取,针对这一问题,本文采用Python,实现将多个文件夹下的多个影像拼接,高效快速。 我们以…

2019全球开发者调查:仅2%的人996,Python并不是最受喜爱的语言

导读&#xff1a;开发者社区正在发生哪些变化&#xff1f;Stack Overflow 的最新调查获得了一些预料之外的结果&#xff1a;Java 语言开发者的平均收入不到 35 万元人民币&#xff0c;成为了收入最低的群体&#xff1b;另一方面&#xff0c;人工智能领域流行的 Python 并不是最…

一般地

2019独角兽企业重金招聘Python工程师标准>>> 1.EO的Updatable属性默认为Always&#xff0c;基于EO创建的VO也是。而基于SQL创建VO的Updatable属性默认为Never&#xff0c;如果要修改&#xff08;例如将VO拖至页面生成Form用于新增&#xff09;&#xff0c;则需将该属…

最新!2019 年中国程序员薪资生存调查报告出炉

此调查&#xff0c;是对北京、上海、广东和浙江等全国 29 个省、直辖市及特别行政区的 26W 优秀程序员进行了一次详细的调查&#xff0c;形成本报告。 根据中国互联网络信息中心&#xff08;CNNIC&#xff09;近日发布第 43 次《中国互联网络发展状况统计报告》。截至 2018 年 …

快速掌握 ASP.NET 身份认证框架 Identity - 登录与登出

推荐关注「码侠江湖」加星标&#xff0c;时刻不忘江湖事这是 ASP.NET Core Identity 系列的第三篇文章&#xff0c;上一篇文章讲解了如何在 ASP.NET Core Identity 中实现用户注册。那么&#xff0c;这篇文章讲一讲如何在 ASP.NET Core Identity 中实现用户的登录与登出。点击上…

C语言试题七十九之请编写函数实现自然底数 e=2.718281828

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写函数…

如何创建NFT并OpenSea上展示《alchemy How to Develop an NFT Smart Contract》译

翻译&#xff1a;1_bit 原文&#xff1a;https://docs.alchemy.com/docs/how-to-develop-an-nft-smart-contract-erc721-with-alchemy 注&#xff1a;英文不好各位多多担待 1.如何使用 Alchemy 开发一个 NFT 智能合约 在你第一次使用 solidity 时开发一个智能合约部署在区块…

Jmeter之Bean shell使用(二)

上一篇Jmeter之Bean shell使用(一)简单介绍了下Jmeter中的Bean shell&#xff0c;本文是对上文的一个补充&#xff0c;主要总结下常用的几种场景和方法&#xff0c;相信这些基本可以涵盖大部分的需求。本节内容如下&#xff1a; 一、操作变量 二、操作属性 三、自定义函数 四、…

【ArcGIS风暴】ArcGIS中国地表覆盖数据GlobeLand30预处理(批量投影、拼接、掩膜提取)附成品下载

结果示意图&#xff1a; GlobeLand30是30米空间分辨率全球地表覆盖数据&#xff0c;目前可供下载的有3年的数据&#xff1a;2000-2010-2020。本文主要讲解在ArcGIS10.6平台下进行GlobeLand30的预处理操作&#xff0c;主要预处理步骤包括&#xff1a;批量分幅投影转换、批量分幅…