假设我有一个设备上下文的句柄(自然,在Windows环境中):
HDC hdc;
我该如何获取它的宽度和高度?
设备上下文(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)
最有可能是需要的内容。 - TheUndeadFish我通常使用这个简单的代码来获取渲染区域的尺寸,当我只有 HDC 时。首先,您必须从 HDC 获取一个 HWND - 这很简单,然后您可以获取此 HWND 的客户端矩形:
RECT rcCli;
GetClientRect(WindowFromDC(hdc), &rcCli);
// then you might have:
nWidth = rcCli.right-rcCli.left;
nHeight = rcCli.bottom-rcCli.top;
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;
}
}
GetClientRect
来获取绘图区域的大小是合适的:RECT clientRect;
GetClientRect(hWnd,&clientRect);
GetClientRect()
函数需要的参数是HWND
,而不是HDC
。 - undefined如果DC与一个窗口相关联,您可以使用WindowFromDC(...)
来获取DC的窗口。然后,您可以使用@KevinK的答案从中获取客户端矩形。
std::pair<int, int> getDrawingAreaDimensions(HDC context)
{
// Drawing area is a bitmap
{
BITMAP header;
ZeroMemory(&header, sizeof(BITMAP));
HGDIOBJ bmp = GetCurrentObject(context, OBJ_BITMAP);
GetObject(bmp, sizeof(BITMAP), &header);
const int width = header.bmWidth;
const int height = header.bmHeight;
if (width > 1 && height > 1) {
return {width, height};
}
}
// Drawing area is a printer page
const int width = GetDeviceCaps(context, HORZRES);
const int height = GetDeviceCaps(context, VERTRES);
return {width, height};
}