Bài giảng Lập trình Windows - Thư viện đồ họa GDI (Graphics Device Interface)

Các đối tượng GDI

™DC là một đối tượng của Windows lưu trữthông tin chi tiết vềphần cứng.

™GDI cho phép sửdụng tọa độlogic và hệthống màu RGB.

™Device context (HDC)

™Pen (HPEN): sửdụng đểvẽ đường thẳng, đường cong, đường tròn, hcn, ellipse,.

™Brush (HBRUSH): dùng đểtô hình tròn, HCN, Ellipse, polygon,.

™Font (HFONT): sửdụng cho chữ

™Palette (HPALETTE): xửdụng đểquản lý bảng màu của thiết bị

™Bitmap (HBITMAP): sửdụng đểquản lý hình ảnh

™Region ( HRGN): quản lý các vùng đối tượng không chính tắc

pdf55 trang | Chuyên mục: Visual C++ | Chia sẻ: dkS00TYs | Lượt xem: 2035 | Lượt tải: 5download
Tóm tắt nội dung Bài giảng Lập trình Windows - Thư viện đồ họa GDI (Graphics Device Interface), để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
End);
ptStart
lpRect
ptEnd
Tran 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();
}
Tran Ngoc Bao 22 Dai hoc Su Pham TP.HCM
PIE (tt)
Tran Ngoc Bao 23 Dai hoc Su Pham TP.HCM
Polygon
Tran Ngoc Bao 24 Dai hoc Su Pham TP.HCM
Polygon
™Cú pháp
BOOL CDC::Polygon(LPPOINT lpPoints,int nCount);
P[0]
P[1]
P[2]
P[3]
P[4]
P[5]
P[6]
Tran Ngoc Bao 25 Dai hoc Su Pham TP.HCM
Polygon
™Cú pháp
BOOL CDC::Polygon(LPPOINT lpPoints,int nCount);
P[0]
P[1]
P[2]
P[3]
P[4]
P[5]
P[6]
pDC->Polygon(P,7);
Tran Ngoc Bao 26 Dai hoc Su Pham TP.HCM
Polygon (tt)
Tran Ngoc Bao 27 Dai hoc Su Pham TP.HCM
Polygon
™Cú pháp
BOOL CDC::Polygon(LPPOINT lpPoints,int nCount);
P[0]
P[1]
P[2]
P[3]
P[4]
P[5]
P[6]
pDC->Polygon(P,6);
Tran Ngoc Bao 28 Dai hoc Su Pham TP.HCM
Polygon (tt)
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);
}
Tran Ngoc Bao 30 Dai hoc Su Pham TP.HCM
Polygon (tt)
Tran Ngoc Bao 31 Dai hoc Su Pham TP.HCM
Curve
™Cú pháp
BOOL CDC::PolyBezier(LPPOINT lpPoints,int nCount);
Cần ít nhất 4 điểm để vẽ đường cong
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);
}
Tran Ngoc Bao 33 Dai hoc Su Pham TP.HCM
Curve
Tran Ngoc Bao 34 Dai hoc Su Pham TP.HCM
Curve
void CDrawingView::OnPOLYGON() 
{
CClientDC dc(this);
CPoint pts[7];
pts[0] = CPoint(300,20); 
pts[1] = CPoint(550,300); 
pts[2] = CPoint(550,300);
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);
}
Tran Ngoc Bao 35 Dai hoc Su Pham TP.HCM
Curve
Tran Ngoc Bao 36 Dai hoc Su Pham TP.HCM
FloodFill
™Cú pháp
BOOL CDC::FloodFill(int x,int y, COLORREF clrBoder);
(x, y) (x, y)
pDC->FloodFill(x, y,RGB(0,0,255));
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);
}
Tran Ngoc Bao 38 Dai hoc Su Pham TP.HCM
FloodFill (tt)
Tran Ngoc Bao 39 Dai hoc Su Pham TP.HCM
Pattern Brush
™Cú pháp
BOOL CBrush.CreatePatternBrush(CBitmap *bitmap); 
Tran Ngoc Bao 40 Dai hoc Su Pham TP.HCM
Pattern Brush
Tran Ngoc Bao 41 Dai hoc Su Pham TP.HCM
Pattern Brush
void 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();
}
Tran Ngoc Bao 42 Dai hoc Su Pham TP.HCM
XỬ LÝ FONT
™Hiển thị văn bản với các Font khác nhau
™Chọn Font từ hộp thoại Font (FontDialog)
™ Tạo Font
™ Cấu trúc LOGFONT 
™ Tạo Font
™ Lấy Font hiện hành trong DC
Tran Ngoc Bao 43 Dai hoc Su Pham TP.HCM
TẠO ĐỐI TƯỢNG FONT
™ Cú pháp
BOOL 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);
Tran Ngoc Bao 44 Dai hoc Su Pham TP.HCM
CẤU TRÚC LOGFONT
typedef struct tagLOGFONT{
LONG lfHeight; 
LONG lfWidth;
LONG lfEscapement; 
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;
Tran Ngoc Bao 45 Dai hoc Su Pham TP.HCM
CẤU TRÚC LOGFONT
™ lfEscapement
lfEscapement = 300300
S
A
M
P
L
E
lfEscapement = 900900
Tran Ngoc Bao 46 Dai hoc Su Pham TP.HCM
LẤY FONT HIỆN HÀNH TRONG DC
CFont* CDC::GetCurrentFont();
™Cú pháp
™ Ví dụ
CGDIDoc::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;
}
Tran Ngoc Bao 47 Dai hoc Su Pham TP.HCM
CHỌN FONT TỪ HỘP THOẠI CFontDialog
™CFontDialog
Tran Ngoc Bao 48 Dai hoc Su Pham TP.HCM
CHỌN FONT TỪ HỘP THOẠI CFontDialog
void CTNBFontDoc::OnFontSel() 
{
// TODO: Add your command handler code here
CFontDialog dlg;
LOGFONT lf;
if(dlg.DoModal() == IDOK)
{
dlg.GetCurrentFont(&lf);
lf.lfEscapement = 900;
if(m_fontDraw.GetSafeHandle() != NULL)m_fontDraw.DeleteObject();
ASSERT(m_fontDraw.CreateFontIndirect(&lf));
m_colorFont=dlg.GetColor();
UpdateAllViews(NULL);
}
}
Tran Ngoc Bao 49 Dai hoc Su Pham TP.HCM
KHỞI TẠO HỘP THOẠI CFontDialog
void CCDBDoc::OnFontdialogboxInitialize()
{
LOGFONT lf; CFontDialog dlg; CString szStr; COLORREF color;
memset(&lf, 0, sizeof(LOGFONT));
lf.lfItalic=TRUE;
lf.lfUnderline=TRUE;
lf.lfStrikeOut=TRUE;
lf.lfWeight=FW_BOLD;
strcpy(lf.lfFaceName, "Times New Roman");
dlg.m_cf.rgbColors=RGB(255, 255, 0);
dlg.m_cf.Flags|=CF_LIMITSIZE|CF_EFFECTS|CF_INITTOLOGFONTSTRUCT;
dlg.m_cf.nSizeMin=20;
dlg.m_cf.nSizeMax=48;
dlg.m_cf.lpLogFont=&lf;
if(dlg.DoModal() == IDOK)
{
}
}
Tran Ngoc Bao 50 Dai hoc Su Pham TP.HCM
LẤY KẾT QUẢ TỪ HỘP THOẠI 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);
}
}
Tran Ngoc Bao 51 Dai hoc Su Pham TP.HCM
SETFONT CHO EDIT TEXT TỪ KẾT 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;
}
}
Tran Ngoc Bao 52 Dai hoc Su Pham TP.HCM
SET MÀU CHỮ - OnCtlColor 
HBRUSH CSetFontTextBoxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
//m_clrColor = RGB(0,0,255);
if(nCtlColor == CTLCOLOR_EDIT)
{
if(pWnd->GetDlgCtrlID() == IDC_EDIT1)
{
pDC->SetBkColor(RGB(255,0,0));
pDC->SetTextColor(m_clrColor);
}
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
Tran Ngoc Bao 53 Dai hoc Su Pham TP.HCM
SET MÀU CHỮ - OnCtlColor 
™CTLCOLOR_BTN Button control
™CTLCOLOR_DLG Dialog box
™CTLCOLOR_EDIT Edit control
™CTLCOLOR_LISTBOX List-box control
™CTLCOLOR_MSGBOX Message box
™CTLCOLOR_SCROLLBAR Scroll-bar control
™CTLCOLOR_STATIC Static control
Tran Ngoc Bao 54 Dai hoc Su Pham TP.HCM
HIỂN THỊ VĂN BẢN VỚI 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);
}
Tran Ngoc Bao 55 Dai hoc Su Pham TP.HCM

File đính kèm:

  • pdfBài giảng Lập trình Windows - Thư viện đồ họa GDI (Graphics Device Interface).pdf