2011-08-17 78 views
0

我創建了我自己的MonthCalendar(選擇多個事物和更多更改),我想與DateTimePicker一起使用它。採取DateTimePicker,當點擊右鍵時,它顯示我的自定義日曆。有沒有簡單的方法?或者我應該自己創建一切,如本教程:http://www.techpowerup.com/forums/showthread.php?t=70925 謝謝C#DateTimePicker更改MonthCalendar

+0

什麼UI語言是您使用? WPF? Silverlight的? ASP.net? ASP.net MVC?的WinForms? – ForbesLindesay

+0

對不起,我忘了添加它。它的Winforms –

+0

我的猜測是你會想從頭開始用Winforms,儘管如果DateTimePicker沒有被密封,你可能會通過使用可視化繼承來獲得輕微的開局。 – ForbesLindesay

回答

1

這是一個小黑客,但它應該工作得很好。

首先我們檢查OnSizeChanged我們有什麼按鈕,大(帶圖標)或小(無圖標)。如果它的大按鈕按鈕有一個35像素,小有18像素。

然後我們聽窗口消息。如果發生錯誤,我們會檢查用戶點擊了哪個位置。因此我們將lParam轉換爲X/Y位置。如果X位置在按鈕區域,我們將轉到我們的自定義方法並顯示我們的日曆。在我們從方法返回的方法之後,或者DateTimePicker也會顯示它自己的日曆。

另外,我們重寫ShowUpDown屬性並設置它可瀏覽(false)。但是我們也可以檢查ShowUpDown是否爲true,並讓DateTimePcker在這種情況下處理點擊。

下面是代碼:

class DateTimePickerEX : DateTimePicker { 

    const int WM_MOUSEDOWN = 0x201; 

    int paddingright = 0; 

    protected override void OnSizeChanged(EventArgs e) { 
     base.OnSizeChanged(e); 

     int textwidth = 0; 

     using (Graphics g = this.CreateGraphics()) { 
      textwidth = (int)g.MeasureString(this.Text, this.Font).Width; 
     } 

     if (textwidth > this.Width - 35 - 22) { 
      paddingright = 18; 
     } else { 
      paddingright = 35; 
     } 

    } 

    protected override void WndProc(ref Message m) { 
     if (m.Msg == WM_MOUSEDOWN) { 
      DWORD dw = new DWORD(m.LParam); 
      int x = dw.HI; 
      int y = dw.LO; 

      if (x > this.Width - paddingright) { 
       OnButtonClick(); 
       return; 
      } 
     } 

     base.WndProc(ref m); 
    } 

    [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)] 
    public new bool ShowUpDown { 
     get; 
     set; 
    } 

    private void OnButtonClick() { 
     //----------------------------------- 
     //#### Show your MonthCalendar #### 
     //----------------------------------- 
    } 

    [StructLayout(LayoutKind.Explicit)] 
    struct DWORD { 
     [FieldOffset(0)] 
     public int Word; 
     [FieldOffset(0)] 
     public short HI; 
     [FieldOffset(2)] 
     public short LO; 

     public DWORD(IntPtr word) { 
      this.HI = 0; 
      this.LO = 0; 
      this.Word = (int)word; 
     } 

     public static DWORD Empty { 
      get { 
       return new DWORD() { 
        Word = 0 
       }; 
      } 
     } 
    } 
} 
+0

這是我想要一個可以幫助我顯示monthcalendar嗎?我正在做這個.Controls.Add(日曆);但它是在datepicker中的小文本框。我知道這是因爲它不是窗體,但我真的把控制權添加到那個小窗口,但我怎麼才能顯示它rigth,謝謝 –

+0

我發現它,我希望它應該this.Parent ... –

+0

你不應該添加如果您想要與原始月份日曆相同的行爲(如果neseccary/required需要在表單外部顯示月份日曆,並且如果用戶在其他地方單擊時隱藏),那麼需要控制它。您可以使用ToolStripDropDown並使用ToolStripControlHost添加MonthCalendar。另一種方法是創建一個擁有全局鉤子的自己的形式,而不會偷竊焦點。 – Wowa