微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在不使用句柄或 HWND 的情况下从内存 hdc 获取矩形或 &rc

如何解决如何在不使用句柄或 HWND 的情况下从内存 hdc 获取矩形或 &rc

我使用的是 Microsoft Windows(32 位)。请不要使用 Visual Studio 或 .net。

如果我有一个 Windows 句柄,我有以下工作:

// I have a handle to a window.    
// HWND Handle_Of_SomeWindow
// I prevIoUsly assigned a handle for that and use it.

// I have some Unicode text that I am using.
wstring SomeWideStringText = L"C++ stole my lunch money.";

// I convert that wstring to LPWSTR using 
LPWSTR Text_Being_Added = const_cast<wchar_t*>(SomeWideStringText.c_str());
    

//I create a rectangle to use in my DrawTextExW
RECT rc;    

// If I have a handle to a window then I can do this.
GetClientRect(Handle_Of_SomeWindow,& rc);

//But,if I do not have a handle to a window and if I only have a hdc,then that does not work.

我有一个没有窗口句柄的 HDC 时(我认为这是一个内存 dc,但我还不太明白),我在双缓冲中使用它,然后没有句柄可以使用。而且,我无法处理它。从 DC 获取句柄不起作用。

所以,我的问题是如何获得一个矩形或 &rc 以便在我的命令中使用:

DrawTextExW(HDC_of_FRONT_BUFFER_001,Text_Being_Added,-1,& rc,DT_WORDBREAK,nullptr);

也许除了矩形 &rc 之外,我还可以使用其他东西,但我还没有找到。

我一直在研究这个,但我不明白如何使用矩形或 &rc。

解决方法

您误解了您提供给 DrawTextEx 的矩形是什么,它不是位图的大小,而是您希望文本占据的大小。它显然应该小于或等于您的支持位图的大小,但与它没有其他关系。

那么就没有句柄可以使用了。而且,我无法处理它。从 DC 获取句柄不起作用。

完全不知道你想在这里表达什么。

我不明白如何使用矩形或 &rc

再说一次,不是交给你,是你提供。

,

内存 DC 选择了一个位图,并且该位图有一个大小。在大多数情况下,您的代码创建了该位图,因此它应该已经知道大小。

但如果没有,你有几个选择。

选项 1:您可以从 DC 中选择位图,获取其大小,然后重新选择它。这有点笨拙,我省略了错误检查:

// assuming you're given hdcMem...
HBITMAP hbmpTemp = CreateCompatibleDC(hdcMem,1,1);
HBITMAP hbmpActual = SelectObject(hdcMem,hdcTemp);
BITMAP bm = {0};
GetObject(hbmpActual,sizeof(bm),&bm);
// now your size is in bm.bmWidth and bm.bmHeight,RECT rc = {0,bm.bmWidth,bm.bmHeight};
SelectObject(hdcMem,hdcActual);  // put the memory DC back
DeleteObject(hbmpTemp);

选项 2:[未经测试] 您可以尝试查询 DC 的“分辨率”上限。我知道这适用于设备 DC,如显示器或打印机。我不知道它是否适用于内存 DC。

int width = GetDeviceCaps(hdcMem,HORZRES);
int height = GetDeviceCaps(hdcMem,VERTRES);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。