如何获取PropertySheet当前页PROPSHEETPAGE及标题以自定义标题区绘制?
自定义PropertySheet标题区绘制:获取相关结构体与内容的方法
核心实现步骤
要在WM_PAINT中自定义绘制PropertySheet标题区,关键是从属性表窗口及当前页面提取所需的结构体与内容,具体操作如下:
1. 获取属性表的PROPSHEETHEADER
可以通过窗口私有数据或系统宏直接获取:
// 方式1:从窗口私有数据提取 PROPSHEETHEADER* pPSH = reinterpret_cast<PROPSHEETHEADER*>(GetWindowLongPtr(hwndPropSheet, DWLP_USER)); // 方式2:使用系统宏(需包含prsht.h) PROPSHEETHEADER* pPSH = PropSheet_GetHeader(hwndPropSheet);
2. 获取当前激活页面的PROPSHEETPAGE
先拿到当前页面的窗口句柄,再从其私有数据中提取结构体:
HWND hwndCurrentPage = PropSheet_GetCurrentPageHwnd(hwndPropSheet); PROPSHEETPAGE* pPSP = reinterpret_cast<PROPSHEETPAGE*>(GetWindowLongPtr(hwndCurrentPage, DWLP_USER));
3. 提取标题、副标题与位图资源
- 标题/副标题:属性表主标题取
pPSH->pszCaption,当前页面标题取pPSP->pszTitle;副标题若为自定义内容,可提前存入pPSP->lParam中供后续读取。 - 位图:检查
pPSP->hbmHeader(页面标题区位图)或pPSH->hbmWatermark(属性表水印位图),拿到句柄后即可用BitBlt或StretchBlt完成绘制。
4. WM_PAINT中的绘制逻辑
在属性表窗口的WM_PAINT处理中:
- 用
BeginPaint获取DC,先填充自定义背景色覆盖标题区。 - 调用
DrawText绘制标题/副标题,通过SetTextColor设置自定义文字颜色。 - 若存在位图,计算好位置后绘制到位图区域;如果需要保留图标,用
GetSystemMetrics(SM_CXICON)/SM_CYICON获取图标尺寸来定位绘制边界。
注意事项
- 务必在属性表初始化时,将
PROPSHEETHEADER和PROPSHEETPAGE的指针存入对应窗口的私有数据,避免后续获取失败。 - 不同Windows版本的PropertySheet内部结构可能有差异,建议在目标系统上做兼容性测试。
- 标题区的边界需准确计算,可结合
GetClientRect和系统指标确定绘制范围。
内容的提问来源于stack exchange,提问作者user3161924
相关产品推荐
相关产品推荐

