コントロールの移動 – プログラミング – Home

通知
すべてクリア

[解決済] コントロールの移動


nobu
 nobu
(@nobu)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

開発環境は WindowXP VC++2005 MFC SDIです。

現在、ダイアログ上のコントロールをマウスで左クリックした場合に選択モード
として、ダイアログ上を移動させてたいと思っております。

現状、左クリックして、コントロールを選択して、デバッグしながら(そこのソース
の箇所を追いながら)だと、摘んだ状態になり、マウスに連動して動作するのですが、
デバッグなしであると動作しません。
どうも、左クリックして、フォーカスが一度コントロールから離れてからしか、
うまく動作しないようなのです(左クリックしながら、キーボードのウィンドウ釦を
押下した後ならば、うまく動作します)

このような場合、なにか対象法があるようでしたら、教えて頂けないでしょうか。
宜しくお願い致します。


引用未解決
トピックタグ
ラケサ
 ラケサ
(@ラケサ)
ゲスト
結合: 18年前
投稿: 8
 

ダイアログ上にボタンを配置して、
ボタンのBN_CLICKEDメッセージで処理をしているからではないでしょうか?

ボタンの発生クラスを作成し、WM_LBUTTONDOWN、WM_LBUTTONUPメッセージで
処理が出来るような気がします。


返信引用
bbbb
 bbbb
(@bbbb)
ゲスト
結合: 18年前
投稿: 8
 

ご回答ありがとうございます。
一応、OnLButtonDown等で拾っているのですが・・・うまくいきません。
TAB等でフォーカスが外れるとうまくいくようなのですが・・・


返信引用
ラケサ
 ラケサ
(@ラケサ)
ゲスト
結合: 18年前
投稿: 8
 

こんな感じで昔作りました。

void CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
{
// 移動開始
m_bMove = TRUE;

CButton::OnLButtonDown(nFlags, point);
}

void CMyButton::OnLButtonUp(UINT nFlags, CPoint point)
{
// 移動終了
m_bMove = FALSE;
// 実際にコントロールを移動

CButton::OnLButtonUp(nFlags, point);
}

void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{
// 移動中
if (m_bMove) {
// 移動中のコントロールの描画
}
CButton::OnMouseMove(nFlags, point);
}


返信引用
bbbb
 bbbb
(@bbbb)
ゲスト
結合: 18年前
投稿: 8
 

なんとか強引に作りました。
ただ、移動中カーソルがコントローラの左隅によってしまうので、
摘んだところで動かすように修正させたいです。

//**************************************************************
// コントローラの選択解除
//
//
//
**************************************************************
void CMyButton::OnLButtonUp(UINT nFlags, CPoint point)
{
//-----------------------------
// コントローラ非選択中
//-----------------------------

//-----------------------------
// 親ダイアログへの通知
//-----------------------------
ClientToScreen( &point );
GetParent()->ScreenToClient(&point);
((CMainDlg*)m_parentdlg)->OnLButtonUp(nFlags, point);
CButton::OnLButtonUp(nFlags, point);
}
//**************************************************************
// コントローラの選択
//
//
//
**************************************************************
void CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
{
//-----------------------------
// コントローラ選択中
//-----------------------------
((CMainDlg*)m_parentdlg)->SetItemSelect(this,TRUE);

//-----------------------------
// 親ダイアログへの通知
//-----------------------------
((CMainDlg*)m_parentdlg)->OnLButtonDown(2, point);

CButton::OnLButtonDown(nFlags, point);
}
//**************************************************************
//
//
//
//
**************************************************************
void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{

//-----------------------------
// 親ダイアログへの通知
//-----------------------------
CPoint lPoint;
lPoint.x = point.x;
lPoint.y = point.y;

//クライアント座標をスクリーン座標に変換
ClientToScreen( &lPoint );

//親ダイアログにてスクリーン座標からクライアント座標に変換
GetParent()->ScreenToClient(&lPoint);

//移動中の座標に設定する
((CMainDlg*)m_parentdlg)->OnMouseMove(nFlags, lPoint);

CButton::OnMouseMove(nFlags, point);
}

}
//**************************************************************
// [マウス移動]イベント
//
//
//
**************************************************************
void CMainDlg::OnMouseMove(UINT nFlags, CPoint point)
{

//変数定義
long Item_Count;
CRect rect;
S_CONPORNETDATA* p_data;

//初期化処理
Item_Count = 0;

if(m_flag_move == MODE_MOVE)
{
//アイテム数取得
Item_Count = m_Item->GetItemCount();
for(long i = 0; i < Item_Count; i++)
{
//アイテム情報を取得
p_data = m_Item->GetItemInfo(i);

//現在移動対象に選択されている場合
if(p_data->select == TRUE)
{
//移動させる
p_data->pWnd->MoveWindow(point.x,
point.y,

p_data->client_pos.Width(),

p_data->client_pos.Height());
}
}

}
//現在のマウスの座標表示
POINT pt;
GetCursorPos(&pt);
CString Str;
Str.Format(x=%d,y=%d,pt.x,pt.y);
m_debug.SetWindowText(Str);

CDialog::OnMouseMove(nFlags, point);
}


返信引用
ラケサ
 ラケサ
(@ラケサ)
ゲスト
結合: 18年前
投稿: 8
 

OnLButtonDownイベントでpointと移動するボタンの左下座標の差分をメンバで持ち
描画する時に座標を補正すればよいのではないでしょうか?


返信引用
ラケサ
 ラケサ
(@ラケサ)
ゲスト
結合: 18年前
投稿: 8
 

追記

複数移動の場合はCMap等でコントロールIDと座標をセットで覚えさせれば
そんなに難しくないと思います。


返信引用
bbbb
 bbbb
(@bbbb)
ゲスト
結合: 18年前
投稿: 8
 

少し座標の細工を行ってなんとかできました。
ラケサさん。ありがとうございました


返信引用
bbbb
 bbbb
(@bbbb)
ゲスト
結合: 18年前
投稿: 8
 

解決


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました