我有一个基于对话框的MFC应用程序,它从文本文件中读取高度和半径的坐标,并将其显示为图片控制窗口上的点图。现在,在绘制了点之后,我需要能够将一个点拖放到窗口中的任何特定位置,以便让我将点坐标更改为其新位置。所有这一切都应该通过我的右键单击按钮拖放来完成。我确实理解我应该使用的事件是OnRButtonDown()和OnRButtonUp(),但是我无法理解如何在我的应用程序中包含拖放功能。为了您的信息,我已经完成了点的绘制,我只需要了解拖放功能的实现。
提前致谢。
答案 0 :(得分:2)
您需要继承自CWnd
或CStatic
并自行完成绘画。然后在完成拖动时,您需要自己移动绘图对象。使用设备上下文(CDC
,CClientDC
)将会出现。您需要使用CDC::SetROP2
和其他方法绘制图形对象。
答案 1 :(得分:2)
拖拉的几件事情下降:
对于拖动鼠标并将其移出对话框窗口的情况,您可能还需要在OnRButtonDown()/ OnRButtonUp()中使用SetCapture / ReleaseCapture。
答案 2 :(得分: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);
}
...
我运行了这段代码,效果非常好。这段代码中的变量与我在程序中使用的变量有关。万一你不明白,请随时问我。