Bài giảng C - Đồ họa trong VC
11LẬP TRÌNH C++LẬP TRÌNH C++§§12. 12. Một số hàm đồ họa cơ sởMột số hàm đồ họa cơ sở GDI: Graphics Device InterfaceGDI: Graphics Device Interface(Giao diện thiết bị đồ họa) (Giao diện thiết bị đồ họa) HDC: Handle Device Context (Kiểu HDC: Handle Device Context (Kiểu dữ liệu ngữ cảnh thiết bị)dữ liệu ngữ cảnh thiết bị) 22I. Nhóm hàm vẽ I. Nhóm hàm vẽ a. COLORREF SetPixel(int nXPos, int nYPos, COLORREF a. COLORREF SetPixel(int nXPos, int nYPos, COLORREF clrRef); clrRef); Vẽ một điểm màu clrRef tại vị trí (nXPos, nYPos) lên DC. Giá Vẽ một điểm màu clrRef tại vị trí (nXPos, nYPos) lên DC. Giá trị trả về là màu của điểm (nXPos, nYPos) hoặc -1 nếu điểm trị trả về là màu của điểm (nXPos, nYPos) hoặc -1 nếu điểm này nằm ngoài vùng hiển thị. này nằm ngoài vùng hiển thị. Trong đó COLORREF là kiểu dữ liệu màu : Trong đó COLORREF là kiểu dữ liệu màu : COLORREF RGB (int red, int green, int blue); COLORREF RGB (int red, int green, int blue); red, green, blue : có giá trị từ 0 – 255 red, green, blue : có giá trị từ 0 – 255 b. COLORREF GetPixel(int nXPos, int nYPos); b. COLORREF GetPixel(int nXPos, int nYPos); Trả về giá trị màu tại vị trí (nXPos, nYPos) Trả về giá trị màu tại vị trí (nXPos, nYPos) trả về -1 nếu điểm này nằm ngoài vùng hiển thị. trả về -1 nếu điểm này nằm ngoài vùng hiển thị. c. DWORD MoveTo(int x, int y); c. DWORD MoveTo(int x, int y); Di chuyển bút vẽ đến tọa độ (x, y) trên DC. Giá trị trả về là tọa Di chuyển bút vẽ đến tọa độ (x, y) trên DC. Giá trị trả về là tọa độ cũ của bút vẽ, x = LOWORD, y = HIWORD. độ cũ của bút vẽ, x = LOWORD, y = HIWORD. 33d. d. BOOL LineToBOOL LineTo((int int xEnd, xEnd, int int yEnd); yEnd); Vẽ đoạn thẳng từ vị trí hiện hành đến vị trí (xEnd, yEnd) trên Vẽ đoạn thẳng từ vị trí hiện hành đến vị trí (xEnd, yEnd) trên DC. Hàm trả về TRUE nếu thành công, FALSE nếu thất bại. DC. Hàm trả về TRUE nếu thành công, FALSE nếu thất bại. e. e. BOOL PolylineBOOL Polyline((const POINT FAR const POINT FAR *lpPoints, *lpPoints, int int nPoints); nPoints); Vẽ đường gấp khúc lên DC bằng các đoạn thẳng liên tiếp, số Vẽ đường gấp khúc lên DC bằng các đoạn thẳng liên tiếp, số đỉnh là nPoints với tọa độ các đỉnh được xác định trong đỉnh là nPoints với tọa độ các đỉnh được xác định trong lpPoints. Hàm trả về TRUE nếu thành công, FALSE nếu thất lpPoints. Hàm trả về TRUE nếu thành công, FALSE nếu thất bại. bại. f. f. BOOL PolygonBOOL Polygon((const POINT FAR const POINT FAR *lpPoints, *lpPoints, int int nPoints); nPoints); Vẽ đa giác có nPoints đỉnh, tọa độ các đỉnh được xác định bởi Vẽ đa giác có nPoints đỉnh, tọa độ các đỉnh được xác định bởi lpPoints. Hàm trả về TRUE nếu thành công, FALSE nếu thất lpPoints. Hàm trả về TRUE nếu thành công, FALSE nếu thất bại. bại. g. g. BOOL RectangleBOOL Rectangle((int int left, left, int int top, top, int int right, right, int int bottom); bottom); Vẽ hình chữ nhật có tọa độ là left, top, right, bottom lên DC. Vẽ hình chữ nhật có tọa độ là left, top, right, bottom lên DC. h. h. SetViewportOrg(x,y);SetViewportOrg(x,y); 44 h. h. HPEN CreatePenHPEN CreatePen((int int penStyle, penStyle, int int penWidth, penWidth, COLORREF COLORREF penColor); penColor); Tạo bút vẽ có kiểu penStyle, độ dày nét vẽ là penWidth, màu Tạo bút vẽ có kiểu penStyle, độ dày nét vẽ là penWidth, màu penColor. Hàm trả về handle của bút vẽ nếu thành công và trả penColor. Hàm trả về handle của bút vẽ nếu thành công và trả về NULL nếu thất bại. Các giá trị của penStyle như sau : về NULL nếu thất bại. Các giá trị của penStyle như sau : PS_INSIDEFRAME Không hiển thị PS_NULL PS_DASHDOTDOT PS_DASHDOT PS_DOT PS_DASH PS_SOLID Giải thích Giá trị Các kiểu bút vẽ penStyle 55II. Nhóm hàm tô màu II. Nhóm hàm tô màu a. HBRUSH CreateSolidBrush(COLORREF cRef); a. HBRUSH CreateSolidBrush(COLORREF cRef); Tạo mẫu tô đặc với màu cRef. Tạo mẫu tô đặc với màu cRef. b. b. HBRUSH CreateHatchBrushHBRUSH CreateHatchBrush((int int bStyle, bStyle, COLORREF COLORREF cRef); cRef); Tạo mẫu tô dạng lưới kiểu bStyle với màu cRef. Tạo mẫu tô dạng lưới kiểu bStyle với màu cRef. Các kiểu bStyle : Các kiểu bStyle : HS_HORIZONTAL ;HS_HORIZONTAL ;HS_VERTICAL HS_VERTICAL HS_FDIAGONAL ;HS_FDIAGONAL ;HS_BDIAGONAL HS_BDIAGONAL HS_CROSS ;HS_CROSS ;HS_DIAGCROSS HS_DIAGCROSS c. c. BOOL FloodFillBOOL FloodFill((int int xStart, xStart, int int yStart, yStart, COLORREF COLORREF cRef); cRef); Tô màu một vùng kín, màu đường biên là cRef. Tô màu một vùng kín, màu đường biên là cRef. d. d. BOOL ExtFloodFillBOOL ExtFloodFill((int int xStart, xStart, int int yStart, yStart, COLORREF COLORREF cRef, cRef, UINT UINT fillStyle); fillStyle); Tô màu một vùng kín, fillStyle quyết định cách tô : Tô màu một vùng kín, fillStyle quyết định cách tô : FLOODFILLBORDER: Tô màu vùng có màu đường biên là cRef. FLOODFILLBORDER: Tô màu vùng có màu đường biên là cRef. FLOODFILLSURFACE : Tô vùng có màu cRef.FLOODFILLSURFACE : Tô vùng có màu cRef. 66III. Hiển thị văn bản III. Hiển thị văn bản a. a. BOOL TextOut(int nXStart, int nYStart, LPCTSTR); BOOL TextOut(int nXStart, int nYStart, LPCTSTR); Xuất một chuỗi ký tự văn bản, sử dụng font chữ, màu chữ và Xuất một chuỗi ký tự văn bản, sử dụng font chữ, màu chữ và màu nền hiện hành,màu nền hiện hành, trả về giá trị khác không nếu thành công, trả về giá trị khác không nếu thành công, ngược lại trả về 0.ngược lại trả về 0. b) b) Hàm thiết lập màu chữ và màu nền:Hàm thiết lập màu chữ và màu nền: COLORREF SetTextColor (COLORREF color); COLORREF SetTextColor (COLORREF color); COLORREF SetBkColor (COLORREF color); COLORREF SetBkColor (COLORREF color); c) Xác định màu chữ và màu nền hiện hành: c) Xác định màu chữ và màu nền hiện hành: COLORREF GetTextColor(DC DC); COLORREF GetTextColor(DC DC); COLORREF GetBkColor(DC DC);COLORREF GetBkColor(DC DC); d) Dóng hàng văn bản hiển thị tại trên điểm nXStart, nYStart: d) Dóng hàng văn bản hiển thị tại trên điểm nXStart, nYStart: UINT SetTextAlign(UINT fMode); UINT SetTextAlign(UINT fMode); Trong đó fMode nhận các giá trị sau: Trong đó fMode nhận các giá trị sau: TA_LEFT, TA_RIGHT, TA_CENTER, TA_TOP, TA_BOTTOMTA_LEFT, TA_RIGHT, TA_CENTER, TA_TOP, TA_BOTTOM 77CPaintDC dc(this); // device context for paintingCPaintDC dc(this); // device context for paintinghPen = (HPEN)CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); hPen = (HPEN)CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); dc.SelectObject(hPen); dc.SelectObject(hPen); dc.MoveTo(10,10);dc.MoveTo(10,10);dc.LineTo(100,100);dc.LineTo(100,100);dc.SetPixel(50,50,RGB(255,0,0));dc.SetPixel(50,50,RGB(255,0,0));dc.SetTextAlign(TA_CENTER);dc.SetTextAlign(TA_CENTER);long n=1234; char st[4]; ultoa(n, st, 10);dc.TextOut(50,50,st);long n=1234; char st[4]; ultoa(n, st, 10);dc.TextOut(50,50,st);CRect rect;CRect rect;GetClientRect(&rect);GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icon// Draw the icondc.DrawIcon(x, y, m_hIcon);dc.DrawIcon(x, y, m_hIcon);Vẽ điểm đường, văn bảnVẽ điểm đường, văn bản 88CPaintDC dc(this); // device context for paintingCPaintDC dc(this); // device context for paintingPOINT PointArr[3]; POINT PointArr[3]; HPEN hPen; HPEN hPen; PointArr[0].x = 50; PointArr[0].x = 50; PointArr[0].y = 10; PointArr[0].y = 10; PointArr[1].x = 250; PointArr[1].x = 250; PointArr[1].y = 50; PointArr[1].y = 50; PointArr[2].x = 125; PointArr[2].x = 125; PointArr[2].y = 130; PointArr[2].y = 130; hPen = (HPEN)CreatePen(PS_SOLID, 2, RGB(0, 0, 255)); hPen = (HPEN)CreatePen(PS_SOLID, 2, RGB(0, 0, 255)); dc.SelectObject(hPen); dc.SelectObject(hPen); dc.Polyline(PointArr, 3); dc.Polyline(PointArr, 3); * Chú ý :* Chú ý :Phải cho #include "math.h“ vào stdafx.h thì mới sử Phải cho #include "math.h“ vào stdafx.h thì mới sử dụng được các hàm sin, cos, atandụng được các hàm sin, cos, atanVẽ đa giácVẽ đa giác 99Tô màuTô màuCPaintDC dc(this); // device context for paintingCPaintDC dc(this); // device context for paintingHPEN hPen; HPEN hPen; HBRUSH hBrush, hOldBrush; HBRUSH hBrush, hOldBrush; hPen = (HPEN)CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); hPen = (HPEN)CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); dc.SelectObject(hPen); dc.SelectObject(hPen); dc.Rectangle(10, 10, 50, 50); dc.Rectangle(10, 10, 50, 50); dc.Rectangle(100, 100, 200, 200); dc.Rectangle(100, 100, 200, 200); // Dùng m?t trong các m?u tô có s?n ?? tô hình // Dùng m?t trong các m?u tô có s?n ?? tô hình hBrush = (HBRUSH)GetStockObject(GRAY_BRUSH); hBrush = (HBRUSH)GetStockObject(GRAY_BRUSH); dc.SelectObject(hBrush); dc.SelectObject(hBrush); dc.FloodFill(30, 30, RGB(0, 0, 255)); dc.FloodFill(30, 30, RGB(0, 0, 255)); // T?o m?u tô m?i ?? tô hình th? hai // T?o m?u tô m?i ?? tô hình th? hai hBrush = (HBRUSH)CreateHatchBrush(HS_DIAGCROSS, hBrush = (HBRUSH)CreateHatchBrush(HS_DIAGCROSS, RGB(0, 255, 255)); RGB(0, 255, 255)); hOldBrush = (HBRUSH)dc.SelectObject(hBrush); hOldBrush = (HBRUSH)dc.SelectObject(hBrush); dc.FloodFill(150, 150, RGB(0, 0, 255)); dc.FloodFill(150, 150, RGB(0, 0, 255)); dc.SelectObject(hOldBrush); dc.SelectObject(hOldBrush); . rect;GetClientRect(&rect);GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;int y = (rect.Height() - cyIcon. đư c c c hàm sin, cos, atandụng đư c c c hàm sin, cos, atanVẽ đa giácVẽ đa gi c 99Tô màuTô màuCPaintDC dc(this); // device context for paintingCPaintDC