Функция перетаскивания в моей графике - диалоговое окно MFC - PullRequest
2 голосов
/ 12 августа 2011

У меня есть диалоговое приложение MFC, которое считывает координаты высоты и радиуса из текстового файла и отображает его в виде графика точек в окне управления изображением. Теперь, после того как точки были нанесены на график, я должен иметь возможность перетаскивать точку в любое конкретное место в окне, чтобы координаты точек менялись на новое место. Все это должно быть сделано, перетаскивая это с моей правой кнопкой мыши. Я понимаю, что событие, которое я должен использовать, будет OnRButtonDown () и OnRButtonUp (), но я не могу понять, как включить функцию перетаскивания в моем приложении. К вашему сведению, я сделал построение точек, мне просто нужно понять реализацию функции перетаскивания.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 14 августа 2011

Несколько вещей для перетаскивания:

  1. В OnRButtonDown () вам нужно определить точку, которую вы хотите поднять, установить флаг RButtonDown в true.
  2. Проверитьфлаг и, если true, опубликовать сообщение рисования для динамического рисования графика в соответствии с новой позицией точки в OnMouseMove (), чтобы сделать его как можно более плавным (без мигания), не отменять все, кроме как сделать недействительными и перерисовать определенную область.
  3. В OnRButtonUp () измените флаг на false.

Вам также может понадобиться использовать SetCapture / ReleaseCapture в вашем OnRButtonDown() / OnRButtonUp () для случаев, когда вы перетаскиваете и перемещаете мышь из диалогового окна.

2 голосов
/ 13 августа 2011

Вам нужно унаследовать от CWnd или CStatic и сделать рисование самостоятельно. И затем, когда перетаскивание выполняется, вам нужно переместить объект рисования самостоятельно. Работа с контекстом устройства (CDC, CClientDC) вступит в картину. Вам нужно использовать CDC::SetROP2 и другие методы для рисования графических объектов.

1 голос
/ 15 августа 2011

Я понял, как заставить это работать.Поэтому, если люди хотят знать, как реализовать это в своих программах, можно получить представление из этого кода.

Код:

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);
}

...

Iзапустили этот код, и он прекрасно работает.Переменные в этом коде относятся к тем, которые я использовал в своей программе.Если вы не понимаете, не стесняйтесь спрашивать меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...