如何找出直流电源的尺寸?

17

假设我有一个设备上下文的句柄(自然,在Windows环境中):

HDC hdc;

我该如何获取它的宽度和高度?

7个回答

29

设备上下文(DC)是一个定义了一组图形对象及其相关属性,以及影响输出的图形模式的结构。

通过宽度和高度,我猜你指的是绘制的位图?
如果是这样的话,那么我猜你可以尝试以下操作:

BITMAP structBitmapHeader;
memset( &structBitmapHeader, 0, sizeof(BITMAP) );

HGDIOBJ hBitmap = GetCurrentObject(hDC, OBJ_BITMAP);
GetObject(hBitmap, sizeof(BITMAP), &structBitmapHeader);

//structBitmapHeader.bmWidth
//structBitmapHeader.bmHeight

这个答案对打印机页面无效。我在下面发布了另一个答案:https://stackoverflow.com/a/77095378/2527795 - undefined

11

我对GDI也不是很了解,但似乎GetDeviceCaps可以解决问题。


9
具体来说,GetDeviceCaps(hdc, HORZRES)GetDeviceCaps(hdc, VERTRES) 最有可能是需要的内容。 - TheUndeadFish
4
GetDeviceCaps(hdc,*)返回屏幕尺寸,而不考虑窗口大小。KevenK和msandiford的GetClientRect(WindowFromDC(hdc),&r)可以解决这个问题。 - AbePralle

6

我通常使用这个简单的代码来获取渲染区域的尺寸,当我只有 HDC 时。首先,您必须从 HDC 获取一个 HWND - 这很简单,然后您可以获取此 HWND 的客户端矩形:

RECT    rcCli;          
GetClientRect(WindowFromDC(hdc), &rcCli);
// then you might have: 
nWidth = rcCli.right-rcCli.left; 
nHeight  = rcCli.bottom-rcCli.top;

2
只有当DC与窗口相关联时,此方法才有效。对于其他情况(例如从CreateCompatibleDC()获取的DC),WindowFromDC()将返回NULL。 - Archie

1
但是如果获取计算器窗口的尺寸,则在“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;
    }
}

客户端区域对于WS_EX_NOREDIRECTIONBITMAP是不可见的。 - Laurie Stearn

0
作为免责声明,我不了解GDI或您的应用程序中需要使用的内容。如果可能的话,我只是试图提供帮助。
话虽如此,我找到了一个链接,似乎表明使用GetClientRect来获取绘图区域的大小是合适的:
RECT clientRect;

GetClientRect(hWnd,&clientRect);

http://www.toymaker.info/Games/html/gdi.html#winsize


这个答案是错误的。GetClientRect()函数需要的参数是HWND,而不是HDC - undefined

0

如果DC与一个窗口相关联,您可以使用WindowFromDC(...)来获取DC的窗口。然后,您可以使用@KevinK的答案从中获取客户端矩形。


0
我正在考虑两种可能的上下文:位图(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};
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接