我有一个使用一些的WinForms其中,坦率地说,好像不被重画它们的属性(文字,背景色等)改变控制COM服务器应用程序。
我曾尝试调用txtControlName.Invalidate()
以及.Update()
既不似乎影响任何东西。
这是一个业务需求,我们坚持到.NET 2.0,并提供视觉响应和有趣的用户界面,虽然我知道我大概可以强制重绘WinAPI的SendMessage()
我宁愿有净应付这一切的东西-有在地方足够的黑客和我们不希望添加更多。
最后,我想指出,净COM服务器的非托管应用程序内承载。
谢谢!
汤姆
附录:
这时,实际的更新代码如下所示:
public void UpdateSt(int? seq, string text) {
Control.CheckForIllegalCrossThreadCalls = true;
if (this.lblText.InvokeRequired) {
this.lblText.Invoke(new MethodInvoker(() => {
UpdateSt(seq, text);
}));
} else {
if (text != String.Empty) {
lblText.Text = text;
//WinAPI.InvalidateRect(lblText, true);
lblText.Refresh();
//WinAPI.SendMessage(lblText.Handle, (uint)WinAPI.WM.SETTEXT, 0, new StringBuilder(text));
DebugTrace("lblText says '" + lblText.Text + "', is supposed to say '" + text + "'.");
}
if (imgSeq.HasValue) {
// not implemented yet
}
}
}
附录#2:
间谍++报告说,WM_SETTEXT调用从.net的文本二传手发起失败,就像我自己的WM_SETTEXT电话。
附录3: 解决
原来,问题是一个破碎的消息泵和一些P的组合/调用该做弊大于利电话。 由于该库通过COM开始没有净消息泵和添加Application.Run()
一个新的线程中允许的一切应对的方式应该。 这似乎是一个好主意,以确保所有基于表单的互动从与该呼叫线程启动。