Đây phần source của em ,em đã sửa lại để cái nét thừa là màu nền và dùng Invalidate() xóa nó đi . Mấy bác coi chỗ nào ko ổn thì nói em biết.
Code:
struct Line
{
CPoint ptTo;
CPoint ptFrom;
COLORREF color;
int penStyle;
int penWidth;
};
typedef struct Line LINE;
Code:
{
..............
//Khai bao
protected:
//{{AFX_MSG(CTrickM_06bView)
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 OnLButtonDblClk(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
LINE m_line;
CPoint m_ptStart;
BOOL m_bIsFirst;
COLORREF m_color;
int m_width;
void DrawLine(CDC *pDC, CPoint P1, CPoint P2);
CPoint m_ptTo;
CPoint m_ptFrom;
CPoint m_ptPre;
BOOL m_bDown;
BOOL m_bMove;
..............
}
Code:
CTrickM_06bView::CTrickM_06bView()//Khoi tao ban da`u
{
// TODO: add construction code here
m_bDown = FALSE;
m_bMove = FALSE;
m_bIsFirst = TRUE;
}
Code:
void CTrickM_06bView::DrawLine(CDC *pDC, CPoint P1, CPoint P2)
{
int nOldMode;
nOldMode = pDC->SetROP2(R2_NOTXORPEN);
pDC->MoveTo(P1);
pDC->LineTo(P2);
pDC->SetROP2(nOldMode);
}
Code:
void CTrickM_06bView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC = GetDC();
m_bDown = TRUE;
CPen Pen;
srand((unsigned)time(NULL));
if(m_bIsFirst)//Neu la` diem da`u tien cua da giac n
{
m_bIsFirst = FALSE;
m_ptStart = point;
m_ptFrom = point;
m_color = RGB(rand() % 256, rand() % 256, rand() % 256);
m_width = rand() % 10;
}
else
{
m_ptFrom = m_ptPre;
}
m_ptTo = point;
Pen.CreatePen(PS_SOLID, m_width, m_color);
pDC->SelectObject(&Pen);
pDC->MoveTo(m_ptFrom);
pDC->LineTo(point);
m_ptPre = m_ptTo;
Pen.DeleteObject();
SetCapture();
CView::OnLButtonDown(nFlags, point);
}
Code:
void CTrickM_06bView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC = GetDC();
if(m_bDown)
{
m_bMove = TRUE;
CPen Pen;
Pen.CreatePen(PS_SOLID, m_width, m_color);
pDC->SelectObject(&Pen);
DrawLine(pDC, m_ptFrom, m_ptTo);//La`m mat' net truoc' do
DrawLine(pDC, m_ptFrom, point);//Ve net tai toa do Move toi'
m_ptTo = point;
m_ptPre = m_ptTo;
}
CView::OnMouseMove(nFlags, point);
}
Code:
void CTrickM_06bView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC = GetDC();
if(m_bMove)
{
m_bMove = FALSE;
}
if(m_bDown)
{
m_bDown = FALSE;
//Sau moi la`n nha chuot thi` luu toa do cac Line
m_line.ptFrom=m_ptFrom;
m_line.ptTo=m_ptTo;
m_line.penWidth=m_width;
m_line.penStyle=PS_SOLID;
m_line.color= m_color;
m_arrayLine.Add(m_line);
}
Invalidate();
::ReleaseCapture();
CView::OnLButtonUp(nFlags, point);
}
Code:
void CTrickM_06bView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC = GetDC();
CPen Pen;
Pen.CreatePen(PS_SOLID, m_width, m_color);
pDC->SelectObject(&Pen);
//Noi' diem da`u va` diem cuoi
pDC->MoveTo(m_ptStart);
pDC->LineTo(point);
//Luu toa do diem cuoi cu`ng cua da giac n
m_line.ptFrom=m_ptFrom;
m_line.ptTo=m_ptTo;
m_arrayLine.Add(m_line);
//Luu lai toa. do. diem da`u tien cua da giac n va`o Mang
m_line.ptFrom=m_ptTo;
m_line.ptTo=m_ptStart;
m_arrayLine.Add(m_line);
m_bDown = FALSE;
m_bMove = FALSE;
m_bIsFirst = TRUE;
Pen.DeleteObject();
CView::OnLButtonDblClk(nFlags, point);
}
Code:
void CTrickM_06bView::OnDraw(CDC* pDC)
{
CTrickM_06bDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//Ve lai cac Line cua cac Da giac'
int size=m_arrayLine.GetSize();
for(int i=0;i<size;i++)
{
CPen Pen;
Pen.CreatePen(m_arrayLine[i].penStyle, m_arrayLine[i].penWidth ,
m_arrayLine[i].color);
pDC->SelectObject(&Pen);
pDC->MoveTo(m_arrayLine[i].ptFrom);
pDC->LineTo(m_arrayLine[i].ptTo);
Pen.DeleteObject();
}
}
Edit:
Okie, coi như em đã sửa xong,trong hàm OnLButtonDown nên là thế này:
Code:
void CTrickM_06bView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC = GetDC();
m_bDown = TRUE;
CPen Pen;
srand((unsigned)time(NULL));
if(m_bIsFirst)//Neu la` diem da`u tien cua da giac n
{
m_bIsFirst = FALSE;
m_ptStart = point;
m_ptFrom = point;
m_color = RGB(rand() % 256, rand() % 256, rand() % 256);
m_width = rand() % 10;
}
else
{
m_ptFrom = m_ptPre;
}
m_ptTo = point;
Pen.CreatePen(PS_SOLID, m_width, m_color);
pDC->SelectObject(&Pen);
//pDC->MoveTo(m_ptFrom);
//pDC->LineTo(point);
DrawLine(pDC,m_ptFrom,point);
m_ptPre = m_ptTo;
Pen.DeleteObject();
SetCapture();
CView::OnLButtonDown(nFlags, point);
}
Cám ơn các bác đã quan tâm. 