注:贴图使用BMP格式图片
首先处理图片
使用Ps等软件处理,将左边背景处理成纯黑(255,255,255),右侧将主体转为纯黑背景色为纯白
声明变量
HDC mdc;
HBITMAP b;//蝴蝶
HBITMAP hbmp;//背景
加载图片
在初始化函数中
//1.加载图片
hbmp = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, 700, 379, LR_LOADFROMFILE);
b = (HBITMAP)LoadImage(NULL, L"b.bmp", IMAGE_BITMAP, 226, 113, LR_LOADFROMFILE);
//2.内存联系
g_hDc = GetDC(g_hWnd);
mdc = CreateCompatibleDC(g_hDc);
//3.选择
SelectObject(mdc, hbmp);
在MyDraw函数中显示图片
//将内存DC内容映射到窗口DC
BitBlt(hdc, 0, 0, 700, 379, mdc, 0, 0, SRCCOPY);
SelectObject(mdc, b);
BitBlt(hdc,500, 230, 113, 113, mdc, 113, 0, SRCAND);//对贴图右侧部分处理
//通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并
BitBlt(hdc, 500, 230, 113, 113, mdc, 0, 0, SRCPAINT);//处理左侧部分
//通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并
运行结果
附上全文:
#include <windows.h> //包含文件
//定义
#define WINDOW_WIDTH 900
#define WINDOW_HEIGHT 350
#define WINDOW_TITLE L"VM"
//变量定义
HWND g_hWnd;
HINSTANCE g_hInst;
HDC g_hDc;
HDC mdc;
HBITMAP b;//蝴蝶
HBITMAP hbmp;//背景
//函数声明
int MyWindowsClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口过程函数 重要函数
void MyDraw(HDC hdc);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)//主函数 APIENTRY自定义什么系统要用的东西
//HINSTANCE 具体应用程序 句柄 第二个参数 上一个程序句柄 ,第三个 应用程序命令行的字符串的指针,第四个参数 显示方式)
{
MSG msg = { 0 };//消息类结构体,记为空
MyWindowsClass(hInstance);
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
int MyWindowsClass(HINSTANCE hInstance) {
//窗口
//1.设计窗口->编写一个数据结构
WNDCLASSEX wcex;//数据类型-结构体
//具体内容
wcex.cbSize = sizeof(WNDCLASSEX);//包含字节数
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;//WndProc函数名
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;//一开始系统建立标识
wcex.hIcon = NULL;//图标
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);//鼠标 载入系统指定光标资源 两个参数(程序,鼠标类型)
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;//菜单
wcex.lpszClassName = L"gamebase";
wcex.hIconSm = NULL;
//设计完成
//2.将设计好的窗口登记
return RegisterClassEx(&wcex);
}
//初始化窗口
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {
int i;
g_hInst = hInstance;
//3.产生窗口
g_hWnd = CreateWindow(L"gamebase",//返回值:HWND classname,
WINDOW_TITLE,//指针
WS_OVERLAPPEDWINDOW,//产生一个层叠的窗口
CW_USEDEFAULT,
CW_USEDEFAULT,
WINDOW_WIDTH,
WINDOW_HEIGHT,
NULL,//父窗口
NULL,//菜单句柄
hInstance,//应用程序
NULL);//
if (!g_hWnd) {
return false;
}
//显示窗口
MoveWindow(g_hWnd, 100, 100, 715, 418, true);
ShowWindow(g_hWnd, nCmdShow);
UpdateWindow(g_hWnd);
//加载图片
hbmp = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, 700, 379, LR_LOADFROMFILE);
b = (HBITMAP)LoadImage(NULL, L"b.bmp", IMAGE_BITMAP, 226, 113, LR_LOADFROMFILE);
//内存联系
g_hDc = GetDC(g_hWnd);
mdc = CreateCompatibleDC(g_hDc);
//3
SelectObject(mdc, hbmp);
MyDraw(g_hDc);
ReleaseDC(g_hWnd, g_hDc);
return TRUE;
}
//窗口过程函数
LRESULT CALLBACK WndProc(HWND hWnd, //窗口句柄 由哪个窗口发送
UINT message, //消息类型
WPARAM wParam,//按下按键的虚拟键码
LPARAM lParam)//存储按键的相关状态信息
{
PAINTSTRUCT ps;
//int i;
switch (message)
{
case WM_PAINT:
g_hDc = BeginPaint(hWnd, &ps);
MyDraw(g_hDc);
EndPaint(g_hWnd, &ps);
break;
case WM_DESTROY://销毁窗口
PostQuitMessage(0);//结束线程
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
void MyDraw(HDC hdc)//dc-设备上下文
{
//将内存DC内容映射到窗口DC
BitBlt(hdc, 0, 0, 700, 379, mdc, 0, 0, SRCCOPY);
SelectObject(mdc, b);
BitBlt(hdc,500, 230, 113, 113, mdc, 113, 0, SRCAND);
BitBlt(hdc, 500, 230, 113, 113, mdc, 0, 0, SRCPAINT);
}