通过这三天的学习使我对gdi有了进一步的认识,但由于我个人智慧的有限导致了认识和理解的造成的片面和不足,还请假见谅。
当位图的资源在在处理主窗口消息的区域进行响应时,可以采用WM_PAINT后面添加代码的方式,还可以选用按键或者鼠标响应的方法,如下面就是采用鼠标响应的方法
case WM_LBUTTONDOWN:
{
hdc = GetDC(hWnd);//获得设备的主DC
HDC hBkDc = CreateCompatibleDC(hdc);//创建一个兼容DC
//从文件中将资源图片加载
HBITMAP hBkBitmap = (HBITMAP)LoadImage(hInst,//资源句柄
_T("bk.bmp"),//加载资源的文件名
IMAGE_BITMAP, //风格方式
0, 0, //期望的高度值,如果给0,自动匹配图片的大小
LR_LOADFROMFILE);//文件的加载
SelectObject(hBkDc, hBkBitmap);//将hBkBitmap关联进了hBkDc里面
BitBlt(hdc,//目标dc,就是要表现的dc
0, 0, //目标dc需要表现的左上角的x,y坐标
960, 600,//目标dc来表现资源dc需要操作过来的内容
hBkDc,//资源dc,里面有加载的资源
0, 0, //资源dc的起始裁剪坐标
SRCCOPY);//从资源dc怎么操作到目标dc,用源拷贝
//释放第2步的创建资源
DeleteObject(hBkBitmap);//将hBkBitmap释放
DeleteObject(hBkDc);//将hBkDc释放
HDC hHeroDc = CreateCompatibleDC(hdc);//再创建一个兼容DC
//加载文件资源
HBITMAP hHeroBitmap = (HBITMAP)LoadImage(hInst, _T("hero.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
SelectObject(hHeroDc, hHeroBitmap);//将位图与兼容dc建立联系
//BitBlt(hdc, 0, 0, 360, 352, hHeroDc, 0, 0, SRCCOPY);
TransparentBlt(hdc, 0, 0,90,88,/* 360, 352,*///目标区域
hHeroDc, 0, 0,
90,88,/*360, 352,*///此区域可以进行裁剪
RGB(255, 255, 255));//把资源画到目标,可以处理背景色为透明
DeleteObject(hHeroBitmap);
DeleteObject(hHeroDc);
ReleaseDC(hWnd, hdc);
}
break;
但是采用这种方式,如果将窗口进入无效区域,位图资源将会消失,无法进行保持,这时可以通过将其代码书写区域的改变,使其达到不断重绘位图,这时需将代码放置主函数区域,并将主消息循环改为PeekMessage()函数的方式,已达到不断重绘的效果
//HDC hdc = GetDC(g_hWnd);
双缓冲
//HDC hBuffDc = CreateCompatibleDC(hdc);
//HBITMAP hBuffBitmap = CreateCompatibleBitmap(hdc, 1024, 768);//一个缓冲兼容dc
//SelectObject(hBuffDc, hBuffBitmap);
资源的加载
//HDC hBkDc = CreateCompatibleDC(hdc);
//HBITMAP hBkBitmap = (HBITMAP)LoadImage(hInst, _T("bk.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);//从文件加载了资源图片
//SelectObject(hBkDc, hBkBitmap);
//HDC hHeroDc = CreateCompatibleDC(hdc);
//HBITMAP hHeroBitmap = (HBITMAP)LoadImage(hInst, _T("hero.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);//从文件加载了资源图片
//SelectObject(hHeroDc, hHeroBitmap);
//ReleaseDC(g_hWnd, hdc);
//ZeroMemory(&msg, sizeof(msg));
//while (msg.message != WM_QUIT)
//{
// if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
// {
// if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
// {
// TranslateMessage(&msg);
// DispatchMessage(&msg);
// }
// }
// //逻辑
// static int index = 0;
// static float beginTimer = timeGetTime() / 1000.0f;
// float endTimer = timeGetTime() / 1000.0f;
// static float speed = 0.3f;
// //不管有没有消息,都进行循环绘制
// hdc = GetDC(g_hWnd);
// RECT r = { 0, 0, 1024, 768 };
// HBRUSH hr = CreateSolidBrush(0x00);
// FillRect(hBuffDc, &r, hr);
// BitBlt(hBuffDc, 0, 0, 960, 600, hBkDc, 0, 0, SRCCOPY);
//TransparentBlt(hBuffDc, 0, 0, 90, 88,
// hHeroDc, 90*index, 88,
// 90,88,
// RGB(255, 255, 255));//把资源画到目标,可以处理背景色为透明
// if (endTimer - beginTimer >= speed)
// {
// index++;
// if (index >= 4)
//
// index = 0;
// beginTimer = endTimer;
//
//
// }
// //最后一次把缓冲dc的内容拷贝到主dc
// BitBlt(hdc, 0, 0, 1024, 768, hBuffDc, 0, 0, SRCCOPY);
// DeleteObject(hr);
// ReleaseDC(g_hWnd, hdc);
//}
//DeleteObject(hHeroBitmap);
//DeleteObject(hBkBitmap);
//DeleteObject(hBuffBitmap);
//DeleteDC(hHeroDc);
//DeleteDC(hBkDc);
//DeleteDC(hBuffDc);