• Thứ Ba, 15/05/2007 09:57 (GMT+7)

    Lập trình đồ họa trong C++

    Câu hỏi :
    Xin hỏi trong C++ làm thế nào để hiện các hình, trong sách em đang học chỉ hướng dẫn cách vẽ các trường đơn giản trên DOS, giả sử em muốn đưa các hình vẽ vào trong chương trình của mình (giao diện của chương trình) thì phải làm sao?
     

    Trả lời :

    Nếu đứng ở góc nhìn lập trình, bạn xem Windows như 1 thư viện lập trình rất lớn, nó cung cấp danh sách các hàm chức năng giải quyết nhiều lĩnh vực khác nhau, được sắp xếp theo nhiều nhóm hàm, mỗi nhóm hàm gồm nhiều hàm liên quan đến 1 lĩnh vực cụ thể. Thí dụ để vẽ đồ họa, bạn có thể dùng các hàm API Windows trong nhóm GDI (Graphics Device Interface). Để vẽ các thành phần đồ họa cơ bản, bạn có thể dùng các hàm như LineTo(), Arc(), Rectangle(), Ellipse(), Polygon(),.. Để vẽ ảnh bitmap có sẵn (được chứa trên các file ảnh) ra cửa sổ nào đó của ứng dụng, bạn có thể dùng các hàm API Windows như LoadImage() và hàm BitBlt (hay StretchBlt). Hàm LoadImage() được dùng để nạp file ảnh vào bộ nhớ, còn hàm BitBlt() được dùng để hiển thị ảnh lên cửa sổ màn hình. Sau đây là đoạn code VC++ điển hình để hiển thị tập tin ảnh C:\test.bmp lên Form ứng dụng hiện hành:
     
     //include các thư viện hàm cần dùng
     #include <Wingdi.h>
     #include <Winuser.h>
     //nạp file ảnh vào đối tượng Bitmap
     HBITMAP hbm = (HBITMAP)LoadImage( NULL, “c:\\test.bmp”, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );
     //kiểm tra, nếu thất bại thì dừng công việc
     if (hbm == NULL) return;
     //xác định Device context của form
     HDC hdc = this->GetDC()->m_hDC;
     //tạo 1 Device context mới tương thích với form
     HDC hdcTemp = CreateCompatibleDC(hdc);
     //chứa đối tượng bitmap vào DC mới
     SelectObject(hdcTemp, hbm);
     
     //xác định kích thước của bitmap.
     BITMAP bm;
     GetObject(hbm, sizeof(BITMAP), &bm);
     //hiển thị bitmap lên vị trí (50,50) của form.
     BitBlt(hdc, 50, 50, bm.bmWidth + 50, bm.bmHeight + 50, hdcTemp, 0, 0, SRCCOPY);
     //giải phóng DC của form
     ::ReleaseDC(m_hWnd,hdc); 

    Chuyên mục: Lập trình