【问题标题】:How to get DC handle from Wnd handle for PathCompactPath?如何从 PathCompactPath 的 Wnd 句柄获取 DC 句柄?
【发布时间】:2014-05-22 20:53:58
【问题描述】:

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

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

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

【问题讨论】:

  • 您需要在设备中选择合适的字体
  • 经过一些测试,至少在 Windows 7 上,GetDC 实际上会在它返回的 dc 中保留 hwnd 的字体信息。

标签: c++ winapi dll hwnd gdi


【解决方案1】:

我假设您的“标签”是一个带有文本的静态控件。如果是这种情况,您可以简单地添加 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 消息的返回 - 您正在查询的控件可能不支持该消息。

【讨论】:

  • 只有在您拥有字体、DC 和 GUI 时才有效。当您想在控制台应用程序中仅基于字符数压缩路径时,您会怎么做?
  • @v.oddou:两个选项:(1)自己写,这应该相当简单,因为您只关心字符数而不是渲染大小。 (2)创建内存DC,创建定间距字体,选中进入DC,如图所示调用PathCompactPath。 (是的,如果您包含 &lt;windows.h&gt; 并链接到 gdi32 和可能是 user32,控制台应用程序可以创建 DC 和字体。)
  • 其实我昨天写完这篇评论就找到了解决方案:PathCompactPatchEx,Shlwapi 的功能 :) :)
猜你喜欢
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2015-06-29
相关资源
最近更新 更多