我正在尝试弄清楚如何使用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 消息的返回 - 您正在查询的控件可能不支持该消息。
关于c++ - 如何从 PathCompactPath 的 Wnd 句柄获取 DC 句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22966202/