绘制代码在我的WM_COMMAND消息处理程序中无法正常工作

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没有正确初始化.我做错了什么,我该如何解决?

Cod*_*ray 5

BeginPaintEndPaint功能只有当你处理被称为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)