複数スレを立ててすみません。
VC++/CLI
フォームにボタンが1つ張ってありボタンコントロールのダブルクリックイベントを取
得したいのですがどうやら.NET Compact Framework では、ボタンの Windows フォーム
DoubleClick イベントをサポートしていないようです(><)
ボタンのクラスを継承したカスタムのダブルクリック処理を実装したクラスを作成しな
ければならないのでしょうか?
http://msdn2.microsoft.com/ja-jp/library/ms172533(VS.80).aspx
上記のサイトでサンプルソースがあったのですがC#のためCLIでの実装方法が良く分かり
ません(><)クラスについてもっと勉強するべきですが教えていただけたら幸いで
す。宜しくお願いします。
> C#のためCLIでの実装方法が良く分かりません
とりあえず、
> http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200703/07030052.txt
のようにサブクラスを用意すれば、ほぼC#と同じように実装できるはずですけど。
>勉強するべきですが
そうですね。
入門書ぐらいは読まれたほうが良いです。
お勧めは
http://www.cbook24.com/bm_detail.asp?sku=4797336277
です。(私も持っています)
# 私も同じ本を持ってますが、お勧めというかC++/CLIだとあまり有効な対抗馬がない…?
> ほぼC#と同じように実装できるはずですけど。
といったものも、
>public new event EventHandler DoubleClick;
をどう書き換えるのかわからない、、、
>protected new virtual void OnDoubleClick(EventArgs e)
に関しては
protected:
System::Void virtual OnDoubleClick(System::EventArgs^ e) new
でOKだとおもうんだけど。
◎DoubleClickButton.h
#pragma once
ref class DoubleClickButton :
public System::Windows::Forms::Button
{
int previousClick;
public:
DoubleClickButton(void);
event System::EventHandler^ DoubleClick;
protected:
System::Void virtual OnClick(System::EventArgs^ e) override;
System::Void virtual OnDoubleClick(System::EventArgs^ e) new;
};
◎DoubleClickButton.cpp
#include StdAfx.h
#include DoubleClickButton.h
using namespace System::Windows::Forms;
DoubleClickButton::DoubleClickButton(void)
{
this->previousClick = SystemInformation::DoubleClickTime;
}
System::Void DoubleClickButton::OnClick(System::EventArgs^ e)
{
int now = System::Environment::TickCount;
if (now - previousClick <= SystemInformation::DoubleClickTime)
{
//if (this->DoubleClick != nullptr) // C3918
this->DoubleClick(this, System::EventArgs::Empty);
}
this->previousClick = now;
Button::OnClick(e);
}
System::Void DoubleClickButton::OnDoubleClick(System::EventArgs^ e)
{
//if (this->DoubleClick != nullptr) // C3918
this->DoubleClick(this, e);
}
◎Form1.h
#include DoubleClickButton.h
// InitializeComponent
> private: System::Windows::Forms::Button^ button1;
private: DoubleClickButton^ button1;
> this->button1 = (gcnew System::Windows::Forms::Button());
this->button1 = (gcnew DoubleClickButton());
this->button1->DoubleClick += gcnew System::EventHandler(this,
&Form1::button1_DoubleClick);
Void button1_DoubleClick(Object^ sender, EventArgs^ e)
{
MessageBox::Show(L");
}
とりあえずこれで動いているようです。
// C3918
のところはコメントアウトして動かすのが普通なのかわよくわからない。
Blueさん
こんにちは、いつもながらサンプルコードと解説ありがとうございます。おかげさまで
やりたかったことが無事に実現できました。
C#からCLIへのコード変換ですが思っていたより難しいですね・・・。Blueさんお勧めの
本を今朝、購入しました。CLIは参考文献が少ないと聞いていましたので役に立ちそうで
す。もっとメジャーになってくれれば逆引き辞典なるものが出てくるのでしょうけど。
熟読してCLIを極めて行きたいと思います(^^)今後とも宜しくお願いします。