如何找出DC的尺寸?

时间:2010-07-01 01:45:52

标签: c++ winapi gdi

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

HDC hdc;

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

6 个答案:

答案 0 :(得分:20)

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

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

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

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

//structBitmapHeader.bmWidth
//structBitmapHeader.bmHeight

答案 1 :(得分:11)

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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

那就是说,我找到了一个链接,似乎表明使用GetClientRect来获得绘图区域的大小是合适的:

RECT clientRect;

GetClientRect(hWnd,&clientRect);

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

答案 4 :(得分:2)

如果与窗口关联,您可以WindowFromDC(...)获取DC的窗口。然后你可以使用@KevinK的答案让客户端直接从中获取。

答案 5 :(得分:0)

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