课程的内容是让我们写一段程序配上背景和人物然后用鼠标键盘事件来让人物动起来。
主要的坑点有两处。第一处是人物背景色无法去除。
这一点可以有两种方式去解决
第一种是直接用函数TransparentBlt()
其中的最后一个参数为去除背景的颜色,可以先用ps把背景色弄成白色然后把该参数设为
RGB(255, 255, 255) 这个方法比较方便
代码片段
//背景贴到mdc缓冲1
SelectObject(bufdc, hBitmap1);
BitBlt(hmdc, 0, 0, 1200, 800, bufdc, 0, 0, SRCCOPY);
//mdc透明处理
SelectObject(bufdc, hBitmap2);
TransparentBlt(hmdc, currentX, currentY, 60, 90, bufdc, ltx, lty, w, h, RGB(255, 255, 255));
//缓冲2mdc贴到hdc
BitBlt(hDC, 0, 0, 1200, 800, hmdc, 0, 0, SRCCOPY);
还有一种是
StretchBlt(hDC, currentX, currentY, 60, 90, bufdc, ltx, lty, w, h, SRCPAINT);
此处的最后一个参数可选:
SRCPAINT 这是将两张图片颜色做or运算
SRCCOPY 这是贴图
SRCAND 这是将两张图片颜色做and运算
准备两张图 颜色要求分别如下
该方法的代码片段:
SelectObject(bufdc, hBitmap1);
GetObject(hBitmap1, sizeof(BITMAP), &bitmap1);
BitBlt(hDC, 0, 0, bitmap1.bmWidth, bitmap1.bmHeight, bufdc, 0, 0, SRCCOPY);
SelectObject(bufdc, hBitmap3);
StretchBlt(hDC, currentX, currentY, 60, 90, bufdc, ltx, lty, w, h, SRCAND);
// 左上坐标 宽度 高度 大图左上坐标 大图左上到右下的宽度高度
后面设置4个参数
SelectObject(bufdc, hBitmap2);
StretchBlt(hDC, currentX, currentY, 60, 90, bufdc, ltx, lty, w, h, SRCPAINT);
原理
第二处是闪屏
我按照双缓冲搞了很久之后发现仍然没有解决。。。于是我先试了更多重的缓冲。发现没有用。。
最后找到了原因
想要解决闪屏
hbrBackground属性必须设置为NULL!!!!!!!!!!!!!
这是最坑的地方!!