天天看點

Windows程式設計,位圖

位圖

可以将視訊顯示器看作是一幅大的點陣圖。在螢幕上看到的圖素由儲存在視訊顯示卡上記憶體中的位元來描述。任何視訊現實的矩形區域也是一個點陣圖,其大小是它所包含的行列數。

實際上是一個将圖像從視訊顯示的一個區域複制到另一個區域。

可以使用 Bitblt()函數來實作視訊顯示器上圖像的呈現。

下面是Bitblt()的參數:

BitBlt( _In_ HDC hdc, _In_ int x, _In_ int y, _In_ int cx, _In_ int cy, _In_opt_ HDC hdcSrc, _In_ int x1, _In_ int y1, _In_ DWORD rop);
           

Bitblt()函數從稱為【來源(source)】的裝置内容中将一個矩形區的圖素傳輸到稱為【目的(destination)】的另一個裝置内容中相同大小的矩形區。

所謂的目的裝置内容就是視窗的顯示區域,裝置内容代号從BeginPaint獲得,當然你也可以在鍵鼠操作中,在WM_CREATE中自定義hdMem,通過

hdcMem = CreateCompatibleDC(hdc);.
           

這條語句實作。

來源裝置内容是應用程式的整個視窗,此裝置内容代号從GetWindowDC獲得。顯然,這兩個裝置内容指的是同一個實際裝置(視訊顯示器)。但是,這兩個裝置内容的坐标原點不同。

In int x1, In int y1參數指明了來源圖像左上角的坐标位置。在Bitblt中,這兩個參數設定為0,表示圖像從來源裝置内容(即整個視窗)的左上角開始,In int cx, In int cy參數是圖像的寬度和高度。

可以使用以下代碼準确獲得來源圖像的寬度和高度:

GetObject(hBitmap, sizeof(BITMAP), &bitmap);
		cxSource = bitmap.bmWidth;
		cySource = bitmap.bmHeight;
           

In int x, In int y,表示了複制圖像位置左上角的坐标位置。在Bitblt中,這兩個參數設定為不同的值可以實作來源圖像在視訊顯示器中的複制。

Bitblt的最後一個參數是位元映射操作形态。Bitblt是從實際視訊顯示記憶體傳輸圖素,而不是從系統功能表圖示的其他圖像傳輸。如果移動Bitblt視窗使得部分系統功能表圖示移出螢幕,然後調整Bitblt視窗的尺寸使其重畫,這時,Bitblt顯示區域中顯示的是功能表圖示的一部分。Bitblt函數不在存取整個圖像。

下面進行具體操作的說明:

注意若使用LoadImage函數導入圖像,來源圖像類型必須是bmp類型。

LoadImage(
    _In_opt_ HINSTANCE hInst,//加載外部資源時設定為null
    _In_ LPCWSTR name,//完整的來源圖像檔案路徑 或者 檔案名
    _In_ UINT type,//圖檔類型,IMAGE_CURSOR || IMAGE_ICON ||	IMAGE_BITMAP
    _In_ int cx,
    _In_ int cy,
    _In_ UINT fuLoad);//通常為LR_DEFAULTCOLOR || LR_CREATEDIBSECTION ,若是加載外部資源,即我們現在進行的操作,則設定為 LR_LOADFROMFILE
           

将來源圖像存放在項目檔案夾中,若不進行存放操作,則要在第二個參數中寫明完整的來源圖像檔案路徑。

In int cx, In int cy兩個參數,想要按照來源圖像檔案的實際尺寸加載,那麼就要設定 In int cx, In int cy = 0,并且fuLoad 不指定LR_DEFAULTSIZE。

若有一定的圖像大小要求,則 In int cx, In int cy不為0(設定為要求所限制的規格),并且fuLoad不指定LR_DEFAULTSIZE,此時,來源圖像會根據實際大小進行縮放。

這裡的 LR_DEFAULTSIZE 隻對Icon和Cursor起作用,對Bitmap不起作用。

一段代碼執行個體:

在LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){}中定義

static HBITMAP    hBitmap;
	BITMAP            bitmap;
	
           

然後再編寫以下代碼:

case  WM_CREATE:
	{
		hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
		hBitmap = (HBITMAP)LoadImage(NULL, TEXT("作業素材.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		GetObject(hBitmap, sizeof(BITMAP), &bitmap);
		cxSource = bitmap.bmWidth;
		cySource = bitmap.bmHeight;
		hdc2 = GetDC(hWnd);
	
		hdcMem = CreateCompatibleDC(hdc2);//must be located in Creat part...
		return 0;
	}
           

然後在WM_PAINT中使用Bitblt進行圖像的繪制:

case WM_PAINT:
        {
			HDC hdc = BeginPaint(hWnd, &ps);
			hdcMem = CreateCompatibleDC(hdc);
			SelectObject(hdcMem, hBitmap);
		 
			BitBlt(hdc, x1,x2, cxSource, cySource, hdcMem, 0, 0, SRCCOPY);
          
		


            EndPaint(hWnd, &ps);
        }
        break;