Windows Form Bai 5
Transcript of Windows Form Bai 5
-
7/29/2019 Windows Form Bai 5
1/55
i Hc S Phm Tp. H Ch MinhKhoa Ton Tin Hc LP TRNH WINDOWS
Thvin ha GDI(Graphics Device Interface)
Trn Ngc Bo
Email: [email protected]
Lp trnh ha vi thvin GDI
mailto:[email protected]:[email protected] -
7/29/2019 Windows Form Bai 5
2/55
Tran Ngoc Bao 2 Dai hoc Su Pham TP.HCM
NI DUNG
X l skin OnDraw Draw Mode
Gii thiu Device Context
Cc i tngGDI Quan h gia cc i tng GDI, handle v Class MFC
Optaining DC
Sdng DC vi cc i tng GDI
-
7/29/2019 Windows Form Bai 5
3/55
Tran Ngoc Bao 3 Dai hoc Su Pham TP.HCM
Device Context - DC
Device context
Cc i tng GDI
DC l mt i tng ca Windows lu tr thng tin chi tit v phn cng.
GDI cho php s dng ta logic v h thng mu RGB.
Device context (HDC)
Pen (HPEN): s dng vng thng, ng cong, ng trn, hcn, ellipse,..
Brush (HBRUSH): dng t hnh trn, HCN, Ellipse, polygon,..
Font (HFONT): s dng cho ch
Palette (HPALETTE): x dng qun l bng mu ca thit b
Bitmap (HBITMAP): s dng qun l hnh nh
Region ( HRGN): qun l cc vng i tng khng chnh tc
-
7/29/2019 Windows Form Bai 5
4/55
Tran Ngoc Bao 4 Dai hoc Su Pham TP.HCM
Quan h gia GDI, handle v Class MFC
DC (HDC) : CDC, CClientDC, CWindowDC,
Pen (HPEN): CPen
Brush (HBRUSH): CBrush
Font (HFONT): CFont
Palette (HPALETTE): CPalette
Bitmap (HBITMAP): Cbitmap
Region ( HRGN): CRegion
-
7/29/2019 Windows Form Bai 5
5/55
Tran Ngoc Bao 5 Dai hoc Su Pham TP.HCM
Optaining DC
Gi hm CWnd::GetDC()
Khai bo bin CClientDC dc(this), CClientDC c s dng v
cc i tng trong vng Client ca ca s
Khai bo bin CWindowDC dc(this), CWindowDC c s dng
v cc i tng trn ton ca s (client v none-client) Trong MFC, s dng CView::OnDraw() v cc i tng,
OnDraw s tng call khi ca s cn Update
Nu chng ta bit thng tin, chng ta c th to bin DC ring
-
7/29/2019 Windows Form Bai 5
6/55Tran Ngoc Bao 6 Dai hoc Su Pham TP.HCM
Sdng DC vi cc i tng GDI
T
o DC
v
cc
i t
ng To i tng GDI tng ng (Pen, Brush,)
Gn i tng GDI cho DC
Vi tng
Gn i tng DC c (trc khi chn i tng trong DC)
Hy cc i tng GDI to trong bc 2
Cc bc thc hin
-
7/29/2019 Windows Form Bai 5
7/55Tran Ngoc Bao 7 Dai hoc Su Pham TP.HCM
Draw Mode
C php:int CDC::SetR2(nDrawStyle)
Ton t : XOR, AND, OR, NOT
Php ton XOR
A XOR B XOR B = A XOR (B XOR B) = A XOR 0 = A
A l mu gc, B l mu mi
Bng m t mode trong v
R2_xxxx:R2_XORPEN: P ^ O
R2_NOTXORPEN: ~ (P ^ O)
R2_COPYPEN: ~ O, mu ca Pen
R2_NOTCOPYPEN: ~ P ngc vi mu ca P
Trong P mu v, O l mu gc, B mu en, W mu trng
NOT : ~, AND &, OR |, XOR ^.
-
7/29/2019 Windows Form Bai 5
8/55Tran Ngoc Bao 8 Dai hoc Su Pham TP.HCM
Pen - Bt v
To bt v
BOOL CPen::CreatePen(int nPenStyle, int nWidth, COLORREF color)
nPenStyle: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_
DASHDOTDOT, PS_NULL,
nWidth: dy ca nt, nu style PS_SOLID th dy khng th vt qu 1
color: mu ca nt v, s dng Macro RGB()
-
7/29/2019 Windows Form Bai 5
9/55Tran Ngoc Bao 9 Dai hoc Su Pham TP.HCM
Sdng bt v vng thng
X l skin MouseDown
void CGUISampleView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_ptStart = point;
CView::OnLButtonDown(nFlags, point);
}
Yu cu:- Click chut tri ln vng Client chn im bt u P1 MouseDown
- Gi chut v di chuyn n im cui P2
- B click chut MouseUp
- Vng thng t v tr P1 n P2
-
7/29/2019 Windows Form Bai 5
10/55Tran Ngoc Bao 10 Dai hoc Su Pham TP.HCM
Sdng bt v vng thng
X l skin MouseUpvoid CGUISampleView::OnMouseUpINT nFlags, CPoint point)
{
CClientDC dc(this);CPen pen, *ptrPenOld;
int nMode;
pen.CreatePen(PS_DOT,1,RGB(0,0,0));
ptrPenOld = dc.SelectObject(&pen);nMode = dc.SetROP2(R2_XORPEN);dc.MoveTo(m_ptStart);
dc.LineTo(m_ptEnd);
dc.SetROP2(nMode);
dc.SelectObject(ptrPenOld);}
-
7/29/2019 Windows Form Bai 5
11/55Tran Ngoc Bao 11 Dai hoc Su Pham TP.HCM
Xl skin OnDraw
Skin OnDraw xy ra khi:- Hm Invalidate() c gi
- ng dng nhn c thng ip WM_PAINT yu cu v li mn hnh
X l skin OnDraw
- Khi gi hm Invalidate() hay ng dng nhn thng ip WM_PAINT, ton b ni
dung trong mn hnh ng dng s b xa. V vy cn phi v li ton b cc i
tng trn mn hnh
- Trong hm OnDraw: chng ta s thc hin v li ton b cc i tng trn mn
hnh
-
7/29/2019 Windows Form Bai 5
12/55Tran Ngoc Bao 12 Dai hoc Su Pham TP.HCM
Xl skin OnDraw (tt)
void CGUISampleView::OnDraw(CDC* pDC){
CGUISampleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CPen pen, *ptrPenOld;int nMode;
//To bt v
pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
ptrPenOld = pDC->SelectObject(&pen);
//Set Mode v
nMode = pDC->SetROP2(R2_COPYPEN);
//V ng thng
pDC->MoveTo(m_ptStart);
pDC->dc.LineTo(m_ptEnd);//Gii phng bt v
pDC->SetROP2(nMode);//Set li mode c
pDC->SelectObject(ptrPenOld);
}
-
7/29/2019 Windows Form Bai 5
13/55Tran Ngoc Bao 13 Dai hoc Su Pham TP.HCM
Brush - Chi t
To Brush
BOOL CBrush::CreateSolidBrush(COLORREF color)
To chi t c vi mu l Color
BOOL CBrush::CreateHatchBrush(int style, COLORREF color)
To chi t c kiu style vi mu l Color
BOOL CBrush::CreatePatternBrush(Cbitmap *bmp)
To chi t c kiu bitmap
-
7/29/2019 Windows Form Bai 5
14/55Tran Ngoc Bao 14 Dai hoc Su Pham TP.HCM
Sdng bt v v hnh chnht
X l skin MouseDown
void CGUISampleView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_ptStart = point;
CView::OnLButtonDown(nFlags, point);
}
Yu cu:- Click chut tri ln vng Client chn im bt u P1 MouseDown
- Gi chut v di chuyn n im cui P2
- B click chut MouseUp
- V hnh ch nht tim P1 (left,top) n P2 (right, bottom)
-
7/29/2019 Windows Form Bai 5
15/55Tran Ngoc Bao 15 Dai hoc Su Pham TP.HCM
Sdng bt v v hnh chnht
X l skin MouseUpvoid CGUISampleView::OnMouseUpINT nFlags, CPoint point)
{
CClientDC dc(this);
CPen pen, *ptrPenOld;
int nMode;
pen.CreatePen(PS_DOT,1,RGB(0,0,0));
ptrPenOld = dc.SelectObject(&pen);
nMode = dc.SetROP2(R2_XORPEN);
CBrush brush;
CBrush *ptrBrushOld;brush.CreateSolidBrush(RGB(0,255,0));
ptrBrushOld = pDC->SelectObject(&brush);
CRect r(m_ptStart.x,m_ptStart.y, m_ptEnd.x,m_ptEnd.y);
pDC->Rectangle(r);
dc.SetROP2(nMode);//Set lai mode
dc.SelectObject(ptrPenOld);
pDC->SelectObject(ptrBrushOld);
brush.Detach();
}
-
7/29/2019 Windows Form Bai 5
16/55Tran Ngoc Bao 16 Dai hoc Su Pham TP.HCM
Cc i tng GDI khc
Chn v di chuyn i tng
Bitmap
Cc i tng khc RoundRect
Pie
Polygon
Curve
FloodFill Pattern Brush
Font
-
7/29/2019 Windows Form Bai 5
17/55Tran Ngoc Bao 17 Dai hoc Su Pham TP.HCM
RoundRect
C phpBOOL CDC::RoundRect(CRect r,CPoint p);
p.y
p.x
(r.left,r.top)
(r.right,r.bottom)
-
7/29/2019 Windows Form Bai 5
18/55Tran Ngoc Bao 18 Dai hoc Su Pham TP.HCM
RoundRect (tt)
void CDrawingView::DrawFocusRect(CDC *pDC){
CPen pen, *ptrPenOld;
int nMode;
pen.CreatePen(PS_SOLID,1,RGB(255,0,255));
ptrPenOld = pDC->SelectObject(&pen);
CBrush brush;
CBrush *ptrBrushOld;
brush.CreateHatchBrush(HS_DIAGCROSS,RGB(255,255,0));
ptrBrushOld = pDC->SelectObject(&brush);nMode = pDC->SetROP2(R2_COPYPEN);
CRect rect = CRect(5,385,300,535);
pDC->RoundRect(&rect,CPoint(40,10));pDC->SetROP2(nMode);//Set lai mode
pDC->SelectObject(ptrPenOld);pDC->SelectObject(ptrBrushOld);
brush.Detach();
}
-
7/29/2019 Windows Form Bai 5
19/55Tran Ngoc Bao 19 Dai hoc Su Pham TP.HCM
RoundRect (tt)
-
7/29/2019 Windows Form Bai 5
20/55Tran Ngoc Bao 20 Dai hoc Su Pham TP.HCM
PIE
C php
BOOL CDC::Pie(LPCRECT lpRect,CPoint ptStart,CPoint ptEnd);
ptStart
lpRect
ptEnd
-
7/29/2019 Windows Form Bai 5
21/55Tran Ngoc Bao 21 Dai hoc Su Pham TP.HCM
PIE (tt)
void CTNBDrawingView::OnPie(){
CClientDC dc(this);
CPen pen, *ptrPenOld;
int nMode;
pen.CreatePen(PS_SOLID,3,RGB(255,0,255));
ptrPenOld = dc.SelectObject(&pen);
CBrush brush;
CBrush *ptrBrushOld;
brush.CreateHatchBrush(HS_DIAGCROSS,RGB(255,255,0));
ptrBrushOld = dc.SelectObject(&brush);
nMode = dc.SetROP2(R2_COPYPEN);
dc.Pie(CRect(100,50,500,300),CPoint(10,50),CPoint(200,50));dc.SetROP2(nMode);//Set lai mode
dc.SelectObject(ptrPenOld);dc.SelectObject(ptrBrushOld);
brush.Detach();
}
-
7/29/2019 Windows Form Bai 5
22/55Tran Ngoc Bao 22 Dai hoc Su Pham TP.HCM
PIE (tt)
-
7/29/2019 Windows Form Bai 5
23/55
Tran Ngoc Bao 23 Dai hoc Su Pham TP.HCM
Polygon
-
7/29/2019 Windows Form Bai 5
24/55
Tran Ngoc Bao 24 Dai hoc Su Pham TP.HCM
Polygon
C php
BOOL CDC::Polygon(LPPOINT lpPoints,int nCount);
P[0]
P[1]
P[2]
P[3]
P[4]
P[5]
P[6]
-
7/29/2019 Windows Form Bai 5
25/55
Tran Ngoc Bao 25 Dai hoc Su Pham TP.HCM
Polygon
C phpBOOL CDC::Polygon(LPPOINT lpPoints,int nCount);
P[0]
P[1]
P[2]
P[3]P[4]
P[5]
P[6]
pDC->Polygon(P,7);
-
7/29/2019 Windows Form Bai 5
26/55
Tran Ngoc Bao 26 Dai hoc Su Pham TP.HCM
Polygon (tt)
-
7/29/2019 Windows Form Bai 5
27/55
Tran Ngoc Bao 27 Dai hoc Su Pham TP.HCM
Polygon
C phpBOOL CDC::Polygon(LPPOINT lpPoints,int nCount);
P[0]
P[1]
P[2]
P[3]P[4]
P[5]
P[6]
pDC->Polygon(P,6);
-
7/29/2019 Windows Form Bai 5
28/55
-
7/29/2019 Windows Form Bai 5
29/55
Tran Ngoc Bao 29 Dai hoc Su Pham TP.HCM
Polygon (tt)
void CDrawingView::OnPOLYGON(){
CClientDC dc(this);
CPoint pts[7];
pts[0] = CPoint(300,20); pts[1] = CPoint(400,100); pts[2] = CPoint(550,100);
pts[3] = CPoint(550,300); pts[4] = CPoint(50,300); pts[5] = CPoint(50,100);pts[6] = CPoint(200,100);
CPen pen, *ptrPenOld; int nMode;
pen.CreatePen(PS_SOLID,3,RGB(255,0,255));
ptrPenOld = dc.SelectObject(&pen);
CBrush brush, *ptrBrushOld; CBitmap bmp;
brush.CreateHatchBrush(HS_DIAGCROSS,RGB(255,255,0));
ptrBrushOld = dc.SelectObject(&brush);
nMode = dc.SetROP2(R2_COPYPEN);
dc.Polygon(pts,5);
dc.SetROP2(nMode);//Set lai mode
dc.SelectObject(ptrPenOld);
dc.SelectObject(ptrBrushOld);
}
-
7/29/2019 Windows Form Bai 5
30/55
-
7/29/2019 Windows Form Bai 5
31/55
Tran Ngoc Bao 31 Dai hoc Su Pham TP.HCM
Curve
C phpBOOL CDC::PolyBezier(LPPOINT lpPoints,int nCount);
Cn t nht 4 im vng cong
-
7/29/2019 Windows Form Bai 5
32/55
Tran Ngoc Bao 32 Dai hoc Su Pham TP.HCM
Curve
void CDrawingView::OnPOLYGON(){
CClientDC dc(this);
CPoint pts[7];
pts[0] = CPoint(300,20); pts[1] = CPoint(400,100); pts[2] = CPoint(550,100);pts[3] = CPoint(550,300); pts[4] = CPoint(50,300); pts[5] = CPoint(50,100);
pts[6] = CPoint(200,100);
CPen pen, *ptrPenOld; int nMode;
pen.CreatePen(PS_SOLID,3,RGB(255,0,255));
ptrPenOld = dc.SelectObject(&pen);
nMode = dc.SetROP2(R2_COPYPEN);
dc.PolyBezier(pts,4);
dc.SetROP2(nMode);//Set lai mode
dc.SelectObject(ptrPenOld);
}
-
7/29/2019 Windows Form Bai 5
33/55
Tran Ngoc Bao 33 Dai hoc Su Pham TP.HCM
Curve
-
7/29/2019 Windows Form Bai 5
34/55
-
7/29/2019 Windows Form Bai 5
35/55
Tran Ngoc Bao 35 Dai hoc Su Pham TP.HCM
Curve
-
7/29/2019 Windows Form Bai 5
36/55
Tran Ngoc Bao 36 Dai hoc Su Pham TP.HCM
FloodFill
C phpBOOL CDC::FloodFill(int x,int y, COLORREF clrBoder);
(x, y) (x, y)
pDC->FloodFill(x, y,RGB(0,0,255));
-
7/29/2019 Windows Form Bai 5
37/55
Tran Ngoc Bao 37 Dai hoc Su Pham TP.HCM
FloodFill (tt)
void CDrawingView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);CBrush brush;
CBrush *ptrBrushOld;
brush.CreateSolidBrush(RGB(127,127,127));ptrBrushOld = dc.SelectObject(&brush);
dc.FloodFill(point.x,point.y,RGB(255,0,255));
dc.SelectObject(ptrBrushOld);
CView::OnRButtonDown(nFlags, point);
}
-
7/29/2019 Windows Form Bai 5
38/55
-
7/29/2019 Windows Form Bai 5
39/55
-
7/29/2019 Windows Form Bai 5
40/55
P tt B h
-
7/29/2019 Windows Form Bai 5
41/55
Tran Ngoc Bao 41 Dai hoc Su Pham TP.HCM
Pattern Brushvoid CTNBDrawingView::OnPatternFill()
{
CClientDC dc(this);
CPoint pts[7];
CPen pen, *ptrPenOld; int nMode;
pen.CreatePen(PS_SOLID,3,RGB(255,0,255));ptrPenOld = dc.SelectObject(&pen);
CBrush brush, *ptrBrushOld;
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP4);
brush.CreatePatternBrush(&bmp);ptrBrushOld = dc.SelectObject(&brush);
nMode = dc.SetROP2(R2_COPYPEN);
dc.Polygon(pts,6);
dc.SetROP2(nMode);//Set lai mode cu
dc.SelectObject(ptrPenOld);
dc.SelectObject(ptrBrushOld);
brush.Detach();
}
-
7/29/2019 Windows Form Bai 5
42/55
TO I TNG FONT
-
7/29/2019 Windows Form Bai 5
43/55
Tran Ngoc Bao 43 Dai hoc Su Pham TP.HCM
TO I TNG FONT
C phpBOOL CFont::CreateFont
(
int nHeight,
int nWidth,
int nEscapement,
int nOrientation,
int nWeight,
BYTE bItalic,BYTE bUnderline,
BYTE cStrikeOut,
BYTE nCharSet,
BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality,BYTE nPitchAndFamily, LPCTSTR lpszFacename
);
BOOL CFont::CreateFontIndirect(const LOGFONT *lpLogFont);
-
7/29/2019 Windows Form Bai 5
44/55
-
7/29/2019 Windows Form Bai 5
45/55
-
7/29/2019 Windows Form Bai 5
46/55
Tran Ngoc Bao 46 Dai hoc Su Pham TP.HCM
LY FONT HIN HNH TRONG DC
CFont* CDC::GetCurrentFont();
C php
V dCGDIDoc::CGDIDoc()
{
LOGFONT lf;
CClientDC dc(NULL);
CFont *ptrFt;
ptrFt=dc.GetCurrentFont();
ptrFt->GetLogFont(&lf);
ASSERT(m_fontDraw.CreateFontIndirect(&lf));m_colorFont=RGB(0, 0, 0);
m_bTransparentBgd=TRUE;
}
-
7/29/2019 Windows Form Bai 5
47/55
-
7/29/2019 Windows Form Bai 5
48/55
-
7/29/2019 Windows Form Bai 5
49/55
-
7/29/2019 Windows Form Bai 5
50/55
Tran Ngoc Bao 50 Dai hoc Su Pham TP.HCM
LY KT QU THP THOI CFontDialog
void CCDBDoc::OnFontdialogboxInitialize()
{
LOGFONT lf;
CFontDialog dlg; if(dlg.DoModal() == IDOK)
{
color=dlg.GetColor();
szStr.Format("Font Color: R=%d, G=%d, B=%d",
GetRValue(color), GetGValue(color), GetBValue(color));
szStr+="\nFace Name: ";
szStr+=dlg.GetFaceName();
if(dlg.IsItalic() == TRUE)szStr+="\nFont is italic";
if(dlg.IsUnderline() == TRUE)szStr+="\nFont is underlined";
if(dlg.IsStrikeOut() == TRUE)szStr+="\nFont is strike out";
if(dlg.IsBold())szStr+="\nFont is bolded";AfxMessageBox(szStr);
}
}
SETFONT CHO EDIT TEXT T KT QU CF Di l
-
7/29/2019 Windows Form Bai 5
51/55
Tran Ngoc Bao 51 Dai hoc Su Pham TP.HCM
SETFONT CHO EDIT TEXT TKT QU CFontDialog
void CSetFontTextBoxDlg::OnSetfont()
{
CFontDialog dlg; LOGFONT lf; CFont *pFont;
if (dlg.DoModal() == IDOK) {
dlg.GetCurrentFont(&lf);
pFont = new CFont;if(!pFont->CreateFontIndirect(&lf))
{
delete pFont;return;
}
CEdit *myEdit;myEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
myEdit->SetWindowText(lf.lfFaceName);
myEdit->SetFont(pFont);
m_clrColor = dlg.GetColor();
myEdit->RedrawWindow();
if(pFont!=NULL)delete pFont;
}
}
-
7/29/2019 Windows Form Bai 5
52/55
-
7/29/2019 Windows Form Bai 5
53/55
HIN TH VN BN VI CFONT
-
7/29/2019 Windows Form Bai 5
54/55
Tran Ngoc Bao 54 Dai hoc Su Pham TP.HCM
HIN TH VN BN VI CFONT
void CGDIView::OnDraw(CDC* pDC){
CFont *ptrFt; CFont *ptrFtOld; CRect rect; LOGFONT logFont;
CGDIDoc* pDoc=GetDocument(); ASSERT_VALID(pDoc);
ptrFt=pDoc->GetCurrentFont();
ASSERT(ptrFt != NULL);if(ptrFt->GetSafeHandle() != NULL)
{
ptrFt->GetLogFont(&logFont);
ptrFtOld=pDC->SelectObject(ptrFt);
pDC->SetTextColor(pDoc->GetFontColor());
pDC->SetBkMode(pDoc->GetBgdStyle() ? TRANSPARENT:OPAQUE);
pDC->SetBkColor((pDoc->GetFontColor())&0x00FFFFFF);
}
GetClientRect(rect);pDC->TextOut(rect.Width()/4, rect.Height()/4, logFont.lfFaceName);
if(ptrFt->GetSafeHandle() != NULL)pDC->SelectObject(ptrFtOld);
}
-
7/29/2019 Windows Form Bai 5
55/55