You are on page 1of 58

i Hc S Phm Tp.

H Ch Minh Khoa Ton Tin Hc

LP TRNH WINDOWS

Th vin ha GDI
(Graphics Device Interface)

Lp trnh ha vi th vin GDI


Trn Ngc Bo Email: tnbao.dhsp@gmail.com

TM HIU NG DNG PAINT


V cc i tng trong GDI
Line Rectangle Circle

Chn i tng Di chuyn i tng Lu tr cc i tng

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

TM HIU NG DNG PAINT


V cc i tng trong GDI
Line Rectangle Circle

Chn i tng Di chuyn i tng Lu tr cc i tng

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

V I TNG

Demo chuong trinh Paint

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

TM HIU NG DNG PAINT


V cc i tng trong GDI
Line Rectangle Circle

Chn i tng Di chuyn i tng Lu tr cc i tng

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

CHN I TNG

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

CHN I TNG - NG THNG


V mt ton hc
- on thng c to bi 2 im P(xP,yP),Q(xQ,yQ) - Gi M(xM, yM) l v tr ca chut

P(xP,yP)

P(xP,yP) M(xM,yM)

Q(xQ,yQ)

Q(xQ,yQ)

Chn ng thng tng ng vi vic di chuyn chut v click ln ng thng PQ Ta M ca chut nm trn ng thng PQ hay M PQ

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

CHN I TNG - NG THNG


V mt ton hc
- Phng trnh chnh tc ng thng PQ

x xP y yP = x P xQ y P y Q
Ax + By + C = 0 A = yP yQ B = xQ xP C = xP*yQ xQ*yP

Tran Ngoc Bao

Dai hoc Su Pham TP.HCM

CHN I TNG - NG THNG


V mt ton hc
- Phng trnh chnh tc ng thng PQ

P M Q

Ax + By + C = 0 (d) A = yP yQ B = xQ xP C = xP*yQ xQ*yP

Ta M ca chut nm trn ng thng PQ hay M PQ Khong cch t M n PQ bng 0

Ax M + By M + C A2 + B 2
Tran Ngoc Bao

=0

Dai hoc Su Pham TP.HCM

CHN I TNG - NG THNG


V mt ton hc
- M thuc on PQ M tha 3 iu kin sau

x P xM x Q y P yM y Q
Ax M + By M + C
Q M

A2 + B 2

=0

Vi Ax + By + C = 0 (d) l phng trnh ng thng qua 2 im PQ

Tran Ngoc Bao

10

Dai hoc Su Pham TP.HCM

CHN I TNG - NG THNG


Ci t chng trnh
- M thuc on PQ M tha 3 iu kin sau

P M Q P

xmin xM xmax ymin yM ymax


Ax M + By M + C A2 + B 2
=0

M Q
Tran Ngoc Bao

Vi - Ax + By + C = 0 (d) l phng trnh ng thng qua 2 im PQ - xmin = min(xP,xQ), xmax = max(xP,xQ) - ymin = min(yP,yQ), ymax = max(yP,yQ)

11

Dai hoc Su Pham TP.HCM

CHN NG THNG - DEMO


H s A, B, C ca phng trnh ng thng PQ void CGDISampleView::LineEquation(CPoint point1, CPoint point2,long &A, long &B, long &C) { Ax + By + C = 0 (d) A = Q.y - P.y; A = yP yQ B = P.x - Q.x; B = xQ xP C = (long)P.y*Q.x - (long)P.x*Q.y; C = xP*yQ xQ*yP } Khong cch t im M n ng thng PQ int CGDISampleView::LineDistance(CPoint M, CPoint P, CPoint Q) { long A,B,C; M LineEquation(P,Q,A,B,C); double kc = abs(A*M.x+B*M.y+C)/sqrt(A*A+B*B); 2 return int(kc); }

Ax + By M + C A + B2

=0

Tran Ngoc Bao

12

Dai hoc Su Pham TP.HCM

CHN NG THNG - DEMO


Kim tra iu kin M PQ BOOL CGDISampleView::Between(CPoint M, CPoint P, CPoint Q) { const constDist = 5; int x1,y1,x2,y2; x2 = max(P.x,Q.x) + constDist; x1 = min(P.x,Q.x); y2 = max(P.y,Q.y) + constDist; y1 = min(P.y,Q.y); if ((M.x<=x2)&&(M.x>=x1)&&(M.y<=y2)&&(M.y>=y1)) return true; return false; }

