STM_SETIMAGE不会使静态控件无效/重绘

时间:2012-07-05 12:36:38

标签: c++ winapi

在使用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的正常行为,还是我做错了什么?文档at 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);显示控件。

1 个答案:

答案 0 :(得分:1)

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

HBITMAP hOldBmp = (HBITMAP) ::SendMessage(hStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) DestBmp);
.....
::InvalidateRect(hStatic, NULL, FALSE);