soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SDpiHelper.hpp
1#ifndef __DPIHELPER_H_
2#define __DPIHELPER_H_
3
4#include <windows.h>
5#include <helper/SDpiScale.h>
6#include <wtl.mini/msgcrack.h>
7#include <wtl.mini/souimisc.h>
8#include <sdef.h>
9
10SNSBEGIN
11
12/**
13 * @class SDpiHandler
14 * @brief 处理DPI变化的模板类
15 * @tparam T 派生类类型
16 */
17template <class T>
19 protected:
20 /**
21 * @brief 检查是否支持DPI感知
22 * @return 支持DPI感知返回TRUE,否则返回FALSE
23 */
24 virtual bool IsDpiAware() const
25 {
26 return true;
27 }
28
29 /**
30 * @brief 处理DPI变化事件
31 * @param dpi 新的DPI值
32 * @param desRect 目标矩形区域
33 */
34 void OnDpiChanged(WORD dpi, const RECT *desRect)
35 {
36 if (!IsDpiAware())
37 return;
38 int nScale = dpi * 100 / 96;
39 nScale = SDpiScale::NormalizeScale(nScale);
40 HandleScaleChange(nScale, desRect);
41 }
42
43 /**
44 * @brief 处理缩放变化
45 * @param nScale 新的缩放比例
46 * @param desRect 目标矩形区域
47 */
48 virtual void HandleScaleChange(WORD nScale, const RECT *desRect)
49 {
50 T *pT = static_cast<T *>(this);
51 if (nScale != pT->GetRoot()->GetScale()) // As ShostWnd::GetScale is under protect, here, we using SWindow::GetScale.
52 {
53 pT->SetScale(nScale, desRect);
54 }
55 }
56
57 /**
58 * @brief 根据DPI缩放窗口
59 * @param hWnd 窗口句柄
60 */
61 void ScaleHost(HWND hWnd)
62 {
63 int nScale = GetWindowScale(hWnd);
64 if (!IsDpiAware())
65 nScale = 100;
66 nScale = SDpiScale::NormalizeScale(nScale);
67 CRect rc;
68 ::GetWindowRect(hWnd, (RECT *)&rc);
69 CSize sz = rc.Size();
70 sz.cx = sz.cx * nScale / 100;
71 sz.cy = sz.cy * nScale / 100;
72 CPoint ntl = rc.CenterPoint();
73 ntl.Offset((-sz.cx + rc.Size().cx) / 2, (-sz.cy + rc.Size().cy) / 2);
74 rc = CRect(ntl, sz);
75 HandleScaleChange(nScale, &rc);
76 }
77
78 public:
79 /**
80 * @brief 处理窗口消息
81 * @param hWnd 窗口句柄
82 * @param uMsg 消息ID
83 * @param wParam 附加参数1
84 * @param lParam 附加参数2
85 * @param lResult 消息处理结果
86 * @param dwMsgMapID 消息映射ID
87 * @return 消息是否被处理
88 */
89 BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult, DWORD dwMsgMapID = 0)
90 {
91 switch (dwMsgMapID)
92 {
93 case 0:
94 if (uMsg == WM_INITDIALOG)
95 {
96 ScaleHost(hWnd);
97 lResult = 0;
98 return TRUE;
99 }
100 if (uMsg == WM_DPICHANGED)
101 {
102 OnDpiChanged((WORD)HIWORD(wParam), (RECT *const)lParam);
103 lResult = 0;
104 return TRUE;
105 }
106 break;
107 }
108 return FALSE;
109 }
110};
111
112SNSEND
113
114#endif //__DPIHELPER_H_
处理DPI变化的模板类
virtual bool IsDpiAware() const
检查是否支持DPI感知
void OnDpiChanged(WORD dpi, const RECT *desRect)
处理DPI变化事件
void ScaleHost(HWND hWnd)
根据DPI缩放窗口
virtual void HandleScaleChange(WORD nScale, const RECT *desRect)
处理缩放变化
BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult, DWORD dwMsgMapID=0)
处理窗口消息
static int NormalizeScale(int nScale)
标准化放大比例
Definition SDpiScale.cpp:18