DOBON.NET DOBON.NETプログラミング掲示板過去ログ

MonthCalendarコントロールでダブルクリックを取るには?

環境/言語:[C# VS2003、Framework1.1]
分類:[.NET]

MonthCalendarコントロールでダブルクリックイベントを取りたいのですが、このコントロールにはダブルクリックイベントがありません。
色々調べたところダブルクリックがない場合はクリックイベントが2回起こっているので、最初のクリックと次のクリックとの時間差が数ミリ秒であればダブルクリックとする、という方法を見つけました。
しかしこの方法だとコーディングが今一なので、MonthCalendarコントロールを継承してコントロールを作り、ダブルクリックイベントを取得するような方法を取りたいのですが、DblClickイベントを追加する方法が分かりません。
どなたかお願いします。
お世話になります。

■No15491に返信(ギャツBさんの記事)
地道にやる方法は解りました。
もっと他にいい方法があるのかもしれませんが。

public class MyMonthCalendar : System.Windows.Forms.MonthCalendar
{
  public delegate void OnDoubleClickEvent(EventArgs e);
  public event OnDoubleClickEvent DoubleClickEvent;

  private int m_prevClickTime = 0;
  protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
  {
    base.OnMouseDown (e);
    
    if (this.m_prevClickTime == 0)
    {
      this.m_prevClickTime = System.Environment.TickCount;
      return;
    }
    int nowClickTime = System.Environment.TickCount;
    Console.WriteLine((nowClickTime - this.m_prevClickTime).ToString());
    if ((nowClickTime - this.m_prevClickTime) < 200)
    {
      if (DoubleClickEvent != null) {
        DoubleClickEvent(EventArgs.Empty);
        Console.WriteLine("Raise DoubleClickEvent!");
      }
    }
    this.m_prevClickTime = 0;
  }
}

呼び出し側
private void monthCalendar1_DoubleClickEvent(System.EventArgs e)
{
  Console.WriteLine("Call DoubleClick");
}
なおこ(・∀・)さん、早速ありがとうございます。
確かにこの方法でも取れました。
ですが、私のPCが悪いのか認識される場合とされない場合がありました。

色々調べてみたんですが、VB6.0のMonthViewコントロールはIEのAPIを使って作られているらしく、おそらくMonthCalendarも同じではないかと推察しました。

それでAPIを使って新しくコントロールを作るいう選択肢も出来ました。
ですが、やはり自分の知識不足のため、こちらもイベントの取り方が
分かりません。どうかお願いします。
一人で騒いでいるようですいません。
MonthCalendarを継承して新しくコントロールを作り、WndProcメソッドをオーバーライドして、そこのダブルクリックメッセージを取得ということは可能でしょうか?
コールバックを使ったことがないので、詳しく分からないのですが今から少し調べてやってみるつもりですが、ご存知の方いらっしゃいましたらお願いします。
お世話になります。

■No15507に返信(ギャツBさんの記事)
> MonthCalendarを継承して新しくコントロールを作り、WndProcメソッドをオーバーライドして、そこのダブルクリックメッセージを取得ということは可能でしょうか?

やってみたんですが、拾えないですねー。
やり方間違ってるのかなぁ...。

public class MyMonthCalendar : System.Windows.Forms.MonthCalendar
{
  public delegate void OnDoubleClickEvent(EventArgs e);
  public event OnDoubleClickEvent DoubleClickEvent;

  private const int WM_LBUTTONDBLCLK = 0x0203;
  protected override void WndProc(ref System.Windows.Forms.Message m)
  {
    if (m.Msg == WM_LBUTTONDBLCLK)
    {
      if (DoubleClickEvent != null)
      {
        DoubleClickEvent(EventArgs.Empty);
        Console.WriteLine("Raise DoubleClickEvent!");
      }
    }
    base.WndProc (ref m);
  }
}
>>MonthCalendarを継承して新しくコントロールを作り、WndProcメソッドをオーバーライドして、そこのダブルクリックメッセージを取得ということは可能でしょうか?
>
> やってみたんですが、拾えないですねー。

適当に言ってみますが、内側にあるコントロール(ウィンドウ)が対象となるのでは。
> 適当に言ってみますが、内側にあるコントロール(ウィンドウ)が対象となるのでは。

となると、やはりAPIを使ってカレンダーを作るしかないようですね。
しかしその際のイベントの記述の仕方が分からないし・・・という堂々巡りになりますね。
下に示した記事では、MouseDownとDateSelectedを使って判断しているようです。これではどうでしょうか?

http://groups.google.co.jp/group/microsoft.public.de.german.entwickler.dotnet.vb/msg/ed6a29ad25962287

http://groups.google.co.jp/group/microsoft.public.dotnet.framework.windowsforms/msg/701f442f376022d9
■No15519に返信(管理人さんの記事)
> 下に示した記事では、MouseDownとDateSelectedを使って判断しているようです。
なるほど、その手もありますか。
出来るかどうかわからない事よりも、手持ちの材料で何とかするというのも大事ですね。
この方法で代用したいと思います。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板