如何拖动对话框区域中绘制的圆及直线?请高手指点!加分100
完成代码:1.在对话框区域中绘制了圆形,各圆形之间通过直线连接。
2.圆形及直线的端点位置记录在链表中。
问题:拖动圆形及连接圆的直线的程序如何编写?
祝大家中秋快乐!
[解决办法]
把你的绘制代码(应该有吧)放在OnPaint中;
定义两个对话框的成员变量,一个BOOL值指示鼠标左键是否按下,比如:BOOL m_bLButtonDown;一个CPoint值表示当前点坐标,比如:CPoint m_ptCurrent;
响应鼠标左键按下消息:OnLButtonDown()
m_bLButtonDown = TRUE;
SetCpature();
m_ptCurrent = point;
响应鼠标左键抬起消息:OnLButtonDown()
m_bLButtonDown = TRUE;
ReleaseCapture();
响应鼠标移动消息:OnMouseMove()
if (m_bLButtonDown)
{
CPoint ptOffset(point - m_ptCurrent);
m_ptCurrent = point;
//这里将你链表中所有的图形坐标偏移ptOffset的大小
Invalidate();
}
这种方法实现的界面会闪烁,用双缓冲绘图解决。
[解决办法]
在OnDraw中绘制。
1。有一些绘图函数:
CDC * pDC = GetDC();
pDC-> MoveTo(point)
PDC-> LineTo(point)这个是绘制直线。
pDC-> Ellipse(0,0,200,200)这个就是绘制圆。
可以用一个对象:
2。圆和直线都派生与一个父类,父类必须提供一个绘制方法,然后各子类实现这个方法。
链表中存储这个父类的指针,绘图是调用绘制函数就可以。
[解决办法]
void CDiaDefCut::OnMouseMove(UINT nFlags, CPoint point)
{
if(!m_rectShow.PtInRect(point))
{
m_pView-> m_nCursorType=CURSOR_NULL;
return;
}
m_pShowDC-> StretchBlt(0,0,m_nWidth,m_nHeight,m_pMemDC,0,0,m_lWidth,m_lHeight,SRCCOPY);
bool bRtn=false;
m_pView-> m_nCursorType=CURSOR_VIEW;
m_objRect.m_nDrawType=GRAPH_DRAW;
bRtn=m_objRect.IsMove(point);
//ÒÆ¶¯×´Ì¬
if(bRtn)
{
m_objRect.m_nDrawType=GRAPH_MOVE;
m_pView-> m_nCursorType=CURSOR_MOVE;
SetCursor(m_pView-> m_hMoveCursor);
}
if(nFlags==MK_LBUTTON)
{
int nCurrent=m_objRect.m_nCurrent;
CSize sizeMove;
sizeMove.cx=point.x-m_orgPoint.x;
sizeMove.cy=point.y-m_orgPoint.y;
CRect rect;
rect.left=m_orgRect.left+sizeMove.cx;
rect.right=m_orgRect.right+sizeMove.cx;
rect.top=m_orgRect.top+sizeMove.cy;
rect.bottom=m_orgRect.bottom+sizeMove.cy;
m_objRect.m_aRect[nCurrent]=rect;
m_objRect.DrawAll(m_pShowDC);
CDC *pdc=GetDC();
pdc-> BitBlt(0,0,m_nWidth,m_nHeight,m_pShowDC,0,0,SRCCOPY);
ReleaseDC(pdc);
}
CDialog::OnMouseMove(nFlags, point);
}
我这个是在对话框指定区显示的图像上画几个矩形,树标移到那个图像上按下在左键可以移动该矩形.在BUTTONDOWN中记下按下左键时的坐标
if(m_objRect.IsMove(point))
{
m_objRect.m_nCurrent=m_objRect.GetSelect(point);
m_orgRect=m_objRect.m_aRect[m_objRect.m_nCurrent];
m_orgPoint=point;
}
CDialog::OnLButtonDown(nFlags, point);
这个你只能参考.