一、加载位图步骤:
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;
}
结果如下: