【发布时间】:2016-03-18 05:34:09
【问题描述】:
如何停止在我的 Win32 项目中显示位图。我有一个在 WM_PAINT 中调用的方法,称为 LoadBitmap。它的代码如下所示:
bool LoadBitmap(LPTSTR szfilename, HDC winhdc, int x, int y) {
HBITMAP bitmap;
bitmap = (HBITMAP)LoadImage(NULL, szfilename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (bitmap == NULL) {
::MessageBox(NULL, _T("Bitmap failed"), NULL, MB_OK);
return false;
}
HDC hdc;
hdc = ::CreateCompatibleDC(winhdc);
if (hdc == NULL)
{
::MessageBox(NULL, _T("HDC FAILED"), NULL, MB_OK);
return false;
}
BITMAP qbitmap;
int ireturn = GetObject(reinterpret_cast<HGDIOBJ>(bitmap), sizeof(BITMAP), reinterpret_cast<LPVOID>(&qbitmap));
if (!ireturn) {
::MessageBox(NULL, _T("RETURN FAILED"), NULL, MB_OK);
return false;
}
HBITMAP holdbitmap = (HBITMAP)::SelectObject(hdc, bitmap);
if (holdbitmap == NULL) {
::MessageBox(NULL, _T("HOLD FAILED"), NULL, MB_OK);
return false;
}
BOOL qRetBlit = ::BitBlt(winhdc, x, y, qbitmap.bmWidth, qbitmap.bmHeight, hdc, 0, 0, SRCCOPY);
if (!qRetBlit)
{
::MessageBox(NULL, _T("BLIT FAILED"), NULL, MB_OK);
return false;
}
::SelectObject(hdc, holdbitmap);
::DeleteDC(hdc);
::DeleteObject(bitmap);
return true;
}
注意 x 和 y 不断变化。 但是,当 x 和 y 发生变化时,它们的前一个实例会留在后面。
位图绘制到新位置后如何停止显示?
【问题讨论】:
-
在不了解 Win32 的情况下,位图不是可移动的“项”。绘制后,像素将一直保留,直到被擦除。所以要摆脱“痕迹”,你必须用其他东西(在这种情况下为背景颜色)在它上面画。
-
我该怎么做?
-
可能有两种方法:让Windows在重绘之前清除窗口(我不知道如何),或者找到一个绘制填充矩形的函数,并用它来擦除轨迹。
-
您可能还想研究双缓冲。您可以绘制到另一个位图,然后将该位图绘制到窗口。它可以防止闪烁,就像您在不断擦除移动位图留下的痕迹时可能遇到的那样。