Скажем, у меня есть дескриптор контекста устройства (естественно, в среде Windows):
HDC hdc;
Как я могу получить ширину и высоту?
Скажем, у меня есть дескриптор контекста устройства (естественно, в среде 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. Во-первых, вы должны получить HWND из HDC - это просто, тогда вы можете получить клиентский адрес этого HWND:
RECT rcCli;
GetClientRect(WindowFromDC(hdc), &rcCli);
// then you might have:
nWidth = rcCli.right-rcCli.left;
nHeight = rcCli.bottom-rcCli.top;
Как отказ от ответственности, я ничего не знаю о GDI или о том, с чем вы должны работать в своем приложении. Я просто стараюсь быть полезным, если это возможно.
Тем не менее, я нашел ссылку, которая, по-видимому, предполагает, что для получения размера области рисования целесообразно использовать GetClientRect
:
RECT clientRect;
GetClientRect(hWnd,&clientRect);
Вы можете WindowFromDC(...)
получить окно DC, если оно связано с окном. Затем вы можете использовать ответ @KevinK, чтобы получить от этого клиента.
но если получить измерение 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;
}
}