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.pswp.cn/news/285827.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285827.shtml
英文地址,請注明出處:http://en.pswp.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我是…

查看MySQL的當前日期

select current_date(); 查看MySQL的當前日期轉載于:https://www.cnblogs.com/dengyg200891/p/5972698.html

【ArcGIS風暴】ArcGIS支持的柵格數據格式大全及格式轉換案例精解

ArcGIS功能異常強大,支持多種常見的柵格數據格式,并可實現多個柵格格式的自由轉換。 在ArcGIS中,常見的柵格數據格式有:TIFF、BMP、ENVI、Esri BIL、Esri BIP、Esri BSQ、GIF、GRID、IMAGINE Image、JP2、JPG、和PNG。 BIL —Esri 波段按行交叉格式文件BIP —Esri 波段按像…

Android之靠譜的獲取本地相冊圖片

1、需要申請手機讀寫的權限 AndroidMani.xml里面配置權限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 我們一般采用RxPe…

利用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)歸一化完整案例代碼 圖像歸一化是指對圖像進行了一系列標準的處理變換,使之變換為一固定標準形式的過程,該標準圖像稱作歸一化圖像。 原始圖像在經歷一些處理或攻擊后可以得到多種副本圖像,這些圖像在經過相同參數的圖像…

[從C到C++] 1.3 C++布爾類型(bool)

布爾類型(bool)是C新增的一種基本數據類型。在標準的C語言中并未定義bool類型&#xff0c;如果需要使用bool類型&#xff0c;程序員可以通過宏定義來自定義一個bool類型&#xff0c;定義語句如下&#xff1a; #define bool int #define false 0 #define true 1 也就是將int型定…

以小見大:一個領域建模的簡單示例,理解“領域驅動”。

背景&#xff1a;航空公司為了確保飛行路線不發生沖突&#xff0c;需要開發一款飛行路線管理軟件。過程&#xff1a;我們先去找這個領域的專家&#xff0c;自然是作為平時管理和維護機場飛行秩序的工作人員&#xff1b;我們第一個目標就是與他們溝通&#xff0c;也許我們并不能…

hibernate -- hello world

http://developer.51cto.com/art/201202/315931_all.htm轉載于:https://www.cnblogs.com/iOS-mt/p/5973646.html

Android之底部Dialog里面放EditText點擊布局頂上去效果

1、需求 在底部Dialog里面放EditText點擊,布局需要頂上去,不頂上去很煩。 2、Dialog里面關鍵樣式屬性 <item name="android:windowFullscreen">false</item> 3、布局代碼簡單試下 樣式 <style name="DialogTheme" tools:ignore="…

SignalR ——Android實踐

SignalR 的版本&#xff1a;aspnetcore-2.2, Java SignalR-1.0.0 一、先說幾個點 1、我使用SignalR的時候服務器使用的是自簽名的HTTPS證書&#xff0c;所以OkHttp是無法直接解析的&#xff0c;會報錯。需要修改SignalR里面OkHttp部分的源碼&#xff0c;讓其信任所有的HTTPS連…

【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;企業 前端池共…

Android之BaseRecyclerViewAdpater(3.0.4版本)當頁面第二次滑到底部的時候沒有觸發OnLoadMoreListener監聽的onLoadMore函數

1 、問題 BaseRecyclerViewAdpater(3.0.4版本)當頁面第二次滑到底部的時候沒有觸發OnLoadMoreListener監聽的onLoadMore函數,也就是梅如下監聽的地方 adapter?.loadMoreModule?.setOnLoadMoreListener(object : OnLoadMoreListener {override fun onLoadMore() {Log.d(TAG,…

Hello Playwright:(7)模擬鍵盤和鼠標

盡管在上一節中&#xff0c;我們已經能夠通過FillAsync或ClickAsync來實現輸入和點擊元素。但是&#xff0c;還有其他場景&#xff0c;我們必須模擬用戶使用鍵盤、鼠標與頁面交互。例如在線文檔&#xff1a;Page.Keyboard 對象Keyboard提供用于管理虛擬鍵盤的 API&#xff0c;它…

精通Hibernate:通過Hibernate操縱對象

http://developer.51cto.com/art/201202/315954.htm轉載于:https://www.cnblogs.com/iOS-mt/p/5973683.html