用于STATIC文本的WM_SETTEXT不会刷新控件内容

时间:2016-04-01 18:30:04

标签: winapi

这对我很好奇。

当我使用它时:

Helpers.WinApi.SendMessage(nextControl, Helpers.WinApi.WM_SETTEXT, 0, "My String");

如果nextControl是STATIC控件(标签),则控件不会立即刷新。好奇心是,只有当我按下Alt键时,控件才会显示更改的文本。当我强制控制刷新时,它甚至不显示更改的文本(例如,最小化然后恢复窗口时)。

这仅在STATIC控制时发生。使用EDIT控件,它不会发生。

如何解决?

的Jaime

2 个答案:

答案 0 :(得分:0)

我已经解决了设置后更改标签的宽度。这是必要的,因为如果文本大于标签的宽度,它将被剪切。作为副作用,幸运的是,静态控件被重新绘制,看到WM_SETTEXT消息设置的文本。

扩大静态控制的代码是:

                        // Si es un label, debe  agrandar el ancho para que se acomode a la cantidad de caracteres del control
                        System.Drawing.Size size = Helpers.WinApi.MeasureString(System.Drawing.Graphics.FromHwnd(hWnd).GetHdc(), formatted.ToString());
                        Helpers.WinApi.RECT rect = new Helpers.WinApi.RECT();
                        if (Helpers.WinApi.GetWindowRect(nextControl, out rect))
                            Helpers.WinApi.MoveWindow(nextControl, rect.Left, rect.Top, rect.Right - rect.Left + size.Width, rect.Bottom - rect.Top, true);

答案 1 :(得分:0)

发生这种情况的一个常见原因是STATIC控件是否具有SS_SIMPLE样式。例如,如果您将样式更改为SS_LEFT,则会在文本更改时重绘正确。 (例如,如果新文本比旧文本短,则不会在新文本的右侧留下残留字符。)