コントロールの移動

[戻る]
nobu 2007/02/14(水) 12:36:26
開発環境は WindowXP VC++2005 MFC SDIです。

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

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


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

ラケサ 2007/02/14(水) 14:26:24
ダイアログ上にボタンを配置して、
ボタンのBN_CLICKEDメッセージで処理をしているからではないでしょうか?

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

bbbb 2007/02/14(水) 14:33:42
ご回答ありがとうございます。
一応、OnLButtonDown等で拾っているのですが・・・うまくいきません。
TAB等でフォーカスが外れるとうまくいくようなのですが・・・

ラケサ 2007/02/14(水) 15:42:18
こんな感じで昔作りました。

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 2007/02/14(水) 15:59:43
なんとか強引に作りました。
ただ、移動中カーソルがコントローラの左隅によってしまうので、
摘んだところで動かすように修正させたいです。



//*****************************************************************
// コントローラの選択解除
//
//
//*****************************************************************
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);
}

ラケサ 2007/02/14(水) 16:14:10
OnLButtonDownイベントでpointと移動するボタンの左下座標の差分をメンバで持ち
描画する時に座標を補正すればよいのではないでしょうか?

ラケサ 2007/02/14(水) 16:16:52
追記

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

bbbb 2007/02/14(水) 16:50:12
少し座標の細工を行ってなんとかできました。
ラケサさん。ありがとうございました

bbbb 2007/02/14(水) 16:50:41
[[解決]]
解決

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