如何找出DC的尺寸?

问题描述 投票:0回答:7

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

HDC hdc;

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

c++ winapi gdi
7个回答
28
投票

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

我猜您指的是绘制的位图的宽度和高度?
如果是这样,那么我想你可以尝试以下方法:

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

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

//structBitmapHeader.bmWidth
//structBitmapHeader.bmHeight

12
投票

我对 GDI 也知之甚少,但似乎 GetDeviceCaps 可能可以解决问题。


7
投票

当我只有 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
投票

您可以

WindowFromDC(...)
获取 DC 的窗口(如果它与窗口关联)。然后你可以使用 @KevinK 的答案来获取客户端的正确信息。


1
投票

作为免责声明,我对 GDI 或您在应用程序中必须使用的内容一无所知。如果可能的话,我只是想帮忙。

也就是说,我找到了一个链接,似乎表明使用

GetClientRect
来获取绘图区域的大小是合适的:

RECT clientRect;

GetClientRect(hWnd,&clientRect);

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


1
投票

但是如果获取计算器的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;
    }
}

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};
}
© www.soinside.com 2019 - 2024. All rights reserved.