2

谁能告诉我在使用 STM_SETIMAGE 消息更改位图后静态控件不使其区域无效是否正常?

我用的是一个SS_BITMAP风格的静态控件,我用下面的代码设置了它的图片

    HBITMAP DestBmp;
    // Paint on DestBmp...

    HBITMAP hOldBmp = (HBITMAP) ::SendMessage(hStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) DestBmp);
    if (hOldBmp)
        DeleteObject(hOldBmp);

    // *** Why do I need this? ***
    ::InvalidateRect(hStatic, NULL, FALSE);

如果我不调用 InvalidateRect,则静态控件不会重新绘制自身。这是 STM_SETIMAGE 的正常行为,还是我做错了什么?MSDN上的文档没有提到需要在 STM_SETIMAGE 之后调用 InvalidateRect 的任何内容,而且这很奇怪,例如,您不需要在 SetWindowText 之后调用 InvalidateRect。这让我觉得我的代码可能有问题。


更新

这就是在我的 .rc 文件中定义控件的方式

CONTROL         "",IDC_IMAGE_PREVIEW,"Static",SS_BITMAP | NOT WS_VISIBLE,29,293,15,13

NOT WS_VISIBLE标志不是问题,稍后我使控件可见ShowWindow(SW_SHOW);

4

1 回答 1

1

由于还没有真正的解释,而且问题是获得意见,我将在此处添加我的解决方法。调用InvalidateRect()以强制控件重新绘制。

HBITMAP hOldBmp = (HBITMAP) ::SendMessage(hStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) DestBmp);
.....
::InvalidateRect(hStatic, NULL, FALSE);
于 2017-06-13T10:41:36.257 回答