xmin xM xmax ymin yM ymax


Tran Ngoc Bao

Vi - xmin = min(xP,xQ), xmax = max(xP,xQ) - ymin = min(yP,yQ), ymax = max(yP,yQ)

13

Dai hoc Su Pham TP.HCM

CHN NG THNG - DEMO


Kim tra im M PQ
BOOL CGDISampleView::ContainsInBorder(CPoint M, CPoint P, CPoint Q) { const constDist = 5; if ((Between(M,P,Q)) && (LineDistance(M,P,Q)<=constDist)) return true; return false; }

P M Q Q

xmin xM xmax ymin yM ymax


Ax M + By M + C A2 + B 2
=0

Tran Ngoc Bao

14

Dai hoc Su Pham TP.HCM

CHN NG THNG - DEMO

V hnh ch nht ti im P

V hnh ch nht ti im Q

Tran Ngoc Bao

15

Dai hoc Su Pham TP.HCM

CHN NG THNG - DEMO


void CGDISampleView::ShowSelectedLine(CPoint point) { CClientDC dc(this); CRect *ptrRect; const WIDTH = 4; int nOldMode = dc.SetROP2(R2_NOTXORPEN); CGdiObject *pOldBrush = dc.SelectStockObject(NULL_BRUSH); //Ve 2 dau cua diem chon CPoint p1,p2; p1 = ptrRect->TopLeft(); p2 = ptrRect->BottomRight(); dc.Rectangle(p1.x-WIDTH,p1.y-WIDTH,p1.x+WIDTH,p1.y+WIDTH); dc.Rectangle(p2.x-WIDTH,p2.y-WIDTH,p2.x+WIDTH,p2.y+WIDTH); dc.SelectObject(pOldBrush); dc.SetROP2(nOldMode); dc.MoveTo(ptrRect->TopLeft()); dc.LineTo(ptrRect->BottomRight()); }
Tran Ngoc Bao 16 Dai hoc Su Pham TP.HCM

CHN HNH CH NHT RNG

Tran Ngoc Bao

17

Dai hoc Su Pham TP.HCM

CHN HNH CH NHT RNG


V mt ton hc
A M B A C B M

D
- Kim tra im M AB - Kim tra im M BC - Kim tra im M CD - Kim tra im M DA

Tran Ngoc Bao

18

Dai hoc Su Pham TP.HCM

CHN HNH TRN


V mt ton hc
Phng trnh ng trn (C) tm O bn knh R

M(XM,YM)

(x - xo)2 + (y yo)2 = R2 (c)


R
M thuc ng trn (C)

O(XO,YO)

ta im M(xM,yM) tha phng trnh (C)

(xM - xo)2 + (yM yo)2 = R2 (c)

Tran Ngoc Bao

19

Dai hoc Su Pham TP.HCM

CHN HNH TRN


Ci t chng trnh
Phng trnh ng trn (C) tm O bn knh R

M(XM,YM)

(x - xo)2 + (y yo)2 = R2 (c)


R
M thuc ng trn (C)

O(XO,YO)

ta im M(xM,yM) tha phng trnh (C)

R2 - (xM - xo)2 + (yM yo)2 R2 +

Tran Ngoc Bao

20

Dai hoc Su Pham TP.HCM

CHN HNH CH NHT C T MU


A B B

A M C

C D

xA x M x C yA y M y C

Lm th no xc nh c im M nm trong HCN ny hay khng ?

Tran Ngoc Bao

21

Dai hoc Su Pham TP.HCM

CHN HNH TRN C T MU

Phng trnh ng trn (C) tm O bn knh R

M(XM,YM) R

(x - xo)2 + (y yo)2 = R2 (c)


M thuc ng trn (C)

O(XO,YO)

ta im M(xM,yM) tha phng trnh (C)

(xM - xo)2 + (yM yo)2 < R2 (c)

Tran Ngoc Bao

22

Dai hoc Su Pham TP.HCM

CHN HNH TRN C T MU


Ci t chng trnh
Phng trnh ng trn (C) tm O bn knh R

M(XM,YM)

(x - xo)2 + (y yo)2 = R2 (c)


R
M thuc ng trn (C)

O(XO,YO)

ta im M(xM,yM) tha phng trnh (C)

(xM - xo)2 + (yM yo)2 R2 +

Tran Ngoc Bao

23

Dai hoc Su Pham TP.HCM

CHN A GIC BT K C T MU
M M

M M

M a gic li a gic lm

Tran Ngoc Bao

24

Dai hoc Su Pham TP.HCM

CHN A GIC BT K C T MU
C 1 giao im C 2 giao im

C 1 giao im

C 2 giao im

a gic li

- iu kin M nm trong a gic ? - iu kin M nm ngoi a gic ?

Tran Ngoc Bao

25

Dai hoc Su Pham TP.HCM

CHN A GIC BT K C T MU
K C 1 giao im M M M
C 0 giao im - iu kin M nm trong a gic C 4 giao im ? - iu kin M nm ngoi a gic ? C 4 giao im

M M a gic lm M
C 3 giao im C 0 giao im

Tran Ngoc Bao

26

Dai hoc Su Pham TP.HCM

CHN A GIC BT K C T MU
M

M M

- iu kin M nm trong a gic s giao im ca ng thng k t M n cc cnh ca a gi l mt s l: 1, 3, 5,.. - iu kin M nm ngoi a gic s giao im ca ng thng k t M n cc cnh ca a gi l mt s chn: 0, 2, 4,
Tran Ngoc Bao 27 Dai hoc Su Pham TP.HCM

XC NH GIAO IM GIA 2 NG THNG

Giao im ca (d1) v (d2) l nghim ca h phng trnh

(d1): A1x + B1y + C1 = 0 (d2): A2x + B2y + C2 = 0

Tran Ngoc Bao

28

Dai hoc Su Pham TP.HCM

TM HIU NG DNG PAINT


V cc i tng trong GDI
Line Rectangle Circle

Chn i tng Di chuyn i tng Lu tr cc i tng

Tran Ngoc Bao

29

Dai hoc Su Pham TP.HCM

DI CHUYN I TNG - NG THNG


A A

B B

Di chuyn ng thng AB thc cht l php tnh tin 2 im AB: A A B


Tran Ngoc Bao

B
30 Dai hoc Su Pham TP.HCM

DI CHUYN I TNG PHP TNH TIN


A(xA,yA)

xA = xA + dx
dy A(xA,yA) dx
void TRANSLATION(CPoint &Destination,CPoint Source,int dx,int dy) { Destination.x=Source.x+dx; Destination.y=Source.y+dy; }

yA = yA + dy

Tran Ngoc Bao

31

Dai hoc Su Pham TP.HCM

DI CHUYN I TNG - NG THNG


void CGDISampleView::MoveSelectedObject(CPoint point) { CRect *ptrRect; ptrRect = pDoc->GetLine(m_nLineSel); //Xa ng c dc.MoveTo(ptrRect->TopLeft()); dc.LineTo(ptrRect->BottomRight()); //Tnh tin n v tr mi int dx, dy; dx = -m_ptStartSel.x + point.x; dy = -m_ptStartSel.y + point.y; ptrRect->top = ptrRect->top + dy; ptrRect->left = ptrRect->left + dx; ptrRect->bottom = ptrRect->bottom + dy; ptrRect->right = ptrRect->right + dx; //V ng mi dc.MoveTo(ptrRect->TopLeft()); dc.LineTo(ptrRect->BottomRight()); m_ptStartSel = point; }
Tran Ngoc Bao 32 Dai hoc Su Pham TP.HCM

DI CHUYN I TNG - NG TRN

O(x,yo O(xoo,y)o)

Di chuyn ng trn tm O bn knh R thc cht l tnh tin tm O n v tr O

Tran Ngoc Bao

33

Dai hoc Su Pham TP.HCM

DI CHUYN I TNG
Di chuyn hnh ch nht

Di chuyn a gic

Tran Ngoc Bao

34

Dai hoc Su Pham TP.HCM

DI CHUYN I TNG CI T CHNG TRNH

X l s kin MouseDown
- Chn i tng t v tr ca chut - Ly ta im u (ta ca chut)

X l s kin MouseMove
- Tnh tin i tng n v tr hin hnh ca chut - Xa i tng c - V i tng mi

X l s kin MouseUp
- Cp nht cc thuc tnh (ta ) ca i tng - Gi hm Invalidate pht sinh s kin OnDraw

Tran Ngoc Bao

35

Dai hoc Su Pham TP.HCM

TM HIU NG DNG PAINT


V cc i tng trong GDI
Line Rectangle Circle

Chn i tng Di chuyn i tng Lu tr cc i tng

Tran Ngoc Bao

36

Dai hoc Su Pham TP.HCM

QUN L LU TR I TNG
S lp i tng
CShape

CLine

CRectangle

Class CShape : public CObject { }; Class CRectangle : public CShape { }; Class CLine : public CShape { };

Tran Ngoc Bao

37

Dai hoc Su Pham TP.HCM

QUN L LU TR I TNG
Class CGDISampleDoc : public CDocument { CTypedPtrList<CObList, CShape*> m_aSO; void Add(CShape &obj); }; void CGDISampleDoc::Add(CShape &obj) { CShape *temp; obj.DuplicateObject(temp); m_aSO.AddTail(temp); } s dng kiu d liu CTypedPtrList phi thm vo tp tin Stdafx.h th vin sau: #include <afxtempl.h>

Tran Ngoc Bao

38

Dai hoc Su Pham TP.HCM

QUN L LU TR I TNG
void CGDISampleView::OnDraw(CDC* pDC) { CTNBPaintDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
//V cc i tng: Line, Rectange

POSITION pos=pDoc->m_aSO.GetHeadPosition(); while (pos != NULL) { CShape *myobj = pDoc->m_aSO.GetNext(pos); myobj->Show(pDC,R2_COPYPEN); } }

Lm th no myobj gi hm Show tng ng ca tng i tng: CShape, Cline, CRectangle,?

Tran Ngoc Bao

39

Dai hoc Su Pham TP.HCM

LP I TNG CShape
Thuc tnh i tng Shape
class CShape : public CObject { public: BOOL m_bFilled; // Doi tuong co duoc to hay khong int m_nPenWidth; // Be rong cua but ve int m_nPenStyle; // Kieu but ve (SOLID,DOT,DASH,...) COLORREF m_BrushColor; // Mau to COLORREF m_PenColor; // Mau duong bao int m_nPattern; //Pattern cua doi tuong CShape(); virtual ~CShape(); };

Tran Ngoc Bao

40

Dai hoc Su Pham TP.HCM

LP I TNG CShape
Cc hm ca lp CShape
class CShape : public CObject { public: virtual void Draw(CDC * pDC); virtual void DuplicateObject(CShape * & pObj); virtual void Fill(CDC * pDC); public: void Show(CDC * pDC, int nDrawMode); void operator =(CShape &s); CShape(); virtual ~CShape(); };

Tran Ngoc Bao

41

Dai hoc Su Pham TP.HCM

LP I TNG CShape
Cc hm ca lp CShape
void CShape::DuplicateObject(CShape *&pObj) { pObj=new CShape(); pObj->operator=(*this); } void CShape::operator =(CShape & s) { m_BrushColor = s.m_BrushColor; m_bFilled = s.m_bFilled; m_PenColor = s.m_PenColor; m_nPenStyle = s.m_nPenStyle; m_nPenWidth = s.m_nPenWidth; m_nPattern=s.m_nPattern; }

Tran Ngoc Bao

42

Dai hoc Su Pham TP.HCM

LP I TNG CShape
Cc hm ca lp CShape
CShape::CShape() { m_PenColor = RGB(0,0,0); m_BrushColor = RGB(0,128,0); m_nPenStyle = PS_SOLID; m_nPenWidth = 1; m_bFilled = false; m_nPattern=HS_SOLID; }
void CShape::Draw(CDC *pDC) { } void CShape::Fill(CDC *pDC) { }

Tran Ngoc Bao

43

Dai hoc Su Pham TP.HCM

LP I TNG CLine
Cc thnh phn ca lp CLine
class CLine : public CShape { public: CPoint point2; CPoint point1; public: void Draw(CDC * pDC); void operator =(CLine &l); void DuplicateObject(CShape*& pObj); void SetPoint(int nIndex, CPoint p); CLine(); CLine(CPoint p1,CPoint p2); virtual ~CLine(); };

Tran Ngoc Bao

44

Dai hoc Su Pham TP.HCM

LP I TNG CLine
Cc thnh phn ca lp CLine
CLine::CLine() { m_PenColor = RGB(255,0,0); m_BrushColor = RGB(0,128,0); m_nPenStyle = PS_SOLID; m_nPenWidth = 2; m_bFilled = false; m_nPattern=HS_SOLID; } CLine::CLine(CPoint p1,CPoint p2) { point1 = p1; point2 = p2; }

Tran Ngoc Bao

45

Dai hoc Su Pham TP.HCM

LP I TNG CLine
Cc thnh phn ca lp CLine
void CLine::DuplicateObject(CShape * & pObj) { //Ham tao mot doi tuong moi pObj=new CLine(); ((CLine*)pObj)->operator=(*this); } void CLine::operator =(CLine & l) { CShape::operator =(l); point1=l.point1; point2=l.point2; }
Tran Ngoc Bao 46 Dai hoc Su Pham TP.HCM

LP I TNG CLine
Cc thnh phn ca lp CLine
void CLine::Draw(CDC *pDC) { //Tao mot pen moi CPen newPen(m_nPenStyle,m_nPenWidth,m_PenColor); CPen *pOldPen = pDC->SelectObject(&newPen); //Ve duong thang pDC->MoveTo(point1.x,point1.y); pDC->LineTo(point2.x,point2.y); pDC->SelectObject(pOldPen); }

Tran Ngoc Bao

47

Dai hoc Su Pham TP.HCM

LP I TNG CRectangle
Cc thnh phn ca lp CRectangle
class CRectangle : public CShape { public: CPoint point2; CPoint point1; public: void operator =(CRectangle & l); void DuplicateObject(CShape * & pObj); void Draw(CDC * pDC); void SetPoint(int nIndex, CPoint p); CRectangle(); virtual ~CRectangle(); };
Tran Ngoc Bao 48 Dai hoc Su Pham TP.HCM

LP I TNG CRectangle
Cc thnh phn ca lp CRectangle
void CRectangle::operator =(CRectangle & l) { CShape::operator =(l); point1=l.point1; point2=l.point2; } void CRectangle::DuplicateObject(CShape * & pObj) { //Ham tao mot doi tuong moi pObj=new CRectangle(); ((CRectangle*)pObj)->operator=(*this); }

Tran Ngoc Bao

49

Dai hoc Su Pham TP.HCM

LP I TNG CRectangle
Cc thnh phn ca lp CRectangle
void CRectangle::Draw(CDC * pDC) { CPen newPen(m_nPenStyle,m_nPenWidth,m_PenColor); CPen *pOldPen = pDC->SelectObject(&newPen); //Ve hinh chu nhat pDC->Rectangle(point1.x,point1.y,point2.x,point2.y); pDC->SelectObject(pOldPen); } void CRectangle::Fill(CDC * pDC) { }

Tran Ngoc Bao

50

Dai hoc Su Pham TP.HCM

TO CC I TNG
Class CGDISampleDoc : public CDocument { CTypedPtrList<CObList, CShape*> m_aSO; void Add(CShape &obj); };

To & v ng thng CLine


void CGDISampleView::OnLine() { CGDISampleDoc* pDoc = GetDocument(); CPoint point1(100,100); CPoint point2(200,200); line.SetPoint(1,point1); line.SetPoint(2,point2); pDoc->Add(line); Invalidate(); }

Tran Ngoc Bao

51

Dai hoc Su Pham TP.HCM

TO CC I TNG
Class CGDISampleDoc : public CDocument { CTypedPtrList<CObList, CShape*> m_aSO; void Add(CShape &obj); };

To & v hnh ch nht CRectangle


void CGDISampleView::OnRectangle() { CGDISampleDoc * pDoc = GetDocument(); CPoint point1(300,300); CPoint point2(400,400); rectangle.SetPoint(1,point1); rectangle.SetPoint(2,point2); pDoc->Add(rectangle); Invalidate(); }

Tran Ngoc Bao

52

Dai hoc Su Pham TP.HCM

TM HIU NG DNG PAINT


V cc i tng trong GDI
Line Rectangle Circle

Chn i tng Di chuyn i tng Lu tr cc i tng Cc x l khc


Resize Cut, Copy, Paste
Tran Ngoc Bao 53 Dai hoc Su Pham TP.HCM

Cc thao tc khc - Resize

Tran Ngoc Bao

54

Dai hoc Su Pham TP.HCM

Cc thao tc khc - Resize

Tran Ngoc Bao

55

Dai hoc Su Pham TP.HCM

Cc thao tc khc - Resize

Tran Ngoc Bao

56

Dai hoc Su Pham TP.HCM

Cc thao tc khc - Resize

Tran Ngoc Bao

57

Dai hoc Su Pham TP.HCM

Tran Ngoc Bao

58

Dai hoc Su Pham TP.HCM

You might also like