win32視窗程式-------3、點陣圖及去除背景色
阿新 • • 發佈:2019-01-28
一、載入點陣圖步驟:
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;
}
結果如下: