Lập trình C trên Windows: Thư viện đồ họa GDI (Graphics Device Interface)
Tham khảo bài thuyết trình 'lập trình c trên windows: thư viện đồ họa gdi (graphics device interface)', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Lập trình C trên Windows
Thư viện đồ họa GDI
(Graphics Device Interface)
Nguyễn Tri Tuấn
Khoa CNTT – ĐH.KHTN.Tp.HCM
Email: nttuan@ fit.hcmuns.edu.vn
Nội dung
Giới thiệu
Các khái niệm cơ bản
Các ví dụ vẽ hình đồ họa
Xử lý ảnh Bitmap
In ấn (Printing)
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 2
Giới thiệu
GDI là thư viện cung cấp các hàm
(functions) và các cấu trúc dữ liệu
(structures) cần thiết để ứng dụng tạo ra
những kết xuất dưới dạng đồ họa (hiển thị
lên màn hình, in ra máy in,…)
Các hàm GDI cho phép vẽ đường thẳng,
đường cong, các hình đa giác, xuất ký tự,
hiển thị ảnh bitmap, in ấn,…
GDI không tương tác trực tiếp với thiết bị
phần cứng, mà thông qua các driver
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 3
Các khái niệm cơ bản
Thiết bị đồ họa (Graphics device)
Ngữ cảnh của thiết bị (DC - Device Context)
DC trong MFC
Đối tượng vẽ (Drawing object)
Đối tượng vẽ trong MFC
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 4
Các khái niệm cơ bản - Thiết bị đồ họa
Thiết bị đồ họa (Graphics device): là những
thiết bị cho phép thể hiện các kết xuất dạng
đồ họa trên đó
Thiết bị vật lý (physical device): là những thiết bị
thật như màn hình, cửa sổ, máy in,…
Thiết bị “ảo” (logical device): là các thiết bị được
giả lập trong bộ nhớ, còn gọI là “memory
device”, có tác dụng mô phỏng thiết bị vật lý
Thư viện GDI cho phép thực hiện các lệnh
vẽ trên cả thiết bị vật lý lẫn logic
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 5
Các khái niệm cơ bản - Ngữ cảnh của thiết bị
Ngữ cảnh của thiết bị (Device Context): là
một cấu trúc lưu trữ các thông số của thiết bị
đồ họa, ví dụ:
Chế độ vẽ hiện tại (drawing mode),
Vị trí bút vẽ hiện tại (pen position),
Các đối tượng vẽ hiện tại (Pen, Brush, Font)
…
Các thông số này chi phối những thao tác vẽ
lên thiết bị tại thời điểm thực hiện
Mỗi thiết bị được đặc trưng bởi 1 cấu trúc
DC
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 6
Các khái niệm cơ bản - Ngữ cảnh của thiết bị…(tt)
Ứng dụng thực hiện các thao tác vẽ lên thiết
bị thông qua DC của thiết bị đó
DC được xem như là một phương tiện liên
kết giữa ứng dụng và thiết bị, giúp tạo nên
tính độc lập thiết bị (Device Independent)
cho ứng dụng
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 7
Các khái niệm cơ bản - Ngữ cảnh của thiết bị…(tt)
Thuộc tính Gía trị mặc định Ý nghĩa/Các hàm liên quan
Background White Màu nền khi xuất ký tự (SetBkColor)
color
Text color Black Màu ký tự (SetTextColor)
Font SYSTEM_FONT Font chữ khi xuất ký tự
(CreateFont,
CreateFontIndirect,
SelectObject)
Pen BLACK_PEN Bút vẽ, sử dụng khi vẽ đường thẳng,
đường cong
(CreatePen, CreatePenIndirect,
SelectObject)
Current Pen (0, 0) Tọa độ hiện hành của Pen
Position (MoveTo, LineTo)
Một số thuộc tính do DC quản lý
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 8
Các khái niệm cơ bản - Ngữ cảnh của thiết bị…(tt)
Thuộc tính Gía trị mặc định Ý nghĩa/Các hàm liên quan
Brush WHITE_BRUSH Màu tô, sử dụng khi tô màu các vùng kín
(CreateSolidBrush,
CreateBrushIndirect,
CreatePatternBrush,
SelectObject,…)
Drawing R2_COPYPEN Chế độ vẽ. Xác định cách phối hợp các
mode bit màu của 2 pixel có cùng tọa độ
(SetROP2)
Bitmap NULL (CreateBitmap,
CreateBitmapIndirect,
CreateCompatibleBitmap,
SelectObject)
Một số thuộc tính do DC quản lý
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 9
Các khái niệm cơ bản - Ngữ cảnh của thiết bị…(tt)
Thuộc tính Gía trị mặc định Ý nghĩa/Các hàm liên quan
Color DEFAULT_PALETTE Bảng màu
Palette (CreatePalette,
RealizePalette,
SelectPalette,
UnrealizeObject )
Mapping MM_TEXT Xác định đơn vị đo. VD.
mode - MM_TEXT qui định đơn vị đo theo
trục x,y là 1 pixel.
- MM_HIMETRIC qui định đơn vị đo
theo trục x,y là 0.01 milimet
(SetMapMode)
………
Một số thuộc tính do DC quản lý
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 10
Các khái niệm cơ bản - Ngữ cảnh của thiết bị…(tt)
Các loại DC:
Display DC: sử dụng trong các thao tác vẽ lên
màn hình/cửa sổ
Printer DC: sử dụng để kết xuất dữ liệu đồ họa
ra máy in
Memory DC: tương ứng với thiết bị “logic”,
thường dùng để “chuẩn bị” dữ liệu trước khi
hiển thị ra thiết bị vật lý
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 11
Các khái niệm cơ bản - Ngữ cảnh của thiết bị…(tt)
Loại DC Các hàm liên quan
Display DC BeginPaint, GetDC,
GetDCEx
EndPaint, ReleaseDC
Printer DC CreateDC
DeleteDC
Memory DC CreateCompatibleDC
DeleteDC
Các hàm tạo lập/hủy bỏ DC
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 12
Các khái niệm cơ bản - DC trong MFC
Các lớp liên quan đến DC
CDC: là lớp cơ sở dùng để quản lý DC
CPaintDC:
Dẫn xuất từ lớp CDC,
Dùng với các thao tác vẽ trong vùng client
của cửa sổ
Chỉ sử dụng trong xử lý
thông điệp WM_PAINT
(hàm CWnd::OnPaint)
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 13
Các khái niệm cơ bản - DC trong MFC…(tt)
Các lớp liên quan đến DC (tt)
CClientDC:
Dẫn xuất từ lớp CDC,
Dùng với các thao tác vẽ trong vùng client
của cửa sổ
Sử dụng bất kỳ lúc nào, ngoại trừ hàm
CWnd::OnPaint
CWindowDC:
Dẫn xuất từ lớp CDC,
Dùng với các thao tác vẽ trên cửa sổ (kể cả
vùng client và non-client)
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 14
Các khái niệm cơ bản - DC trong MFC…(tt)
VD1. Vẽ bằng CDC
CDC* pDC = GetDC();
// Các lệnh vẽ …
ReleaseDC(pDC);
VD2. Xử lý thông điệp WM_PAINT, dùng lớp CDC
PAINTSTRUCT ps;
CDC* pDC = BeginPaint(&ps);
// Các lệnh vẽ …
EndPaint(&ps);
VD3. Xử lý thông điệp WM_PAINT, dùng lớp CPaintDC
CPaintDC dc(this);
// Các lệnh vẽ …
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 15
Các khái niệm cơ bản - DC trong MFC…(tt)
VD4. Vẽ trên vùng client, dùng lớp CClientDC
void CMainWindow::OnLButtonDown(UINT nFlags,
CPoint point)
{
CRect rect;
GetClientRect(&rect);
CClientDC dc(this);
dc.MoveTo(rect.left, rect.top);
dc.LineTo(rect.right, rect.bottom);
dc.MoveTo(rect.right, rect.top);
dc.LineTo(rect.left, rect.bottom);
}
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 16
Các khái niệm cơ bản - DC trong MFC…(tt)
Thuộc tính Gía trị mặc định Ý nghĩa/Các hàm liên quan
Background White CDC::SetBkColor
color CDC::GetBkColor
Text color Black CDC::SetTextColor
CDC::GetTextColor
Font SYSTEM_FONT CDC::SelectObject
Pen BLACK_PEN CDC::SelectObject
Current Pen (0, 0) CDC::MoveTo
Position CDC::GetCurrentPosition
Drawing R2_COPYPEN CDC::SetROP2
mode CDC::GetROP2
Một số thuộc tính do lớp CDC quản lý
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 17
Các khái niệm cơ bản - DC trong MFC…(tt)
Hàm Ý nghĩa
MoveTo Di chuyển Pen đến vị trí mới
LineTo Vẽ 1 đoạn thẳng từ vị trí Pen hiện hành đến vị trí mới
Polyline / Vẽ 1 dãy các cạnh
PolylineTo
Arc / ArcTo Vẽ 1 cung
PolyBezier / Vẽ đường cong Bezier
PolyBezierTo
PolyDraw Vẽ đường cong Bezier và các cạnh nối giữa các
điểm
Một số hàm vẽ do lớp CDC cung cấp
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 18
Các khái niệm cơ bản - Đối tượng vẽ
Đối tượng vẽ (Drawing object): là những đối
tượng sẽ chi phối các thao tác vẽ của bạn.
VD:
Đối tượng Pen sẽ chi phối thao tác vẽ đường
thẳng, đường cong;
Đối tượng Brush sẽ chi phối thao tác tô màu;
Đối tượng Font sẽ chi phối thao tác xuất ký tự
Đối tượng vẽ chứa các thông tin về màu sắc
(color), kiểu dáng (style)
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 19
Các khái niệm cơ bản - Đối tượng vẽ…(tt)
Các đối tượng vẽ cần phải được tạo mới
(Create) hay lấy ra từ kho (stock) để dùng
Nếu tạo mới, sau khi dùng phải giải phóng
Nếu lấy từ kho có sẵn, sau khi dùng không cần
giải phóng
VD1. Tạo mới 1 Pen
HPEN hPen1 = CreatePen(PS_SOLID, 2, RGB(255, 0, 0);
VD2. Lấy 1 Pen từ “kho” có sẵn
HPEN hPen2 = (HPEN) GetStockObject(WHITE_PEN);
VD3. Xoá đối tượng hPen1 sau khi sử dụng
DeleteObject(hPen1);
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 20
Các khái niệm cơ bản - Đối tượng vẽ…(tt)
Các đối tượng vẽ cần được “gán” vào DC trước
khi thực hiện thao tác vẽ. VD:
// “Gán” đối tượng hPen vào DC
HPEN hOldPen = (HPEN) SelectObject(hdc, hPen);
// Vẽ 1 đoạn thẳng, sử dụng đối tượng hPen vừa tạo
MoveTo(hdc, 50, 50);
LineTo(hdc, 100, 100);
Cần phải “lấy” đối tượng vẽ ra khỏi DC trước khi
giải phóng đối tượng hay giải phóng DC
// “Lấy” đối tượng vẽ ra khỏi DC
SelectObject(hdc, hOldPen);
// Giải phóng DC và đối tượng vẽ (nếu đối tượng được
// tạo mới)
ReleaseDC(hFrameWnd, hdc);
DeleteObject(hPen);
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 21
Các khái niệm cơ bản - Đối tượng vẽ…(tt)
Các đối tượng vẽ:
Pen (HPEN)
Brush (HBRUSH)
Font (HFONT)
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 22
Các khái niệm cơ bản - Đối tượng vẽ…(tt)
Pen: có các thuộc tính
Style: kiểu dáng
Width: độ rộng (pixel)
Color: màu sắc (RGB)
VD1. Tạo mới 1 Pen
HPEN hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0);
VD2. Tạo mới 1 Pen, sử dụng cấu trúc LOGPEN
LOGPEN lp;
lp.lopnStyle = PS_DOT;
lp.lopnWidth.x = 3;
lp.lopnWidth.y = 0; // không sử dụng
lp.lopnColor = RGB(0, 255, 0);
HPEN hPen = CreatePenIndirect(&lp);
VD3. Lấy 1 Pen từ “kho” có sẵn
HPEN hPen;
hPen = (HPEN) GetStockObject(WHITE_PEN);
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 23
Các khái niệm cơ bản - Đối tượng vẽ…(tt)
Brush: có các thuộc tính
Style: kiểu dáng
Color: màu sắc (RGB)
Hatch: mẫu tô
Hatch brush
Stock brush Pattern brush
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 24
Các khái niệm cơ bản - Đối tượng vẽ…(tt)
Brush (tt):
VD1. Tạo mới 1 Brush
LOGBRUSH lb;
HBRUSH hbr1;
lb.lbStyle = BS_HATCHED;
lb.lbColor = RGB(255, 0, 0);
lb.lbHatch = HS_CROSS;
hbr1 = CreateBrushIndirect(&lb);
VD2. Lấy 1 Brush từ “kho” có sẵn
HBRUSH hbr2;
hbr2 = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 25
Các khái niệm cơ bản - Đối tượng vẽ…(tt)
Font: có các thuộc tính
Typeface: loạI font (Times, Courier, Arial,…)
Style: kiểu dáng (normal, thin, bold,…)
Size: kích cỡ chữ, được xác định theo đơn vị
point, 1 point = 1/72 inch = 0.013837 inch
Có thể tạo đối tượng font bằng cách:
Thay đổI mẫu font có sẵn
Chọn thuộc tính Font từ hộp thoạI ChooseFont
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 26
Các khái niệm cơ bản - Đối tượng vẽ…(tt)
Font (tt)
VD1. Tạo mới 1 font từ mẫu có sẵn
LOGFONT lf;
// Lấy font mẫu từ “kho”
HFONT hFont = (HFONT) GetStockObject(SYSTEM_FONT);
// Lấy thuộc tính của font mẫu
GetObject(hFont, sizeof(LOGFONT), (LOGFONT *) &lf);
// Sửa đổi các thuộc tính cho phù hợp yêu cầu
lf.lfHeight = -28;
lf.lfWidth = 0;
strcpy(lf.lfFaceName, "VNI-Helve");
// Tạo lập font mới
hFont = CreateFontIndirect(&lf);
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 27
Các khái niệm cơ bản - Đối tượng vẽ…(tt)
Font (tt)
VD2. Chọn thuộc tính font từ hộp thoại ChooseFont
LOGFONT lf;
CHOOSEFONT cf;
HFONT hFont;
// Khởi tạo cấu trúc CHOOSEFONT
ZeroMemory(&cf, sizeof(CHOOSEFONT));
cf.lStructSize = sizeof(CHOOSEFONT);
cf.hwndOwner = hFrameWnd;
cf.lpLogFont = &lf; // Nhận thuộc tính font trả về
cf.Flags = CF_SCREENFONTS | CF_EFFECTS;
cf.rgbColors = RGB(0, 255, 255); // light blue
cf.nFontType = SCREEN_FONTTYPE;
if (ChooseFont(&cf)) {
// Tạo lập font mới
hFont = CreateFontIndirect(&lf);
…
}
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 28
Các khái niệm cơ bản - Đối tượng vẽ trong MFC
Đối tượng Lớp MFC
Pen CPen
Brush CBrush
Font CFont
VD1. tạo đối tượng Pen (C1)
CPen pen(PS_SOLID, 1, RGB (255, 0, 0));
VD2. tạo đối tượng Pen (C2)
CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB (255, 0, 0));
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 29
Các khái niệm cơ bản - Đối tượng vẽ trong MFC…(tt)
VD3. tạo đối tượng Pen,dùng cấu trúc LOGPEN (C3)
CPen pen;
LOGPEN lp;
lp.lopnStyle = PS_SOLID;
lp.lopnWidth.x = 1;
lp.lopnColor = RGB(255, 0, 0);
pen.CreatePenIndirect(&lp);
VD4. sử dụng đối tượng Pen để vẽ
CPen* pOldPen = dc.SelectObject(&pen);
dc.Ellipse(0, 0, 100, 100);
VD5. hai cách để tạo solid brush
CBrush brush(RGB(255, 0, 0));
CBrush brush;
brush.CreateSolidBrush(RGB(255, 0, 0));
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 30
Các khái niệm cơ bản - Đối tượng vẽ trong MFC…(tt)
VD6. tạo Hatch brush và dùng để tô bên trong HCN
CBrush brush(HS_DIAGCROSS, RGB(255, 255, 255));
dc.SelectObject(&brush);
dc.SetBkColor(RGB(192, 192, 192)); // tô trên nền xám
dc.Rectangle(0, 0, 100, 100);
VD7. tạo đối tượng Font có cỡ chữ 12 point
CFont font;
font.CreatePointFont(120, _T("Times New Roman"));
VD8. tạo đối tượng Font bằng cấu trúc LOGFONT
LOGFONT lf;
::ZeroMemory(&lf, sizeof(lf));
lf.lfHeight = 120;
lf.lfWeight = FW_BOLD;
lf.lfItalic = TRUE;
::lstrcpy(lf.lfFaceName, _T("Times New Roman"));
CFont font;
font.CreatePointFontIndirect(&lf);
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 31
Các khái niệm cơ bản - Đối tượng vẽ trong MFC…(tt)
VD9. tạo font và dùng để xuất ký tự
CClientDC dc(this);
CFont font;
font.CreatePointFont(120, _T("Arial")));
CFont* def_font = dc.SelectObject(&font);
dc.TextOut(5, 5, _T("Hello, World !"), 14);
dc.SelectObject(def_font);
font.DeleteObject();
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 32
Các ví dụ vẽ hình đồ họa
VD1. Vẽ 1 đoạn thẳng
dc.MoveTo(0, 0);
dc.LineTo(0, 100);
VD2. Vẽ 1 tứ giác
POINT aPoint[5]={0, 0, 0, 100, 100, 100, 100, 0, 0, 0};
dc.Polyline(aPoint, 5);
VD3. Vẽ 1 cung
CRect rect (0, 0, 200, 100);
CPoint point1 (0, -500);
CPoint point2 (-500, 0);
dc.Arc (rect, point1, point2);
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 33
Các ví dụ vẽ hình đồ họa…(tt)
VD4. Vẽ 1 đường cong hình sin bằng Polyline
#include
#define SEGMENTS 500
#define PI 3.1415926
void CMainWindow::OnPaint() {
CRect rect;
GetClientRect(&rect);
int nWidth = rect.Width();
int nHeight = rect.Height();
CPaintDC dc(this);
CPoint aPoint[SEGMENTS];
for (int i=0; i Các ví dụ vẽ hình đồ họa…(tt)
VD5. Vẽ 1 đường cong với hàm PolyBezier
POINT aPoint1[4] = {120,100,120,200,250,150,500,40};
POINT aPoint2[4] = {120,100,50,350,250,200,500,40};
dc.PolyBezier(aPoint1, 4);
dc.PolyBezier(aPoint2, 4);
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 35
Xử lý ảnh Bitmap
DDB và DIB
Vẽ một DDB
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 36
Xử lý ảnh Bitmap - DDB và DIB
DDB (Device Dependent Bitmap)
Có nhiều loại thiết bị khác nhau để lưu trữ/hiển thị ảnh
bitmap cần có nhiều định dạng (format) khác nhau để
lưu ảnh trên thiết bị
Các định dạng này gọi là DDB
DIB (Device Independent Bitmap)
Các định dạng DDB sẽ không tương thích trên các loại
thiết bị khác nhau
DIB là một định dạng do Windows cung cấp nhằm đảm
bảo ảnh được lưu trữ “độc lập với thiết bị” tương
thích với nhiều loại thiết bị
Khi ta load một DIB, device driver sẽ chuyển đổi nó
thành dạng DDB ứng với thiết bị
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 37
Xử lý ảnh Bitmap - Vẽ một DDB
Hàm BitBlt (CDC::BitBlt): copy 1 ảnh bitmap từ DC
nguồn (hdcSrc) sang DC đích (hdcDest)
BOOL BitBlt(HDC hdcDest, DC int nXDest,
int nYDest, int nWidth, int nHeight,
HDC hdcSrc, int nXSrc, int nYSrc,
DWORD dwRop);
Hàm StretchBlt (CDC::StretchBlt): copy 1 ảnh
bitmap từ DC nguồn (hdcSrc) sang DC đích (hdcDest),
đồng thời co/giãn ảnh
BOOL StretchBlt(HDC hdcDest, int nXDest, int nYDest,
int nWidthDest, int nHeightDest,
HDC hdcSrc, int nXSrc, int nYSrc,
int nWidthSrc, int nHeightSrc,
DWORD dwRop);
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 38
Xử lý ảnh Bitmap - Vẽ một DDB…(tt)
Lấy thông tin của ảnh bitmap:
API: Hàm GetObject
BITMAP bm;
GetObject(hBitmap,sizeof(BITMAP),&bm);
MFC: hàm CBitmap::GetBitmap
BITMAP bm;
bitmap.GetBitmap(&bm);
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 39
Xử lý ảnh Bitmap - Vẽ một DDB…(tt)
VD. Load bitmap từ resource,vẽ lên cửa sổ View
CxxxView::OnDraw(CDC* pDC) {
CBitmap bitmap;
CBitmap oldBitmap;
BITMAP bm;
CDC dcMemory;
bitmap.LoadBitmap(IDB_SAMPLE);
bitmap.GetBitmap(&bm);
dcMemory.CreateCompatibleDC(pDC);
oldBitmap = dcMemory.SelectObject(&bitmap);
pDC->BitBlt(100, 100, bm.bmWidth, bm.bmHeight,
&dcMemory, 0, 0, SRCCOPY);
dcMemory.SelectObject(&oldBitmap);
}
C4W - GDI - Nguyen Tri Tuan - DH.KHTN Tp.HCM Summer 2004 40