LẬP TRÌNH WINDOWS - Thư viện đồ họa GDI(Graphics Device Interface) doc

55 2.4K 2
LẬP TRÌNH WINDOWS - Thư viện đồ họa GDI(Graphics Device Interface) doc

Đ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

Đại Học Sư Phạm Tp Hồ Chí Minh Khoa Tố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 khơng thể vượt q 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 ... //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);... 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... hình - Trong hàm OnDraw: thực vẽ lại toàn đối tượng hình Tran Ngoc Bao 11 Dai hoc Su Pham TP.HCM Xử lý kiện OnDraw (tt) void CGUISampleView::OnDraw(CDC* pDC) { CGUISampleDoc* pDoc = GetDocument();

Ngày đăng: 15/03/2014, 21:20

Từ khóa liên quan

Mục lục

  • Lập trình đồ họa với thư viện GDI

  • NỘI DUNG

  • Device Context - DC

  • Quan hệ giữa GDI, handle và Class MFC

  • Optaining DC

  • Sử dụng DC với các đối tượng GDI

  • Draw Mode

  • Pen - Bút vẽ

  • Sử dụng bút vẽ để vẽ đường thẳng

  • Sử dụng bút vẽ để vẽ đường thẳng

  • Xử lý sự kiện OnDraw

  • Xử lý sự kiện OnDraw (tt)

  • Brush - Chổi tô

  • Sử dụng bút vẽ để vẽ hình chữ nhật

  • Sử dụng bút vẽ để vẽ hình chữ nhật

  • Các đối tượng GDI khác

  • RoundRect

  • RoundRect (tt)

  • RoundRect (tt)

  • PIE

Tài liệu cùng người dùng

Tài liệu liên quan