/*--------------------------------------- BITBLT.C -- BitBlt Demonstration (c) Charles Petzold, 1998 ---------------------------------------*/ #include <windows.h> #pragma comment(lib,"Msimg32.lib") #include "resource.h" LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; HBITMAP hBit; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName [] = TEXT ("BitBlt") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_INFORMATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, TEXT ("BitBlt Demo"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int cxClient, cyClient, cxSource, cySource ; static HDC hdcClient, hdcWindow ; int x, y ; HDC dc; PAINTSTRUCT ps ; static RECT re; static HBITMAP hBitMap; HBITMAP hBitMapHandle; BITMAP bit; static int cx,cy; static HDC t_dc; static HBITMAP hBackGround =NULL; HDC hdcBackGround,hdcPic; BITMAP bitPic,bitBack; static BITMAP pic,back; switch (message) { case WM_CREATE: cxSource = GetSystemMetrics (SM_CXSIZEFRAME) + GetSystemMetrics (SM_CXSIZE) ; cySource = GetSystemMetrics (SM_CYSIZEFRAME) + GetSystemMetrics (SM_CYCAPTION); hBit = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP1)); hBackGround = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP2)); // GetObject(hBit,sizeof(BITMAP),&bit); if(hBit == NULL || hBackGround ==NULL); { OutputDebugStringA("error"); } GetObject(hBit,sizeof(BITMAP),&pic); GetObject(hBackGround,sizeof(BITMAP),&back); return 0 ; case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; cx = GetSystemMetrics(SM_CXFULLSCREEN); cy = GetSystemMetrics(SM_CYFULLSCREEN); re.right = LOWORD(lParam); re.bottom = HIWORD(lParam); return 0 ; case WM_PAINT: hdcClient = BeginPaint (hwnd, &ps) ; hdcBackGround =CreateCompatibleDC(hdcClient); hdcPic = CreateCompatibleDC(hdcClient); SelectObject(hdcPic,hBit); SelectObject(hdcBackGround,hBackGround); // BitBlt(hdcClient,0,0,re.right,re.bottom,hdcBackGround,0,0,SRCCOPY);
//可以放缩图片
StretchBlt(hdcClient,0,0,re.right,re.bottom,hdcBackGround,0,0,back.bmWidth,back.bmHeight,SRCCOPY); TransparentBlt(hdcClient,100,100,pic.bmWidth,pic.bmHeight,hdcPic,0,0,pic.bmWidth,pic.bmHeight,RGB(255,255,255)); //把要贴图的图片的透明颜色,这设置下就OK了。我这要透明的颜色是白色。
DeleteDC(hdcBackGround); DeleteDC(hdcPic); EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: DeleteObject(hBit); DeleteObject(hBackGround); DeleteObject(&pic); DeleteObject(&back); PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }