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

时间:2014-04-09 14:47:51

标签: c++ winapi dll hwnd device-context

我正在尝试弄清楚如何使用Windows API函数PathCompactPath。除了缩短路径字符串的像素长度之外,它还需要设备上下文(hDC)的句柄,其中设备上下文包含有关用于长度计算的字体大小,字体等的信息。 p>

如果我有一个标签的窗口句柄(hWnd),我怎样才能正确获取包含创建此标签的字体信息的设备上下文? GetDC似乎丢弃了普通窗口句柄的这些信息。

我正在编写一个用于VB6的C ++ DLL,因此hWnd将来自VB6控件。但是,我认为我的问题也适用于一般情况(C ++表格中的标签)。

1 个答案:

答案 0 :(得分:3)

我假设你的"标签"是一个带有文本的静态控件。如果是这种情况,您只需添加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消息的返回情况 - 您查询的控件可能不支持该消息。<\ n \ n

/ p>