【问题标题】:Sending message to WM_PAINT向 WM_PAINT 发送消息
【发布时间】:2014-01-26 16:07:10
【问题描述】:

我正在尝试编写一个程序来控制带有箭头键的框的移动。我的代码有问题。是否可以通过 SendMessage 向 WM_PAINT 发送消息以在按下 LEFT 键时绘制一个新矩形? 以下是我的代码

case WM_KEYDOWN:
    switch(wParam)
    {
       case VK_LEFT:                              //LEFT MOVEMENT


    SendMessage(hwnd,WM_PAINT,VK_LEFT,0);
        break;



       case VK_ESCAPE: 
           //FOR ENDING THE GAME WITH ESCAPE KEY
           SendMessage(hwnd,WM_DESTROY,VK_ESCAPE,0);
        break;
    }


case WM_PAINT:
    hdc=BeginPaint(hwnd,&ps);


      Rectangle(hdc,x,600,x1,700);
    if(wParam==VK_LEFT)
    { Rectangle(hdc,x-50,600,x1-50,700);

    }
    EndPaint(hwnd,&ps);
    return 0;
case WM_DESTROY:

    PostQuitMessage(0);
    return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
where 

         x1=550;
          x=500

当按下左键时,控件是否转到 WM_PAINT

因为当我写的时候

if(wParam==VK_LEFT)
        { Rectangle(hdc,x-50,600,x1-50,700);

        }

什么都没有发生,但是当我写的时候

if(wParam==VK_ESCAPE)
    PostQuitMessage(0);
    return 0;

使用退出键退出窗口 它不是最终代码。我只是想了解为什么VK_LEFT 不执行?

【问题讨论】:

    标签: windows winapi


    【解决方案1】:

    你永远不会发送WM_PAINT。该系统负责执行此操作。相反,您调用InvalidateRect 指定您希望重新绘制的矩形。系统会将该矩形标记为无效,当下一个绘制周期发生时,该矩形将被重新绘制。

    如果您想使更复杂的区域无效,请使用InvalidateRgn

    如果您只想让整个窗口失效,请将NULL 传递给InvalidateRectlpRect 参数。

    【讨论】:

    • +1 这个。虽然您可以发送WM_PAINT,但它不会像预期的那样工作(例如WM_TIMER)。
    • 是专门为 WM_PAINT 设计的吗?
    • @Damon 如果您发送了WM_PAINT,甚至发布了它,当处理该消息的窗口进程调用BeginPaint 时会发生什么?
    • @MsFreedom911 我在答案中所说的一切都是针对绘画的。我认为您可能比阅读 Petzold 的经典著作 Programming Windows 更糟糕。
    • @marcin_j 这不会让上色更快,只是更快。想要这样做是不寻常的。我很失望你建议 UpdateWindow 没有添加所有必要的附带条件。
    猜你喜欢
    • 1970-01-01
    • 2017-10-06
    • 2015-06-13
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2019-09-16
    • 2015-07-13
    • 2014-04-25
    相关资源
    最近更新 更多