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

标签 c++ winapi dll hwnd gdi

我正在尝试弄清楚如何使用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/

相关文章:

c++ - 如何创建没有透明内容的完全透明窗口?

c++ - WinINet API 可以在 Windows Server 操作系统上使用吗?

c++ - 使用 ReadConsoleInput() 拖动控制台窗口

c++ - 使用指向 igzstreams 的指针的 STL vector 读取 gzip 文件

c++ - 如何通过 C 或 C++ API 获取 HDF5 数据集的名称?

c# - 找不到方法 : 'System.IO.Stream Microsoft.TeamFoundation.VersionControl.Client.Item.DownloadFile()'

c++ - 使用 OpenCV 和 VLC SDK 的函数入口点出现奇怪错误

c++ - 是否将下溢的无符号整数与 -1 进行了明确的比较?

c# - 以编程方式列出 Windows 10 中所有受支持的语言环境

dll - 在 Ida Pro 中查找字符串数据引用的引用