2011-08-12 14 views
2

テキストファイルから高さと半径の座標を読み取り、ピクチャコントロールウィンドウ上の点のプロットとして表示するダイアログベースのMFCアプリケーションがあります。今、ポイントがプロットされた後、ポイント座標を新しい位置に変更するために、ウィンドウ内の特定の場所にポイントをドラッグアンドドロップできる必要があります。これは私の右クリックボタンでドラッグアンドドロップするだけで完了します。私は、OnRButtonDown()とOnRButtonUp()を使用する必要があるイベントを理解していますが、アプリケーションにドラッグアンドドロップ機能を含める方法として理解できません。あなたの情報については、私はポイントのプロットを行っている、私はちょうどドラッグアンドドロップの実装を理解する必要があります。私のグラフィックのドラッグアンドドロップ機能 - ダイアログベースのMFC

ありがとうございます。

答えて

2

いくつかのこと:OnRButtonDownで

  1. は()、あなたは、ピックアップtrueにRButtonDownフラグをセットしたい箇所を特定する必要があります。
  2. フラグをオンにし、Trueを指定すると、OnMouseMove()のポイントの新しい位置ごとにプロットを動的に描画し、できるだけスムーズに(点滅しないように)描画し、無効にしてから描画を再描画しますある地域
  3. OnRButtonUp()では、フラグをfalseに更新します。

また、あなたはダイアログウィンドウの外にマウスをドラッグして移動する場合のために、あなたのOnRButtonDown()/ OnRButtonUp()にSetCapture/ReleaseCaptureを使用する必要があります。

+0

ありがとうBrandon。本当に助かった。あなたが言ったことを実装した後、それは働いた。 乾杯。 – Neophile

+1

@ Nerds.Dont.Swear大歓迎です、私はそれが助けてくれてうれしいです:-) – BrandonSun

2

CWndまたはCStaticから継承し、自分で絵を描く必要があります。ドラッグが終了したら、描画オブジェクトを自分で移動する必要があります。 Device Context(CDCCClientDC)を使用すると、画像が表示されます。グラフィックオブジェクトを描画するには、CDC::SetROP2などの方法を使用する必要があります。ドラッグ&ドロップ&ため

1

私はこれをどのように動作させるかを考え出しました。つまり、プログラムでこれを実装する方法を知りたい人は、このコードからアイデアを得ることができます。

コード:

void CRangemasterGeneratorDlg::OnRButtonDown(UINT nFlags, CPoint point) 
{ 
    // TODO: Add your message handler code here and/or call default 

    GetCursorPos(&point); 

    int mx = point.x; 
    int my = point.y; 

    float cursR, cursH; 

    cursR = (mx - 312)/7.2;// records the current cursor's radius(x) position 
    cursH = (641 - my)/5.3;// records the current cursor's height(y) position 

    CString Hgt,Rds; 
    Hgt.Format("%.3f",cursH);// Rounding off Height values to 3 decimal places 
    Rds.Format("%.3f",cursR);// Rounding off Radius values to 3 decimal places 

    curR = (float)atof(Rds); 
    curH = (float)atof(Hgt); 

    // I had limits on my grid from 0 - 100 on both x and y-axis 
     if(curR < 0 || curR >100 || curH < 0 || curH > 100) 
     return; 

    SetCapture(); 

    SetCursor(::LoadCursor(NULL, IDC_CROSS)); 

    //snap the point, compare the point with your array and save position on 'y' 
    for(int i=0; i < 100; i++) 
    { 
     if(curH < m_Points[i+1].m_height_point && curH >m_Points[i-1].m_height_point) 
     { 
      curH = m_Points[i].m_height_point; 
      curR = m_Points[i].m_radius_point; 
      y = i; 
     } 
    } 

    CDialog::OnRButtonDown(nFlags, point); 
    UpdateData(false); 
    Invalidate(); 
} 

void CRangemasterGeneratorDlg::OnRButtonUp(UINT nFlags, CPoint point) 
{ 
    // TODO: Add your message handler code here and/or call default 
    ReleaseCapture(); 

    GetCursorPos(&point); 

    int mx1 = point.x; 
    int my1 = point.y; 

    float curR1,curH1; 

    curR1 = (mx1 - 312)/7.2;// records the current cursor's radius(x) position 
    curH1 = (641 - my1)/5.3;// records the current cursor's height(y) position 

    m_Points[y].m_radius_point = curR1; 
    m_Points[y].m_height_point = curH1; 

    Invalidate(); 

    CDialog::OnRButtonUp(nFlags, point); 
    UpdateData(false); 
} 

...

私はこのコードを実行しているし、それは見事にうまく動作します。このコードの変数は、自分のプログラムで使用した変数に関連しています。あなたが理解できない場合は、私に相談してください。

関連する問題