ボタン上のある位置でカーソルを変えるには?

[戻る]
SE 2007/03/22(木) 15:06:34
はじめまして。行き詰ってしまったのでアドバイスお願いします。

.NET 2005 VC++/CLIで作成しています。

ボタンの右端にカーソルが来たときにカーソルをチェンジしたいのですがボタン左の座
標は取得できたのですが右端の座標が取得できません。
もしよろしければアドバイスお願い致します。

Blue 2007/03/22(木) 15:23:46
>ボタンの右端
とは具体的にどこでしょうか?

>ボタン左の座標は取得できたのですが
はどのようにして取得しているのでしょうか?

SE 2007/03/22(木) 16:17:10
ボタンの右端とはボタンの横の長さの終端値です。座標はプロパティのLocationの値を
取得しています。イメージとしてはボタンの右端に来たときにカーソルを他のカーソル
に変えてボタンを引き伸ばせるようなアプリを作成しています。

Blue 2007/03/22(木) 16:20:40
よくわからないけど、ボタンのSizeプロパティから持ってこれないのでしょうか?

SE 2007/03/22(木) 17:11:07
System::Drawing::Point a;
a = button1->Location::get();

上記にてボタンのX、Yの座標は取得できたのですがこのうちのX座標の値だけを
取得したいのですが方法はありますか?Point::XでX座標の値が取得出きるようなのです
が今一使い方が分かりません。

Blue 2007/03/22(木) 17:23:22
>今一使い方が分かりません。
ヘルプを読みましょう。
http://msdn2.microsoft.com/ja-jp/library/system.drawing.point_members
(VS.80).aspx

>a = button1->Location::get();
::get();
はなくても取得できませんか?


System::Drawing::Point a = button1->Location;

// 左上
int x = a.X; // Pointは値型なので -> では取得できない。
int y = a.Y;

System::Drawing::Size b = button1->Size;

a.Offset(b.Width, b.Height);

// 右下
int xx = a.X;
int yy = a.Y;

SE 2007/03/22(木) 17:27:00
System::Drawing::Point a;
a = button1->Location::get();
int temp= a.X;

すみません。上記で取得出来ました。

SE 2007/03/22(木) 17:34:09
Blueさん

System::Drawing::Point a = button1->Location;

上記でも取得出来ました(^^)

SE 2007/03/22(木) 17:59:19
Locationプロパティだと左上の座標がデフォルトで取得できるのですが右下の座標を取
得したい場合はどのようにしたら良いでしょうか?

Blue 2007/03/22(木) 18:02:54
>右下の座標を取得したい場合
ボタンのSizeプロパティから計算するということは、既に(ソースコードも)書きました
が?

SE 2007/03/22(木) 18:41:12
Blueさん

すみません、サンプルソースありがとうございました。おかげさまで取得出来ました!
あと一息ですので頑張ってみます。

SE 2007/03/26(月) 12:07:41
たびたびすみません・・・。

現在はフォーム上にあるボタンの両端にマウスが来た際にマウスカーソルをチェンジす
る所までは出来ていますがその後にボタンをリサイズする所が上手くいきません。

やりたいのはボタンの端にマウスが来たときにカーソルを「横に伸ばせます」のお知ら
せカーソルに変えてボタンを横に引き伸ばしたいのです。

現在のステータスは

ボタンのマウスムーブイベントで両端の座標を取得し両端の座標がマウスカーソルの座
標と一致した時にカーソルチェンジをしています。ここまでは出来ているのですがその
後のボタンを伸ばす(button->width)をどこのイベントに書いて良いのか分かりませ
ん。マウスアップイベントに記述してしまうとマウス移動中は描画されないため見た目
がおかしくなってしまいます。

似たような描画プログラムを作成したかたよろしければ力を貸してください。

Blue 2007/03/26(月) 12:18:56
マウスダウン/ムーブ/アップを組み合わせてみてはどうでしょうか?

SE 2007/03/26(月) 13:54:58
Blueさん

こんにちは、またお世話になりすみません。

マウスムーブイベント内に

private: System::Void button1_MouseMove(System::Object^  sender, 
System::Windows::Forms::MouseEventArgs^  e) {

//カーソルのX座標を取得する
int ret = e->X;

//ボタンの右端の座標を取得する
System::Drawing::Size a = button1->Size;
int ret1 = a.Width;
             
//ボタンの左端と右端にカーソルがある時にカーソルをチェンジする
if((ret==0)||(ret==ret1-1)){

button1->Cursor = Cursors::SizeWE;

}
else{

button1->Cursor = Cursors::Default;
             
}
             
}

マウスアップイベント内に

private: System::Void button1_MouseUp(System::Object^  sender, 
System::Windows::Forms::MouseEventArgs^  e) {

//カーソルのX座標を取得する
int ret = e->X;
            
//カーソル分ボタンをリサイズする
button1->Width::set(ret);

}

としています。やりたいのはマウスを押しながら横にマウスを動かすとリアルタイムに
ボタンのサイズが変更できるようにしたいのですがドラッグ中のイベントが取得できな
いためマウスアップに記述してしまっています。何か上手い方法はありますでしょう
か?

SE 2007/03/26(月) 15:03:26
[[解決]]
マウスムーブイベント内で上手く出来ました!

いろいろとありがとうございました。

シャノン 2007/03/26(月) 15:06:05
1:マウスムーブ中にカーソル座標がボタンの右端にかかったらカーソルを変える
2:マウスダウン時にカーソル座標がボタンの右端にかかっていたらフラグを立てる
3:フラグが立っている時にマウスが動いたら、ボタンの右端をカーソルのX座標位置
にする
4:フラグが立っている時にマウスボタンが離されたらフラグを解除する

#VB6でスプリッタの実装とかよくやったもんです…

SE 2007/03/26(月) 16:06:08
シャノンさん

アドバイスありがとうございます。おかげさまでリサイズが出来ました。解決済みです
が1つだけ質問があります。現在はコントロールの右側へのリサイズ(右方向に伸ば
す)が出来る状態ですが左側もリサイズ(左方向に伸ばす)したいのですが可能でしょ
うか?コントロールのサイズプロパティのX座標を−4等にするとコントロールが消えて
しまいます。条件式でマイナスだったら左方向にリサイズといったことは出来るのでし
ょうか?

2007/03/28(水) 14:45:52
「右側”の”リサイズ」と「左側”の”リサイズ」って質問?
原点側の場合は、コントロールの原点移動させて、大きさも変えるって処理だけ
どこれは違う?

n 2007/03/28(水) 19:34:22
ボタンのウィンドウスタイルを変えると(WS_THICKFRAMEだかを付加する)
サイズ変更可能になったような気が...
あ、確かボタンの外観が変わってしまったような覚えが。これはダメだ。

ウィンドウメッセージのWM_HITTEST(WM_NCHITTESTの方だっけか)をハンドルして、
マウスカーソルが端に来たらHTLEFTとかHTRIGHTとかを返すようにすれば良かったっけ
か...
確認してないのでダメだったらごめんなさい。

古いスレッドには追加発言できません。