use*_*786 0 c windows winapi hdc
我有以下代码,应该picture2.bmp在用户调用项目后绘制ID_FILE_32771.
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case ID_FILE_32771:
hdc = BeginPaint(hWnd, &ps);
LoadAndBlitBitmap2(__T("D://picture2.bmp"), hdc);
EndPaint(hWnd, &ps);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
LoadAndBlitBitmap(__T("D://picture.bmp"), hdc);
EndPaint(hWnd, &ps);
break;
Run Code Online (Sandbox Code Playgroud)
问题是,什么都没画.hdc没有正确初始化.我做错了什么,我该如何解决?
该BeginPaint和EndPaint功能只有当你处理被称为WM_PAINT消息.你在处理过程中完成它的方式WM_COMMAND是错误的:
case ID_FILE_32771:
hdc = BeginPaint(hWnd, &ps); // WRONG, WRONG!
LoadAndBlitBitmap2(__T("D://picture2.bmp"), hdc);
EndPaint(hWnd, &ps); // ALSO WRONG!
break;
Run Code Online (Sandbox Code Playgroud)
所有绘制代码都需要在WM_PAINT处理程序内部.WM_PAINT无论何时需要绘制窗口,您都会收到消息,有时这些消息不在您的控制之内.因此,WM_PAINT处理程序中需要有逻辑,根据应用程序的当前状态知道要绘制什么.
换句话说,你需要设置一个标志来响应点击,ID_FILE_32771这样你的程序就知道它应该LoadAndBlitBitmap2在重新绘制时自己调用,而不是LoadAndBlitBitmap(为什么它们不是同一个函数,你只需要传递不同的文件名? ).
在WM_PAINT处理程序之外,您可以通过使窗口内容无效来导致绘制事件.最简单和最普遍合适的方法是调用InvalidateRect函数.例如:
case ID_FILE_32771:
// Set a flag indicating that picture2 should be painted
// (or some other equivalent mechanism)
paintPicture2 = true;
// Signal that the window should be repainted.
InvalidateRect(hWnd, NULL, TRUE);
break;
Run Code Online (Sandbox Code Playgroud)
通过调用UpdateWindow之后InvalidateRect,您将立即强制重绘,但这很少是必要的.或者,您可以跳过双功能舞蹈并直接调用RedrawWindow功能更强大的功能.
无论哪种方式,您都将调用您的WM_PAINT消息处理程序,它将查询应用程序的当前状态并绘制相应的图片.
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// Paint the appropriate thing, depending on the app's current state
if (paintPicture2)
LoadAndBlitBitmap(__T("D://picture.bmp"), hdc);
else
LoadAndBlitBitmap(__T("D://picture.bmp"), hdc);
EndPaint(hWnd, &ps);
break;
Run Code Online (Sandbox Code Playgroud)