是否可以在其自己的区域之外绘制WinForms控件(有效地隐藏它)?

时间:2016-11-25 14:05:00

标签: c# forms winforms

在你得出结论并问“你为什么不只是Hide()表格之前?”让我解释一下。

我有以下内容:

  1. PDF查看器控件PDFViewer
  2. 包含TextBox TextBoxForm
  3. 的表单
  4. 包含PDFViewerTextBoxForm的父表单(Owner属性设置为此父级)。
  5. TextBoxFormPDFViewer的叠加层,应该在超出PDFViewer范围时隐藏,如果用户滚动则可能会发生这种情况。以下是我实现这一目标的方法:

    PDFViewer_OnScroll(object sender, HandledMouseEventArgs e){
        TextBoxForm.SetBounds(GetBounds(PDFViewer));
        TextBoxForm.Top = [some value];
    }
    

    ÌnsideTextBoxForm我执行以下操作:

        protected override void OnMove(EventArgs e)
        {
            base.OnMove(e);
            UpdateFormRegion(); // Offset bounds so it's relative to the form itself instead of the screen
            Invalidate();
        }
    

    TextBoxForm完全或部分位于PDFViewer的范围内时,此方法正常工作,但只要它完全移到外部,TextBoxForm之前呈现的任何部分仍将呈现(我认为这是因为Windows决定不需要重新绘制表单,当它不在自己的范围内时)。

    检查发生这种情况很容易,但我不想拨打TextBoxForm.Hide()的原因是因为这会导致TextBox失去焦点。

    任何方式我都可以隐藏窗体而不会失去焦点?

1 个答案:

答案 0 :(得分:0)

我只是想到了一个可能的解决方案(不是非常优雅的解决方案):

Contacts.FirstName + " " + Contacts.LastName

基本上,无论何时移动/调整表单,我都会检查它是否完全在提供的范围之外,如果为真,则将其移出屏幕。

仍然欢迎不那么“hacky”的解决方案。