如何从PathCompactPath的Wnd句柄获取DC句柄

How to get DC handle from Wnd handle for PathCompactPath?

本文关键字:句柄 获取 DC Wnd PathCompactPath      更新时间:2023-10-16

我正在尝试了解如何使用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消息的返回情况——您查询的控件可能不支持该消息。