[ad_1]
我在程序的主窗口中使用双缓冲方法来防止闪烁,但我得到的是完全黑色的窗口客户端区域。 可能是什么问题呢。
相关代码如下所示:
请注意,WriteDatah 函数不是实际应用程序的实际部分。 我创建了一个新项目,并将有问题的代码放入其中,以便找出错误所在。 WriteData 代表了实际的代码。 通过这个新的测试应用程序,我能够将问题范围缩小到双缓冲未正确完成或映射模式与之冲突。 你怎么认为。
C++
case WM_CREATE: { HDC hdc = GetDC(hWnd); std::tuple<double, double, int, int> Tuple = GetAppDocumentSize(hWnd, hdc, iPageWidth, iPageHeight); iOneMMX = static_cast<int>(Approximate(get<0>(Tuple), 0)); iOneMMY = static_cast<int>(Approximate(get<1>(Tuple), 0)); int iWidth = GetSystemMetrics(SM_CXSCREEN); int iHeight = GetSystemMetrics(SM_CYSCREEN); hMemDC = CreateCompatibleDC(hdc); hBitmap = CreateCompatibleBitmap(hdc, iWidth, iHeight); hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); HBRUSH hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH); hOldBrush = (HBRUSH)SelectObject(hMemDC, hBrush); ReleaseDC(hWnd,hdc); break; }
C++
case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); std::tuple<double,double,int,int> Tuple = GetAppDocumentSize(hWnd, hdc, iPageWidth, iPageHeight); BitBlt(hdc, 0, 0, iPageWidth, iPageHeight, hMemDC, 0, 0, SRCCOPY); EndPaint(hWnd, &ps); } break;
下面的代码由 ID 为 ID_DRAW_DRAW_TEXT 的菜单项运行。 因此,它是由 WM_COMMAND 处理的。
C++
case ID_DRAW_DRAWTEXT: { Rectangle(hMemDC, 0, 0, iPageWidth, iPageHeight); WriteDatah(hMemDC,iOneMMX,iOneMMY,iPageWidth,iPageHeight); InvalidateRect(hWnd, NULL, FALSE); break; }
C++
HFONT CreateAppFont(int cHeight, int cWeight, DWORD bItalic, int cEscapement, DWORD bUnderline, LPCWSTR pszFaceName) { return CreateFont(cHeight, 0, cEscapement, cEscapement, cWeight, bItalic, bUnderline, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, pszFaceName); }
C++
double Approximate(double dNumber, int iDecimalPlaces) { int iMultipier = static_cast<int>(pow(10, iDecimalPlaces)); dNumber *= iMultipier; double dInteger = 0.0; double dDecimal = modf(dNumber, &dInteger); int Integer = static_cast<int>(dInteger); if (dDecimal >= 0.5) { Integer++; } double dResult = Integer / iMultipier; return dResult; }
C++
void WriteDatah(HDC hdc,int iOneMMX,int iOneMMY,int iPageWidth,int iPageHeight) { UNREFERENCED_PARAMETER(iPageHeight); std::wstring wstData = L"Jesus is Lord of the Nations"; int iOneINCHY = GetDeviceCaps(hdc, LOGPIXELSY); double dOneFontPOINT = (double)iOneINCHY / 72.0; int iOneFontPOINT = static_cast<int>(Approximate(dOneFontPOINT, 0)); int iFontSize = 10 * iOneFontPOINT; HFONT hFont = CreateAppFont(iFontSize, FW_BOLD); HFONT hOldFont = (HFONT)SelectObject(hdc, hFont); int iLeft = 10 * iOneMMX; int iTop = 10 * iOneMMY; SIZE size; GetTextExtentPoint32(hdc, wstData.c_str(), lstrlen(wstData.c_str()), &size); TEXTMETRIC tm; GetTextMetrics(hdc, &tm); for (int i = 0; i < 100; i++) { TextOut(hdc, iLeft, iTop, wstData.c_str(), lstrlen(wstData.c_str())); iTop += tm.tmHeight + tm.tmExternalLeading; } SelectObject(hdc, hOldFont); }
我尝试过的:
我已经调试了一整天了。 我也有相当多的谷歌搜索。
解决方案1
乍一看:您没有指定绘图的笔和画笔颜色。
解决方案2
我用过这个类: MFC 中的无闪烁绘图[^] 多年来,效果非常好。 我还编写了它的非 MFC 版本,我已经使用过几次。 您的代码似乎没有使用MFC,但原理是相同的。 这主要是关于处理消息 WM_PAINT
。 然而, WM_ERASEBACKGND
也需要通过返回 true 来处理。 我建议你仔细阅读这篇文章,看看你是否做错了什么。
如果您想查看非 MFC 版本,请告诉我,我会将其发布在这里。 它本质上与 MFC 版本相同,只是它使用 GDI 调用而不是 CDC 方法。
[ad_2]
コメント