在.net COM服务器C#的WinForms控制不会重绘(C# WinForms control

2019-09-29 14:45发布

我有一个使用一些的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()一个新的线程中允许的一切应对的方式应该。 这似乎是一个好主意,以确保所有基于表单的互动从与该呼叫线程启动。

Answer 1:

通用的诊断是,有一些错误的消息泵。 你是不是抱怨控件不画自己都如此看来不太可能,这是彻底打破。 如果这是一个偶然的绘画问题,则诊断是,你已经有了一个线程的问题。 换言之,正在更新的控制性能,或者调用Invalidate /更新,从错误的线程。

Windows窗体有内置的诊断对于这一点,主动当一个调试器附加。 请确保您没有设置Control.CheckForIllegalCrossThreadCalls为false。

接下来的地方去寻找是消息泵本身。 当您显示他们的Show()方法而不是ShowDialog的形式(),那么你的非托管的消息泵将分发消息。 具有由本身的一些不良副作用,键盘快捷键将不再工作,也没有跳格。 检查如果你使用的ShowDialog问题消失()。


您的评论在提供什么可能的问题的另一种暗示。 如果从InvokeRequired获取假,当你知道你从另一个线程调用你没有看到你更新的任何明显的迹象,那么你使用了错误的Form对象引用。 也许是你和新的运营商创建的。 确保你使用现有的一个,Application.OpenForms []可以给大家一个参考,如果你有麻烦之一。



文章来源: C# WinForms control in .Net COM Server won't redraw