2012-11-23 28 views
0

我一直在嘗試實現一個自定義控件,很像標準的Winform DateTimePicker控件..只需要我的控件以英尺和英寸顯示架構長度值就像9'-6 」 ..控制應該以這種方式工作..編碼自定義控件,如DateTimePicker

  • 單上下旋轉按鈕應該是在控制的右側可見..
  • 控制應該有2子域,一個用於腳和一英寸..領域應該是個人TextBox es與他們自己的邊界..
  • 當沒有值與控件相關聯時,它應該以灰色「指定長度」顯示鬼文字符串。
  • 當單擊控件時,應顯示?' - ?「,如果用戶單擊在不輸入任何長度的情況下,重影文本應該再次顯示。
  • 只有在單擊子域時應該可以選擇..並且上下旋鈕僅改變當前選擇的子域..
  • 英寸子域應增加以3爲單位遞減,並且圍繞其範圍0到11 ..

我認爲所有的功能存在於標準DateTimePicker控制中的某個地方(或可能被覆蓋),除了幽靈文本要求..所以我應該問的是DateTimePicker究竟是如何工作的?我怎樣才能複製它的外觀和行爲..?

我已經在谷歌環顧四周和StackOverflow上很多,但還沒有碰到類似的問題或答案..


編輯01:

我覺得updownbase和MaskedTextBox中的組合可能是我需要處理..但我不知道如何..對於.. maskedtextbox不單擊時選擇子字段..也如何讓updownbase與maskedtextbox當前選定的子字段..

+0

目前還不清楚是什麼你正在嘗試做的,爲什麼你需要複製的DateTimePicker的行爲。 – Neolisk

+0

英制系統測量長度以英尺和英寸..像3.75英尺被寫爲3'-9「..就像datetimepicker顯示日期爲2012/11/24 00:00,你可以點擊任何子字段(年,月份,日期,小時或分鐘),並使用箭頭鍵來修改它..即時通訊尋找代碼顯示3'-9「的控件,其中英尺和英寸子域(3和9)可以點擊和修改方向鍵或spinbutton ..我認爲這是清楚的問題..但如果它仍然沒有我可以進一步闡述.. =) – AweSIM

+2

@AweSIM這是一個非常廣泛的問題,因爲你有多個要求。我能看到的唯一答案就是編寫控制並解釋每一件小事。我認爲這對StackOverlow的問答格式來說太大了。 – BenSwayne

回答

4

我會嘗試發佈一些有希望幫助你開始的信息,即使它沒有直接解決您的所有問題。首先,你可以得到一個免費的dotpeek反編譯器,做CTRL + T,找到DateTimePicker類型並且學習它是如何工作的。準備好看到很多winapi電話。除非您確信自己能夠理解所有內容並重新編寫它以滿足您的需求,否則不要走這條路。

更簡單的方法是創建一個自定義控件。它看起來不太好,但至少你可以讓它工作得更快。例如,創建一個UserControl1,其中包括一個文本框+一個Button:

Public Class UserControl1 
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    Dim frm As New Form2 
    Dim p = frm.PointToScreen(New Point(Me.Left, Me.Bottom)) 
    frm.Location = New Point(Me.ParentForm.Left, Me.ParentForm.Top + 40) + p 
    frm.Show() 
    End Sub 
End Class 

免責聲明:做+ 40是一個糟糕的編碼標準,但是這與座標變換掙扎後,我能想出的最好屏幕/客戶端。如果你找到更好的方法 - 請在評論中提出建議。

總之,在設計時,它看起來像這樣:

enter image description here

Form2是您的彈出,它會關閉,如果丟失焦點,模仿真正的彈出行爲:

Public Class Form2 
    Private Sub Form2_Deactivate(sender As Object, e As System.EventArgs) Handles Me.Deactivate 
    Me.Close() 
    End Sub 
End Class 

在設計時間看起來像這樣(FormBorderStyle =無):

enter image description here

將此控件編譯並放置到主窗體上。運行你的應用程序 - 當你點擊按鈕時,ft/in下拉菜單會出現在你的控制下面。就像任何彈出窗口(包括DateTimePicker)一樣,如果您單擊其他任何地方(使用Deactivate事件使它像這樣工作),它將消失。這裏是一個圖片,來說明其行爲:

enter image description here

現在加驗證,格式化等

+0

這是一個很好的詳細的答案隊友.. =)..但我認爲你錯過了這一點..(正如BenSwayne在他的評論中指出的那樣,這個問題有一個廣泛的範圍)..即時通訊不尋找下拉功能..我可以沒有生活..我期待着瞭解datetimepicker如何實現它的子字段..例如當一個日期顯示爲「2012.11.24」..你可以點擊「11」部分和「11」將被選中。 。那麼你可以使用上下鍵來增加或減少月份..與年和日子字段相同的東西.. – AweSIM

+0

@AweSIM:對不起,然後 - 盡我所能。建議 - 創建一個新問題,您只需描述這部分需求。另外請包含帶註釋的圖片,以便一切都清晰。 – Neolisk