• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 檢測屏幕分辨率和顏色深度

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    南京海軍指揮學院 黃向明 ---- Windows API函數GetDeviceCaps()可提供廣泛的關于設備背景的信息,其中包括屏幕分辨率和顏色深度。GUI程序設計允許將圖形元素作為抽象的對象,不管硬件設備的情況及用戶設置的選擇。這對大多數情況,比如典型的窗口畫面和設備

    南京海軍指揮學院 黃向明  

    ---- Windows API函數GetDeviceCaps()可提供廣泛的關于設備背景的信息,其中包括屏幕分辨率和顏色深度。GUI程序設計允許將圖形元素作為抽象的對象,不管硬件設備的情況及用戶設置的選擇。這對大多數情況,比如典型的窗口畫面和設備無關位圖操作都能滿足。但是在某些特殊情況下將受到限制,程序員需要其它方法來獲得相關設備的實際情況信息。本文就介紹一獲取屏幕分辨率和顏色深度的應用程序。

    ---- 一、GetDeviceCaps()的功能

    ---- API函數GetDeviceCaps()可用來獲取設備的很多信息,它也就成為應用和設備驅動程序的網關。下列為它在wingdi.h中的原型:int GetDeviceCaps(HDC hdc,int nIndex);

    ---- 第一項參數是與檢測設備有關的設備背景,第二個參數表示檢測值。函數的具體功能在Win32SDK文件中有詳細介紹,本文集中介紹二個與顯示設備最相關的特性:分辨率(水平和垂直)和能顯示的不同顏色數。這些值能分別由HORZRES,VERTRES和BITSPIXEL返回給GetDeviceCaps()的第二個參數。BITSPIXEL返回描述一個像素顏色需要的位數,要確定實際顏色數只要計算以2作為冪的返回值的指數。

    ---- 下列給出的C代碼就是檢測屏幕分辨率和顏色深度:

    /* 屏幕dc初始化*/
    HDC screenDC;
    int colorBits, xRes, yRes;
    screenDC = CreateDC("DISPLAY", NULL, NULL, NULL);
    /* 檢索設備 */
    colorBits = GetDeviceCaps(screenDC, BITSPIXEL);
    xRes = GetDeviceCaps(screenDC, HORZRES);
    yRes = GetDeviceCaps(screenDC, VERTRES);
    /* 清除 */
    DeleteDC(dc);

    ---- 從上述代碼看好象很簡單,而且這在大多數情況下是可行的,但當在32K彩色模式時就不行了,在這種情況下GetDeviceCaps()返回16而不是期望的15(2^15是32,768)。另外,32K和64K顏色之間的區別(兩者也作為"高-顏色方式")不大,當用15bit設備顯示64K顏色位圖時Windows應用抖動算法實現。那么,怎么能檢測32K顏色情況和將它與64K情況區別開?
    ---- 二、開發SetPixel()函數功能

    ---- API函數比SetPixel(),以指定RGB顏色設置像素在設備背景上,還返回RGB值,而如果匹配不好的話,此返回的可能不是我們需要的顏色值。雖然,這一特性看上去沒什么用處,但你可用它解決GetDeviceCaps()對15位顏色模式返回16位問題。如果用提供的RGB值設置一像素的顏色,并比較其返回的COLORREF,就能確定設備是否支持那種顏色。將上述算法放入一循環中,使RGB組合不斷改變,設備既是視頻卡,計算比較值為真的次數有多少。

    ---- 顯然,用上述方法要對SetPixel()調用2^24次在時間上是不合理的,其實并不需要在所有可能的值之中重復,分別比較每個顏色組合(先紅色,然后綠色,然后藍色)也可產生相同的結果,并且迭代次數可減少到255次。

    ---- GetScrResolution()僅僅是對GetDeviceCaps(HORZRES)和GetDeviceCaps(VERTRES)的接連處理:

    BOOL GetScrResolution(WORD* pWidth, WORD* pHeight)
    {
    HDC screenDC;
    screenDC = CreateDC("DISPLAY", NULL, NULL, NULL);
    if (!screenDC)
      return FALSE;

    *pWidth = GetDeviceCaps(screenDC, HORZRES);
    *pHeight = GetDeviceCaps(screenDC, VERTRES);

    DeleteDC(screenDC);
    return TRUE;
    }

    ---- GetScrColorDepth()調用GetDeviceCaps(BITSPIXEL),但是,當API返回16時,它使用 GetScrRGBBitsPerPixel()來依次計算紅色、綠色和藍色組合。如果他們都等于32,API返回代碼16顯然是不正確的,而實際上因是15。
    BYTE GetScrColorDepth()
    {
    HDC screenDC;
    BYTE numOfBits;

    screenDC = CreateDC("DISPLAY", NULL, NULL, NULL);
    if (!screenDC)
      return 0;
    numOfBits = GetDeviceCaps(screenDC, BITSPIXEL);
    DeleteDC(screenDC);

    if (numOfBits == 16)
      {
           // 是否為64K色,或32K
      WORD red, green, blue;
      GetScrRGBBitsPerPixel(&red, &green, &blue);
      if (red == 32 && green == 32 && blue == 32)
                  // 32*32*32 = 2^15 色
       numOfBits = 15;
    }

    return numOfBits;
    }

    GetScrRGBBitsPerPixel()通過255次循環測
    試設備支持的紅、綠色和藍色值。

    BOOL GetScrRGBBitsPerPixel(WORD* pRedBits,
                               WORD* pGreenBits,
                               WORD* pBlueBits)
    {
    BOOL isError = FALSE;
    HDC screenDC, memDC;
    HBITMAP bmp = NULL;
    HBITMAP bmpOld = NULL;

    *pRedBits = *pGreenBits = *pBlueBits = 1;

    screenDC = CreateDC("DISPLAY", NULL,
      NULL, NULL);
    memDC = CreateCompatibleDC(NULL);
    bmp = CreateCompatibleBitmap(screenDC, 1, 1);
    isError = screenDC && memDC && bmp;
    if (!isError)
      goto CleanUp;
      /* 有時goto語句是處理出錯的一種很簡便的方法 */
    bmpOld = (HBITMAP)SelectObject(memDC, bmp);

    {
      COLORREF oldColor;
      COLORREF curColor = RGB(255, 255, 255);
      int n;
      for (n = 255; n >= 0; --n)
      {
       oldColor = curColor;
       curColor = SetPixel(memDC,
       0, 0, RGB(n, n, n));
       isError = curColor;
       if (isError == CLR_INVALID)
       {
        isError = TRUE;
        goto CleanUp;
       }
       /* 計算紅、綠和藍匹配情況 */
       if (GetRvalue(curColor)
       < GetRvalue(oldColor))
        ++(*pRedBits);
       if (GetGvalue(curColor)
       < GetGvalue(oldColor))
        ++(*pGreenBits);
       if (GetBvalue(curColor)
      < GetBvalue(oldColor))
        ++(*pBlueBits);
      }
    }
    CleanUp:
      if (bmpOld)
       DeleteObject(bmpOld);
      if (bmp)
       DeleteObject(bmp);
      if (isError)
       *pRedBits = *pGreenBits
      = *pBlueBits = 0;
      if (screenDC)
       DeleteDC(screenDC);
      if (memDC)
       DeleteDC(memDC);

      return !isError;
    }


    ---- 可見GetScrRGBBitsPerPixel()不僅是解決本問題的核心,而且還可得到正使用的紅色、綠色和藍色各自的位數。例如,當有16位顏色時,哪一個顏色獲得6位,而不是另二個的5位,你可通過測試發現,一般綠色成分多一些。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>