Windows介面編程(1) 位元影像背景與位元影像畫刷

來源:互聯網
上載者:User

可以通過WM_CTLCOLORDLG訊息來設定對話方塊的背景,MSDN上對這個訊息的說明如下:

The WM_CTLCOLORDLG message is sent to a dialog box before the system draws the dialog box. By responding to this message, the dialog box can set its text and background colors using the specified display device context handle.

當視窗訊息響應函數接收這個訊息時,wParam表示對 話框的裝置上下方即HDC,lParam表示對話方塊的控制代碼。如果程式處理了這個訊息,應返回一個畫刷。系統將會 用這個畫刷來重繪對話方塊背景。

因此我們在這個WM_CTLCOLORDLG訊息中得到對話方塊的大小,並通過 StretchBlt函數將位元影像縮放後貼到對話方塊的HDC中就完成了對話方塊背景的設定,然後返回一個空畫刷給系統, 這樣系統就不會將位元影像背景給覆蓋了。

代碼非常簡單,要注意的是在使用StretchBlt函數縮放位元影像時 ,最好先使用

SetStretchBltMode函數來設定下位元影像內容伸展模式,這樣可以避免縮放後位元影像失真嚴 重。SetStretchBltMode函數原型如下:

int SetStretchBltMode(

HDChdc,           // handle to DC

int iStretchMode   // bitmap stretching mode

);

第一個參數就是裝置上下方即HDC。

第二個參數有四種設定:

1. BLACKONWHITE or STRETCH_ANDSCANS

如果兩個或多個像素得合并成一個像素,那麼StretchBlt會對 像素執行一個邏輯AND運算。這樣的結果是只有全部的原始像素是白色時該像素才為白色,其實際意義是黑色 像素控制了白色像素。這適用於白色背景中主要是黑色的單色點陣圖。

2. WHITEONBLACK or STRETCH_ORSCANS

如果兩個或多個像素得合并成一個像素,那麼StretchBlt會對像素執行邏輯OR運算 。這樣的結果是只有全部的原始像素都是黑色時該像素才為黑色,也就是說由白色像素決定顏色。這適用於 黑色背景中主要是白色的單色點陣圖。

3. COLORONCOLOR or STRETCH_DELETESCANS

簡單地消 除圖素行或列,而沒有任何邏輯組合。這是通常是處理彩色點陣圖的最佳方法。

4. HALFTONE or STRETCH_HALFTONE

根據組合起來的來源顏色來計算目的的平均顏色。

其它技術細節可以見代 碼中的注釋,完整代碼如下(也可以下載,下載地址為: http://download.csdn.net/download/morewindows/4947377):

// 對話方塊位元影像背景  - WM_CTLCOLORDLG中使用StretchBlt貼圖  //By MoreWindows-(http://blog.csdn.net/MoreWindows)  #include <windows.h>  #include "resource.h"        const char szDlgTitle[] = "位元影像背景 使用StretchBlt貼圖 MoreWindows-(http://blog.csdn.net/MoreWindows)";        // 對話方塊訊息處理函數  BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);                  int APIENTRY WinMain(HINSTANCE hInstance,                       HINSTANCE hPrevInstance,                       LPSTR     lpCmdLine,                       int       nCmdShow)  {      DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);      return 0;  }              BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)  {      RECT       rcDialog;      HBITMAP    hBitmap;      static BITMAP s_bm;      static HDC    s_hdcMem;            switch (message)      {      case WM_INITDIALOG:          // 設定對話方塊標題          SetWindowText(hDlg, szDlgTitle);          // 設定對話方塊大小可調節          SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_SIZEBOX);                // 載入背影圖片          hBitmap = (HBITMAP)LoadImage(NULL, "005.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);          if (hBitmap == NULL)          {              MessageBox(hDlg, "LoadImage failed", "Error", MB_ICONERROR);              exit(0);          }                 else        {              // 將背影圖片放入HDC - s_hdcMem              HDC        hdc;              hdc = GetDC(hDlg);              s_hdcMem = CreateCompatibleDC(hdc);              SelectObject(s_hdcMem, hBitmap);                  ReleaseDC(hDlg, hdc);                    // 得到位元影像資訊              GetObject(hBitmap, sizeof(s_bm), &s_bm);          }                return 0;            case WM_COMMAND:          switch (LOWORD(wParam))          {          case IDCANCEL:              DeleteDC(s_hdcMem);              EndDialog(hDlg, LOWORD(wParam));              return TRUE;          }          break;                  case WM_SIZE:          InvalidateRect(hDlg, NULL, TRUE);          return TRUE;            case WM_CTLCOLORDLG:          GetClientRect(hDlg, &rcDialog);          //通過SetStretchBltMode的設定能使StretchBlt在縮放映像更加清晰          SetStretchBltMode((HDC)wParam, COLORONCOLOR);          StretchBlt((HDC)wParam, 0, 0, rcDialog.right, rcDialog.bottom, s_hdcMem, 0, 0, s_bm.bmWidth, s_bm.bmHeight, SRCCOPY);             return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));      }      return FALSE;  }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.