2010-05-20 108 views
2

就像標題所說,我有一個Child窗體被顯示,它的TopLevel屬性設置爲False,我無法點擊它的MaskedTextBox控件包含(爲了把重點放在它上面)。我可以通過在鍵盤上使用TAB來關注它。Windows窗體:無法點擊以將MaskedTextBox聚焦到非頂級窗體

子窗體包含其他常規的TextBox控件,這些我可以單擊來關注沒有問題,雖然它們也表現出一些奇怪的行爲:例如,如果我在文本框中有一個值,並且嘗試拖動單擊從字符串的末尾開始,沒有任何反應。事實上,我無法使用我的鼠標在TextBox的文本內移動光標(儘管它們的鍵盤箭頭鍵可以工作)。

我並不太擔心奇怪的TextBox行爲,但爲什麼我不能通過單擊它來激活我的MaskedTextBox?

下面是顯示窗體的代碼:

Dim newReportForm As New Form 
Dim formName As String 
Dim FullTypeName As String 
Dim FormInstanceType As Type 

formName = TreeView1.SelectedNode.Name 

FullTypeName = Application.ProductName & "." & formName 

FormInstanceType = Type.GetType(FullTypeName, True, True) 

newReportForm = CType(Activator.CreateInstance(FormInstanceType), Form) 
Try 
    newReportForm.Top = CType(SplitContainer1.Panel2.Controls(0), Form).Top + 25 
    newReportForm.Left = CType(SplitContainer1.Panel2.Controls(0), Form).Left + 25 
Catch 
End Try 
newReportForm.TopLevel = False 
newReportForm.Parent = SplitContainer1.Panel2 
newReportForm.BringToFront()     
newReportForm.Show() 

回答

5

我試過了你的代碼,這次得到了很好的repro。正如我在我原來的帖子中提到的,這確實是一個窗口激活問題。你可以在Spy ++中看到這個,注意WM_MOUSEACTIVATE消息。

發生這種情況是因爲您顯示帶有標題欄的窗體。這說服了Windows窗口管理器該窗口可以被激活。這實際上不起作用,它不再是頂級窗口。從標題欄可見,它永遠不會被「窗口激活」顏色繪製。

您將不得不從表單中刪除標題欄。這是最好的,加入這一行代碼完成的:

newReportForm.FormBorderStyle = Windows.Forms.FormBorderStyle.None 

這會變成形式成是從一個用戶控件,否則無法區分控制。您仍然可以通過使用此代碼來代替它:

newReportForm.ControlBox = False 
    newReportForm.Text = "" 

要麼修復解決了鼠標點擊問題。

+0

你是對的,這些建議都解決了這個問題。但它以我們不想要的方式顯示錶單。真的,我們想要做的是在SplitContainer面板中顯示這個表單(modelessley)(這樣表單不能在這個splitcontainer面板之外拖動)。 在這一點上,我相當肯定我們正在以錯誤的方式去解決問題,我們需要調整我們如何顯示錶單。 非常感謝您的全力幫助。 – Overhed 2010-06-21 15:47:35

1

文本框的行爲是同一問題的症狀。有些東西在吞嚥鼠標按下通知。這不是由你的代碼片段解釋。窗體確實會吞下鼠標點擊來激活它們,但這是一次性行爲,並通過將其TopLevel屬性設置爲False而關閉。

剩下的不多。一個候選者是Control.Capture屬性,在MouseDown事件中打開一個按鈕,以便該按鈕可以看到MouseUp事件,而不管鼠標移動的位置。這也是一次性效果。注意在MouseDown事件中設置焦點的控件。

另一種是您的窗體中正在吃WM_LBUTTONDOWN消息的某種IMessageFilter代碼。

+0

感謝您的洞察Hans。 我可以貢獻一下,我將TopLevel設置爲True,並且奇怪的行爲不再存在。我一直無法找到任何可能吞噬事件的處理程序,使用Control.Capture屬性或任何IMessageFilter代碼。不幸的是,我沒有編寫父表單的代碼,所以我可能會錯過一些東西。 如果我發佈父表單的其餘代碼,會有幫助嗎?大概有300條線。 – Overhed 2010-05-20 18:25:00

+0

令人懷疑。使用Spy ++查看點擊進入的位置。 – 2010-05-20 18:28:43

+0

看起來像點擊一直到父窗體。我不是100%確定我在找什麼,但點擊蒙面文本框時觸發的事件似乎與單擊常規文本框時激發的事件匹配(這確實可以正確獲得焦點)。 – Overhed 2010-05-20 19:24:12

2

這是一個悲慘的錯誤,我花了很長時間才發現這個問題。我們正在做與OP完全相同的事情,在拆分容器中顯示一個Form。我的解決方法是將事件處理程序添加到MaskedTextBox中的Click事件:

private void MaskedTextBoxSetFocus(object sender, EventArgs e) 
    { 
     var mtb = (MaskedTextBox)sender; 
     mtb.Focus(); 
    } 

該方法適用於MaskedTextBox中,但我很擔心其他奇怪的行爲,由於這個錯誤,所以我可能會在設置邊框樣式接受的答案。

+1

我們正在做與解決方法完全相同的事情。 但是,我相信你已經注意到,當你關注焦點時,你不能選擇哪個字符來定位你的光標。所以每次點擊時它都會轉到最後一個已知位置。如果您嘗試點擊輸入的文本的不同部分,會很煩人。 – Overhed 2010-06-23 20:10:35