1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Thư Viện Đồ Họa GDI Lập Trình Windows P2

55 379 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 55
Dung lượng 1,71 MB

Nội dung

Đại Học Sư Phạm Tp Hồ Chí Minh Khoa Toán – Tin Học LẬP TRÌNH WINDOWS Thư viện đồ họa GDI (Graphics Device Interface) Lập trình đồ họa với thư viện GDI Trần Ngọc Bảo Email: tnbao.dhsp@gmail.com NỘI DUNG ™ Giới thiệu ™ Device Context ™ Các đối tượngGDI ™ Quan hệ đối tượng GDI, handle Class MFC ™ Optaining DC ™ Sử dụng DC với đối tượng GDI ™ Draw Mode ™ Xử lý kiện OnDraw Tran Ngoc Bao Dai hoc Su Pham TP.HCM Device Context - DC ™ Device context ™ DC đối tượng Windows lưu trữ thông tin chi tiết phần cứng ™ GDI cho phép sử dụng tọa độ logic hệ thống màu RGB ™ Các đối tượng GDI ™ 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 thiết bị ™ Bitmap (HBITMAP): sử dụng để quản lý hình ảnh ™ Region ( HRGN): quản lý vùng đối tượng không tắc Tran Ngoc Bao Dai hoc Su Pham TP.HCM Quan hệ GDI, handle 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 Tran Ngoc Bao Dai hoc Su Pham TP.HCM Optaining DC ™ Gọi hàm CWnd::GetDC() ™ Khai báo biến CClientDC dc(this), CClientDC sử dụng để vẽ đối tượng vùng Client cửa sổ ™ Khai báo biến CWindowDC dc(this), CWindowDC sử dụng để vẽ đối tượng toàn cửa sổ (client none-client) ™ Trong MFC, sử dụng CView::OnDraw() để vẽ đối tượng, OnDraw tự động call cửa sổ cần Update ™ Nếu biết thông tin, tạo biến DC riêng Tran Ngoc Bao Dai hoc Su Pham TP.HCM Sử dụng DC với đối tượng GDI ™ Các bước thực ™ Tạo DC để vẽ đối tượng ™ Tạo đối tượng GDI tương ứng (Pen, Brush,…) ™ Gán đối tượng GDI cho DC ™ Vẽ đối tượng ™ Gán đối tượng DC cũ (trước chọn đối tượng DC) ™ Hủy đối tượng GDI tạo bước Tran Ngoc Bao Dai hoc Su Pham TP.HCM Draw Mode ™Cú pháp: int CDC::SetR2(nDrawStyle) Toán tử : XOR, AND, OR, NOT Phép toán XOR A XOR B XOR B = A XOR (B XOR B) = A XOR = A A màu gốc, B màu Bảng mô tả mode vẽ R2_xxxx: R2_XORPEN: P ^ O R2_NOTXORPEN: ~ (P ^ O) R2_COPYPEN: ~ O, màu Pen R2_NOTCOPYPEN: ~ P ngược với màu P Trong P màu vẽ, O màu gốc, B màu đen, W màu trắng NOT : ~, AND &, OR |, XOR ^ Tran Ngoc Bao Dai hoc Su Pham TP.HCM Pen - Bút vẽ ™ Tạo bút vẽ BOOL CPen::CreatePen(int nPenStyle, int nWidth, COLORREF color) nPenStyle: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_ DASHDOTDOT, PS_NULL,… nWidth: độ dày nét, style PS_SOLID độ dày vượt color: màu nét vẽ, sử dụng Macro RGB() Tran Ngoc Bao Dai hoc Su Pham TP.HCM Sử dụng bút vẽ để vẽ đường thẳng ™ Yêu cầu: - Click chuột trái lên vùng Client chọn điểm bắt đầu P1 Æ MouseDown - Giữ chuột di chuyển đến điểm cuối P2 - Bỏ click chuột Æ MouseUp - Vẽ đường thẳng từ vị trí P1 đến P2 ™ Xử lý kiện MouseDown void CGUISampleView::OnLButtonDown(UINT nFlags, CPoint point) { m_ptStart = point; CView::OnLButtonDown(nFlags, point); } Tran Ngoc Bao Dai hoc Su Pham TP.HCM Sử dụng bút vẽ để vẽ đường thẳng ™ Xử lý kiện MouseUp void 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); } Tran Ngoc Bao 10 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 41 Dai hoc Su Pham TP.HCM XỬ LÝ FONT ™ Tạo Font ™ Cấu trúc LOGFONT ™ Tạo Font ™ Lấy Font hành DC ™ Chọn Font từ hộp thoại Font (FontDialog) ™ Hiển thị văn với Font khác Tran Ngoc Bao 42 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 43 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 44 Dai hoc Su Pham TP.HCM CẤU TRÚC LOGFONT ™ lfEscapement SAMPLE 300 Tran Ngoc Bao 900 lfEscapement = 300 lfEscapement = 900 45 Dai hoc Su Pham TP.HCM LẤY FONT HIỆN HÀNH TRONG DC ™ Cú pháp CFont* CDC::GetCurrentFont(); ™ 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 46 Dai hoc Su Pham TP.HCM CHỌN FONT TỪ HỘP THOẠI CFontDialog ™ CFontDialog Tran Ngoc Bao 47 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 48 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 49 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 50 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 51 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 52 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 53 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 54 Dai hoc Su Pham TP.HCM Tran Ngoc Bao 55 Dai hoc Su Pham TP.HCM [...]... 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(); } Tran Ngoc Bao 15 Dai hoc Su Pham TP.HCM Các đối tượng GDI khác ™ Các đối... Pham TP.HCM Sử dụng bút vẽ để vẽ hình chữ nhật ™ Yêu cầu: - Click chuột trái lên vùng Client chọn điểm bắt đầu P1 Æ MouseDown - Giữ chuột và di chuyển đến điểm cuối P2 - Bỏ click chuột Æ MouseUp - Vẽ hình chữ nhật từ điểm P1 (left,top) đến P2 (right, bottom) ™ Xử lý sự kiện MouseDown void CGUISampleView::OnLButtonDown(UINT nFlags, CPoint point) { m_ptStart = point; CView::OnLButtonDown(nFlags, point);... *ptrPenOld; int nMode; //Tạo bút vẽ pen.CreatePen(PS_SOLID,1,RGB(255,0,0)); ptrPenOld = pDC->SelectObject(&pen); //Set Mode vẽ nMode = pDC->SetROP2(R2_COPYPEN); //Vẽ đường thẳng pDC->MoveTo(m_ptStart); pDC->dc.LineTo(m_ptEnd); //Giải phóng bút vẽ pDC->SetROP2(nMode);//Set lại mode cũ pDC->SelectObject(ptrPenOld); } Tran Ngoc Bao 12 Dai hoc Su Pham TP.HCM Brush - Chổi tô ™ Tạo Brush BOOL CBrush::CreateSolidBrush(COLORREF... 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(); } Tran Ngoc Bao 18 Dai hoc Su Pham TP.HCM RoundRect... 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 21 Dai hoc Su Pham TP.HCM PIE (tt) Tran Ngoc... 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 29 Dai hoc Su Pham TP.HCM Polygon (tt) Tran Ngoc Bao 30 Dai hoc Su Pham TP.HCM Curve... 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 32 Dai hoc Su Pham TP.HCM Curve Tran Ngoc Bao 33 Dai hoc Su Pham TP.HCM Curve void CDrawingView::OnPOLYGON()... 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 34 Dai hoc Su Pham TP.HCM Curve Tran Ngoc Bao 35 Dai hoc Su Pham TP.HCM FloodFill ™ Cú pháp BOOL CDC::FloodFill(int ... pen.CreatePen(PS_SOLID,1,RGB(255,0,0)); ptrPenOld = pDC->SelectObject(&pen); //Set Mode vẽ nMode = pDC->SetROP2(R2_COPYPEN); //Vẽ đường thẳng pDC->MoveTo(m_ptStart); pDC->dc.LineTo(m_ptEnd); //Giải phóng bút vẽ pDC->SetROP2(nMode);//Set... để vẽ đường thẳng ™ Yêu cầu: - Click chuột trái lên vùng Client chọn điểm bắt đầu P1 Æ MouseDown - Giữ chuột di chuyển đến điểm cuối P2 - Bỏ click chuột Æ MouseUp - Vẽ đường thẳng từ vị trí P1... vẽ hình chữ nhật ™ Yêu cầu: - Click chuột trái lên vùng Client chọn điểm bắt đầu P1 Æ MouseDown - Giữ chuột di chuyển đến điểm cuối P2 - Bỏ click chuột Æ MouseUp - Vẽ hình chữ nhật từ điểm P1

Ngày đăng: 30/10/2015, 18:00

TỪ KHÓA LIÊN QUAN