1. 程式人生 > >win32視窗程式-------3、點陣圖及去除背景色

win32視窗程式-------3、點陣圖及去除背景色

一、載入點陣圖步驟:

1、建立目標DC

BegainPaint() 
或者GetDc()//視窗的DC   已經包含一張點陣圖
//貼圖片需要兩個DC,一個為目標DC,一個為源DC

2、建立源DC

HdcMem=CreateCompatibleDC(hDC); //建立的相容的DC是沒有點陣圖的,需要選入一張點陣圖

3、載入點陣圖

HBITMAP  hBitmap = LoadBitmap(GhInstance,MAKEINTRESOURCE(IDB_BITMAP1) ) ;     

4、選入點陣圖

SelectObject(HdcMem,hBitmap); // 選這個點陣圖到,源DC;Bitmap物件只能被快取DC選中

5、拷貝傳輸

BitBlt(hDC,0,0,500,500,HdcMem,0,0,SRCCOPY);//函式對指定的源裝置環境區域中的畫素進行位塊(bit_block)轉換,以傳送到目標裝置環境

6、刪除

DeleteObject(hBitmap);//刪除點陣圖
          DeleteDC(HdcMem); //刪除源DC
          ReleaseDC(hWnd,hDC);//釋放目標DC

二、載入點陣圖去處背景色

需要點陣圖有一個白色背景,和一個黑色背景,通過如下的方式可以實現對圖片`case WM_PAINT:
{
//目標DC
hDC=GetDC(hWnd);
//源DC
HdcMem=CreateCompatibleDC(hDC);
//載入點陣圖
HBITMAP hBitmap1=LoadBitmap(GhInstance,MAKEINTRESOURCE( IDB_BITMAP1) ) ;
HBITMAP hBitmap2=LoadBitmap(GhInstance,MAKEINTRESOURCE( IDB_BITMAP2 ) ) ;
//(第一次)選入點陣圖、拷貝傳輸
SelectObject(HdcMem,hBitmap1);
BitBlt(hDC,0,0,500,500,HdcMem,0,0,SRCCOPY);//白色的背景
//SRCAND通過使用布林型AND(與)操作符來將源和目標矩形區域內的顏色合併。


//(第二次)選入點陣圖、拷貝傳輸
SelectObject(HdcMem,hBitmap2);
BitBlt(hDC,0,0,500,500,HdcMem,0,0,SRCPAINT);//黑色的背景
//RCPAINT通過使用布林型OR(或)操作符將源和目標矩形區域的顏色合併。

DeleteObject(hBitmap);//刪除點陣圖
DeleteDC(HdcMem);//刪除源DC
ReleaseDC(hWnd,hDC);//釋放目標DC
}三、程式及結果

#include <windows.h>
#include "resource.h"


HINSTANCE GhInstance;
//  視窗訊息 處理函式
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HDC hDC; HDC HdcMem; switch(uMsg) { case WM_CLOSE: // 點X 視窗關閉的訊息 ::PostQuitMessage(0); // 傳送退出的訊息 break; case WM_PAINT: { //1、目標DC hDC=GetDC(hWnd); //2、源DC HdcMem=CreateCompatibleDC(hDC); //3、載入點陣圖 HBITMAP hBitmap=LoadBitmap(GhInstance,MAKEINTRESOURCE(IDB_BITMAP1) ) ; // HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, "20070620224120407.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //4、選入點陣圖 SelectObject(HdcMem,hBitmap); // Bitmap 物件只能被快取DC選中 //5、拷貝傳輸 BitBlt(hDC,0,0,500,500,HdcMem,0,0,SRCCOPY); DeleteObject(hBitmap);//刪除點陣圖 DeleteDC(HdcMem); //刪除源DC ReleaseDC(hWnd,hDC);//釋放目標DC } break; } return ::DefWindowProc( hWnd, uMsg, wParam, lParam); } int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance, LPSTR pCmdLine,int nCmdShow) { GhInstance=hInstance; HBRUSH hBrush = ::CreateSolidBrush(RGB(0,0,255));//建立藍色的畫刷 // 1. 設計 WNDCLASSEX wndclass; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; // 是否要分配額外的空間 wndclass.cbSize = sizeof(WNDCLASSEX); wndclass.hbrBackground =hBrush; // 背景顏色,選擇藍色 wndclass.hCursor = NULL; // 游標 wndclass.hIcon =NULL; wndclass.hIconSm=NULL; // 視窗左上小圖示 wndclass.hInstance = hInstance; // 當前例項的控制代碼 wndclass.lpfnWndProc = WndProc; // 訊息處理函式 wndclass.lpszClassName = "123"; // 註冊視窗類的名 wndclass.lpszMenuName = NULL; // 選單名 wndclass.style = CS_HREDRAW|CS_VREDRAW; // 視窗類的樣式 // 2. 註冊 if(::RegisterClassEx(&wndclass) == FALSE) { ::MessageBox(NULL,"註冊失敗","提示",MB_OK); return 0; } // 3. 建立 HWND hWnd = ::CreateWindow(wndclass.lpszClassName,"~O(∩_∩)O~",WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hInstance,NULL); if(hWnd == NULL) { ::MessageBox(NULL,"建立失敗","提示",MB_OK); return 0; } // 4. 顯示 ::ShowWindow(hWnd,SW_SHOW); // 5. 訊息迴圈 MSG msg; while(::GetMessage(&msg,0,0,0)) { // 翻譯 ::TranslateMessage(&msg); // 分發 ::DispatchMessage(&msg); } // 刪除畫刷 ::DeleteObject(hBrush); return 0; }

結果如下:
這裡寫圖片描述