关于GetSafeHwnd()与内联函数

偶尔想到在MFC源码中查询一下GetSafeHwnd()函数,然而在wincore.cpp中确找不到他,光看见调用了。

于是将程序Debug了一下,单步调试进入GetSafeHwnd()函数,发现这是一个内联函数。

这个函数的头文件存在"afxwin.h",声明如下:"operator HWND() const; HWND GetSafeHwnd() const;“。源码存在"afxwin2.inl”,定义如下:"_AFXWIN_INLINE CWnd::operator HWND() const { return this == NULL ? NULL : m_hWnd; }"

但是很郁闷为什么Debug时自动跳转到了操作符HWND()的函数,回去补下C++。。。

#ifndef _CD2DC_H_ #define _CD2DC_H_ #define _CRT_SECURE_NO_WARNINGS #define NO_WARN_MBCS_MFC_DEPRECATION #include <SDKDDKVer.h> #include <afxwin.h> #include <d2d1.h> #include <dwrite.h> #include <wincodec.h> namespace MFCEx { /** * @class CD2DC * @brief 封装Direct2D渲染功能的类,用于在MFC应用中实现硬件加速的2D图形渲染 */ class CD2DC { public: CD2DC(); ~CD2DC(); /** * @brief 初始化Direct2D资源 * @param _pWnd [in] 关联的MFC窗口指针 * @param _iWidth [in] 渲染区域的宽度(像素) * @param _iHeight [in] 渲染区域的高度(像素) * @return BOOL 初始化成功返回TRUE,失败返回FALSE */ BOOL Initialize(CWnd* _pWnd, const size_t _iWidth, const size_t _iHeight); /** * @brief 调整渲染区域大小 * @param _iWidth [in] 新的渲染区域宽度(像素) * @param _iHeight [in] 新的渲染区域高度(像素) * @return BOOL 调整成功返回TRUE,失败返回FALSE */ BOOL Resize(const size_t _iWidth, const size_t _iHeight); /** * @brief 开始绘制操作(必须在绘制前调用) */ void BeginDraw(); /** * @brief 结束绘制操作(必须在绘制后调用) */ void EndDraw(); private: /** * @brief 创建Direct2D渲染目标 * @return BOOL 创建成功返回TRUE,失败返回FALSE */ BOOL CreateRenderTarget(); private: CWnd* m_pWnd = nullptr; ///< 关联的MFC窗口指针 size_t m_iWidth = 0; ///< 渲染区域的宽度(像素) size_t m_iHeight = 0; ///< 渲染区域的高度(像素) ID2D1Factory* m_pFactory = nullptr; ///< Direct2D工厂接口 ID2D1HwndRenderTarget* m_pTarget = nullptr; ///< 窗口渲染目标接口 IDWriteFactory* m_pWriteFactory = nullptr; ///< DirectWrite文本工厂接口 bool m_bInitialized = false; ///< 初始化状态标志 }; } #endif // !_CD2DC_H_ #include "CD2DC.h" #pragma comment(lib, "d2d1.lib") #pragma comment(lib, "dwrite.lib") /** * @brief 构造函数(初始化成员变量) */ MFCEx::CD2DC::CD2DC() { } /** * @brief 析构函数(释放所有Direct2D资源) */ MFCEx::CD2DC::~CD2DC() { if (m_pTarget) { m_pTarget->Release(); m_pTarget = nullptr; } if (m_pFactory) { m_pFactory->Release(); m_pFactory = nullptr; } if (m_pWriteFactory) { m_pWriteFactory->Release(); m_pWriteFactory = nullptr; } } /** * @brief 初始化Direct2D资源 * @param _pWnd [in] 关联的MFC窗口指针 * @param _iWidth [in] 渲染区域的宽度(像素) * @param _iHeight [in] 渲染区域的高度(像素) * @return BOOL 初始化成功返回TRUE,失败返回FALSE */ BOOL MFCEx::CD2DC::Initialize(CWnd* _pWnd, const size_t _iWidth, const size_t _iHeight) { // 验证窗口句柄有效性 if (!_pWnd || !_pWnd->GetSafeHwnd()) return FALSE; // 创建Direct2D工厂 HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pFactory); if (FAILED(hr)) return FALSE; // 创建DirectWrite工厂 hr = DWriteCreateFactory( DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), reinterpret_cast<IUnknown**>(&m_pWriteFactory) ); if (FAILED(hr)) return FALSE; // 设置成员变量 m_pWnd = _pWnd; m_iWidth = _iWidth; m_iHeight = _iHeight; // 创建渲染目标 return (m_bInitialized = CreateRenderTarget()); } /** * @brief 调整渲染区域大小 * @param _iWidth [in] 新的渲染区域宽度(像素) * @param _iHeight [in] 新的渲染区域高度(像素) * @return BOOL 调整成功返回TRUE,失败返回FALSE */ BOOL MFCEx::CD2DC::Resize(const size_t _iWidth, const size_t _iHeight) { // 验证渲染目标有效性 if (!m_pTarget) return FALSE; // 更新尺寸并调整渲染目标 m_iWidth = _iWidth; m_iHeight = _iHeight; D2D1_SIZE_U size = D2D1::SizeU(m_iWidth, m_iHeight); HRESULT hr = m_pTarget->Resize(size); return SUCCEEDED(hr); } /** * @brief 开始绘制操作(必须在绘制前调用) */ void MFCEx::CD2DC::BeginDraw() { if (m_pTarget) m_pTarget->BeginDraw(); } /** * @brief 结束绘制操作(必须在绘制后调用) */ void MFCEx::CD2DC::EndDraw() { if (m_pTarget) m_pTarget->EndDraw(); } /** * @brief 创建Direct2D渲染目标 * @return BOOL 创建成功返回TRUE,失败返回FALSE */ BOOL MFCEx::CD2DC::CreateRenderTarget() { // 验证工厂和窗口有效性 if (!m_pFactory || !m_pWnd) return FALSE; // 创建窗口渲染目标 D2D1_SIZE_U size = D2D1::SizeU(m_iWidth, m_iHeight); HRESULT hr = m_pFactory->CreateHwndRenderTarget( D2D1::RenderTargetProperties(), D2D1::HwndRenderTargetProperties( m_pWnd->GetSafeHwnd(), size, D2D1_PRESENT_OPTIONS_IMMEDIATELY ), &m_pTarget ); return SUCCEEDED(hr); }
最新发布
08-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值