如何从PathCompactPath的Wnd句柄获取DC句柄
How to get DC handle from Wnd handle for PathCompactPath?
我正在尝试了解如何使用Windows API函数PathCompactPath。除了路径字符串缩短到的像素长度之外,它还需要设备上下文(hDC)的句柄,其中设备上下文包含用于长度计算的字体大小、字体等信息。
如果我有一个标签的窗口句柄(hWnd),我如何正确地获得一个设备上下文,该上下文包含创建该标签时使用的字体信息?GetDC似乎会为普通窗口句柄丢弃此信息。
我正在编写一个用于VB6的C++DLL,因此hWnd将来自VB6控件。然而,我认为我的问题也适用于一般情况(C++形式的标签)。
我假设你的"标签"是一个包含文本的静态控件。如果是这样,你可以简单地添加SS_PATHELLIPSIS控件样式,让控件为你完成工作。
但要回答所问的问题:
你可以用GetDC为控件获取一个DC,但最有可能的是,该DC中没有选择正确的字体。如果选择了,那么你只是运气好,但你不想依赖运气。大多数控件都允许您通过向它发送WM_GETFONT消息来请求它将使用的字体的句柄。使用它,您可以设置DC,调用PathCompactPath,然后进行清理。
auto hdc = ::GetDC(hwnd);
auto hfont = reinterpret_cast<HFONT>(::SendMessage(hwnd, WM_GETFONT, 0, 0));
auto hfontOld = ::SelectObject(hdc, hfont);
blah blah PathCompactPath blah blah
::SelectObject(hdc, hfontOld);
::ReleaseDC(hwnd, hdc);
您需要进行一些错误检查,特别是检查WM_GETFONT消息的返回情况——您查询的控件可能不支持该消息。
相关文章:
- 如何获取边缘窗口句柄 (HWND)?
- 获取特定进程的句柄数
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- 获取现有进程句柄
- 无法获取 AllocConsole 的 STD 句柄
- VCL 应用程序何时获取其应用程序>主窗体>句柄?
- 获取进程内存信息失败,错误 6 句柄无效
- 如何获取打开的特定窗口的句柄?
- 如何从文件句柄获取包含目录的句柄
- 如何通过连接句柄获取 STMT 句柄?
- 是否可以注入一个进程并获取给定的句柄,然后使用它们注入另一个进程
- 如何在C++程序中打开一个新的cmd.exe并获取其句柄
- 如何获取句柄并枚举注册表路径:"REGISTRYA"?
- 如何从"本地"句柄获取"隔离<Object>"?
- 如何使用父窗口在子窗口中的句柄获取父窗口的 resize 事件
- 如何从HFONT句柄获取LOGFONT结构
- Linux:通过boost:: Thread的句柄获取线程ID
- 通过线程句柄获取线程的 TIB/TEB (2015)
- 如何从PathCompactPath的Wnd句柄获取DC句柄
- 从进程句柄获取进程信息