2011-08-17 7 views
0

私は自分自身のMonthCalendarを作成しました(複数のものを選択し、さらに変更を加えました)、DateTimePickerで使用したいと思います。 DateTimePickerを取り、右ボタンをクリックするとカスタムカレンダーが表示されます。簡単な方法はありますか?または、このチュートリアルのように自分自身で作成する必要があります。http://www.techpowerup.com/forums/showthread.php?t=70925 ありがとうC#DateTimePicker change MonthCalendar

+0

あなたはどのようなUI言語を使用していますか? WPF? Silverlight? ASP.net? ASP.net MVC? WinForms? – ForbesLindesay

+0

申し訳ありません、私はそれを追加することを忘れました。それはWinforms –

+0

私は、WinFormsで最初からやり直したいと思っていますが、DateTimePickerが封印されていない場合、視覚的な継承を使用することでやや頭を上げられるかもしれません。 – ForbesLindesay

答えて

1

これは少しハックですが、うまくいくはずです。

まず、OnSizeChangedのボタン、アイコン(アイコン付き)、アイコン(アイコンなし)を確認します。ボタンの大きなボタンに35ピクセルのボタンがある場合、小さなボタンは18ピクセルです。

次に、ウィンドウのメッセージを聞きます。 mousedownが発生した場合は、ユーザーがクリックした場所を確認します。したがって、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を見せて私を助けることができますか?私はthis.Controls.Add(カレンダー)によってそれをやっています。それはdatepickerの小さなテキストボックスです。私はそれが形ではないので、私は実際にその小さなウィンドウにコントロールを追加することです知っているどのように私はちょうどそれrigthを示すことができます –

+0

私はそれがthis.Parent ... –

+0

元のmonthcalendar(neseccary/requiredの場合はフォームの外にもmonthcalendarを表示し、ユーザーが別の場所をクリックした場合は非表示)と同じ動作が必要な場合はコントロールに渡します。 ToolStripDropDownを使用し、ToolStripControlHostでMonthCalendarを追加することができます。他の方法は、グローバルなフックとフォーカスを盗むことなく独自のフォームを作成することです。 – Wowa