在使用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);
显示控件。
答案 0 :(得分:1)
由于还没有真正的解释,问题是获得观点,我将在此处添加我的解决方法。调用InvalidateRect()
强制控件重新绘制。
HBITMAP hOldBmp = (HBITMAP) ::SendMessage(hStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) DestBmp);
.....
::InvalidateRect(hStatic, NULL, FALSE);