拖拽式编程图库的实现主要涉及以下几个步骤:
拖拽前提
确保图形被选中,即`b_select`为真。
确定图形的当前定位点`newpt1`,并根据鼠标移动的距离计算新的定位点`newpt2`,以便于绘制拖拽路径。
计算拖拽路径
计算拖拽过程中图形的外接矩形的左上角点`TopLeftNew`和右下角点`BottomRightNew`,并将它们存储起来。
绘制新图形
使用拖动后的新坐标重新绘制图形。
```cpp
// CDraftView.h
class CDraftView : public CView {
protected:
// create from serialization only
CDraftView();
DECLARE_DYNCREATE(CDraftView)
// Attributes
public:
CDraftDoc* GetDocument();
// Circle properties
CPoint TopLeft;// Circle's top-left corner
CPoint BottomRight;// Circle's bottom-right corner
CPoint newpt1; // Circle's old center point
CPoint newpt2; // Circle's new center point
CPoint TopLeftNew; // New top-left corner of the circle's bounding rectangle
CPoint BottomRightNew; // New bottom-right corner of the circle's bounding rectangle
BOOL b_select; // Whether the circle is selected
// Mouse messages
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnDraw(CDC* pDC);
DECLARE_MESSAGE_MAP()
};
// CDraftView.cpp
BEGIN_MESSAGE_MAP(CDraftView, CView)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_DRAW()
END_MESSAGE_MAP()
CDraftView::CDraftView() : CView(CDraftView::IDD) {
// Initialize member variables
b_select = FALSE;
}
void CDraftView::OnLButtonDown(UINT nFlags, CPoint point) {
// Check if the circle is selected
if (b_select) {
// Get the old center point of the circle
GetClientRect(&TopLeft, &BottomRight);
newpt1 = (TopLeft + BottomRight) / 2;
} else {
// Get the new center point of the circle
newpt1 = point;
b_select = TRUE;
}
// Update the member variables
TopLeftNew = newpt1;
BottomRightNew = newpt1;
// Redraw the view
Invalidate();
}
void CDraftView::OnMouseMove(UINT nFlags, CPoint point) {
if (b_select) {
// Calculate the new center point of the circle
newpt2 = point;
// Update the member variables
TopLeftNew = min(TopLeft, newpt2);
BottomRightNew = max(BottomRight, newpt2);
// Redraw the view
Invalidate();
}
}
void CDraftView::OnLButtonUp(UINT nFlags, CPoint point) {
if (b_select) {
// Reset the selection
b_select = FALSE;
}
}
void CDraftView::OnDraw(CDC* pDC) {
CView::OnDraw(pDC);
if (b_select) {
// Draw the circle with the new bounding rectangle
pDC->Ellipse(TopLeftNew.x - 10, TopLeftNew.y - 10, BottomRightNew.x + 10, BottomRightNew.y + 10);
}
}
```
建议
优化性能:
在拖拽过程中,尽量减少重绘次数,可以通过双缓冲技术来提高性能。
用户反馈:
在拖拽过程中提供视觉反馈,例如显示拖拽路径或高亮显示正在拖拽的图形。
扩展性:
设计