假设我有一个设备上下文句柄(当然,在 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 可能可以解决问题。
当我只有 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 的答案来获取客户端的正确信息。
作为免责声明,我对 GDI 或您在应用程序中必须使用的内容一无所知。如果可能的话,我只是想帮忙。
也就是说,我找到了一个链接,似乎表明使用
GetClientRect
来获取绘图区域的大小是合适的:
RECT clientRect;
GetClientRect(hWnd,&clientRect);
但是如果获取计算器的window_dc尺寸,它会在“GetCurrentObject”或“GetObject”处失败,我认为可能窗口属性包括“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;
}
}
我正在两种可能的上下文上绘图:位图(2480x3508)和打印机页面(4961x7016)。
位图尺寸返回错误的打印机页面尺寸 (1x1)。
GetDeviceCaps
返回打印机页面的正确尺寸,但返回位图的错误尺寸(屏幕尺寸)。
此函数返回位图和打印机页面的正确尺寸。可能不适用于其他环境。
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};
}