【发布时间】:2011-03-10 10:29:30
【问题描述】:
假设我有一个设备上下文句柄(当然,在 Windows 环境中):
HDC hdc;
如何获取它的宽度和高度?
【问题讨论】:
假设我有一个设备上下文句柄(当然,在 Windows 环境中):
HDC hdc;
如何获取它的宽度和高度?
【问题讨论】:
但是如果获取计算器的window_dc维度,会在“GetCurrentObject”或“GetObject”失败,我想可能window属性包含“ws_ex_noredirectionbitmap”,这种情况下如何获取维度?
HDC win_dc = ::GetWindowDC(hwnd);
BITMAP bm = { 0 };
HGDIOBJ hBitmap = GetCurrentObject(win_dc, OBJ_BITMAP);
if (hBitmap)
{
if (GetObject(hBitmap, sizeof(BITMAP), &bm))
{
windc_dimension.cx = bm.bmWidth;
windc_dimension.cy = bm.bmHeight;
}
}
【讨论】:
当我只有 HDC 时,我总是使用这段简单的代码来获取渲染区域的尺寸。 首先,您必须从 HDC 获取 HWND - 很简单,然后您可以获取此 HWND 的客户端矩形:
RECT rcCli;
GetClientRect(WindowFromDC(hdc), &rcCli);
// then you might have:
nWidth = rcCli.right-rcCli.left;
nHeight = rcCli.bottom-rcCli.top;
【讨论】:
您可以WindowFromDC(...) 获取 DC 的窗口(如果它与窗口相关联)。然后,您可以使用@KevinK 的答案来获取客户的正确答案。
【讨论】:
设备上下文 (DC) 是一种结构,它定义了一组图形对象及其相关属性,以及影响输出的图形模式。
按宽度和高度,我猜您指的是绘制的位图?
如果是这样,那么我想您可以尝试以下方法:
BITMAP structBitmapHeader;
memset( &structBitmapHeader, 0, sizeof(BITMAP) );
HGDIOBJ hBitmap = GetCurrentObject(hDC, OBJ_BITMAP);
GetObject(hBitmap, sizeof(BITMAP), &structBitmapHeader);
//structBitmapHeader.bmWidth
//structBitmapHeader.bmHeight
【讨论】:
我对 GDI 也知之甚少,但似乎 GetDeviceCaps 可以解决问题。
【讨论】:
GetDeviceCaps(hdc, HORZRES) 和 GetDeviceCaps(hdc, VERTRES) 很可能是我们想要的。
作为免责声明,我对 GDI 或您在应用程序中必须使用的内容一无所知。如果可能的话,我只是想提供帮助。
也就是说,我发现一个链接似乎表明使用GetClientRect 来获取绘图区域的大小是合适的:
RECT clientRect;
GetClientRect(hWnd,&clientRect);
【讨论】: