開発環境は WindowXP VC++2005 MFC SDIです。
現在、ダイアログ上のコントロールをマウスで左クリックした場合に選択モード
として、ダイアログ上を移動させてたいと思っております。
現状、左クリックして、コントロールを選択して、デバッグしながら(そこのソース
の箇所を追いながら)だと、摘んだ状態になり、マウスに連動して動作するのですが、
デバッグなしであると動作しません。
どうも、左クリックして、フォーカスが一度コントロールから離れてからしか、
うまく動作しないようなのです(左クリックしながら、キーボードのウィンドウ釦を
押下した後ならば、うまく動作します)
このような場合、なにか対象法があるようでしたら、教えて頂けないでしょうか。
宜しくお願い致します。
ダイアログ上にボタンを配置して、
ボタンのBN_CLICKEDメッセージで処理をしているからではないでしょうか?
ボタンの発生クラスを作成し、WM_LBUTTONDOWN、WM_LBUTTONUPメッセージで
処理が出来るような気がします。
ご回答ありがとうございます。
一応、OnLButtonDown等で拾っているのですが・・・うまくいきません。
TAB等でフォーカスが外れるとうまくいくようなのですが・・・
こんな感じで昔作りました。
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);
}
なんとか強引に作りました。
ただ、移動中カーソルがコントローラの左隅によってしまうので、
摘んだところで動かすように修正させたいです。
//**************************************************************
// コントローラの選択解除
//
//
//**************************************************************
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);
}
OnLButtonDownイベントでpointと移動するボタンの左下座標の差分をメンバで持ち
描画する時に座標を補正すればよいのではないでしょうか?
追記
複数移動の場合はCMap等でコントロールIDと座標をセットで覚えさせれば
そんなに難しくないと思います。
少し座標の細工を行ってなんとかできました。
ラケサさん。ありがとうございました
解決