【问题标题】:How to find out DC's dimensions?如何找出DC的尺寸?
【发布时间】:2011-03-10 10:29:30
【问题描述】:

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

HDC hdc;

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

【问题讨论】:

    标签: c++ winapi gdi


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这仅在 DC 与窗口关联时有效。对于其他情况(例如从 CreateCompatibleDC() 获得的 DC),WindowFromDC() 将返回 NULL。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      BITMAP structBitmapHeader;
      memset( &structBitmapHeader, 0, sizeof(BITMAP) );
      
      HGDIOBJ hBitmap = GetCurrentObject(hDC, OBJ_BITMAP);
      GetObject(hBitmap, sizeof(BITMAP), &structBitmapHeader);
      
      //structBitmapHeader.bmWidth
      //structBitmapHeader.bmHeight
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 具体来说,GetDeviceCaps(hdc, HORZRES)GetDeviceCaps(hdc, VERTRES) 很可能是我们想要的。
        • GetDeviceCaps(hdc,*) 返回屏幕尺寸,而不考虑窗口大小。 KevenK 和 msandiford 的 GetClientRect(WindowFromDC(hdc),&r) 可以解决问题。
        【解决方案6】:

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

        也就是说,我发现一个链接似乎表明使用GetClientRect 来获取绘图区域的大小是合适的:

        RECT clientRect;
        
        GetClientRect(hWnd,&clientRect);
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多