You are on page 1of 5

Bài Thực Hành Số 2:

Phát triển chương trình CAD mẫu (SampleCAD)

Nội dung:
- Có thể tương tác với người dùng bằng Mouse và Keyboard.
- Cho phép bổ sung các đối tượng hình học sau bằng menu/toolbar:
 2D: điểm, đường thẳng, tam giác, hình vuông/chữ nhật, hình tròn/ellipse, hình đa giác.
 3D: Hình hộp, hình cầu, hình lăng trụ, hình tứ diện, hình đa diện (bằng tương tác), vành
khuyên.
 Đồ thị/Bề mặt: Bề mặt 3D có đặc tả rõ hay ẩn (explicit hay implicit), bề mặt địa hình
random.
Chương trình mẫu:
1. Dự án MFCLab2 phiên bản VS 6.0
2. Dự án MFCLab2 phiên bản VS 2008
Lưu ý: Sinh viên có thể sử dụng dự án mẫu để hiện thực những yêu cầu của Lab 2. Tuy nhiên,
sinh viên nên tự tạo lại dự án dựa theo phần hướng dẫn dưới đây.
Hướng dẫn:
I. Tạo dự án và cấu hình OpenGL
1. Tạo một Project MFC đặt tên là MFCLab2 và cấu hình OpenGL như đã hướng dẫn trong
Lab 1.
2. Bổ sung 2 biến thành viên vào class CMFCLab2View:
float m_width;
float m_height;

3. Thiết lập Viewport: Bổ sung hàm xử lý cho sự kiện WM_SIZE, Visual Studio sinh ra
OnSize(.,.). Hiện thực hàm OnSize như sau:
void CMFCLab2View::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);

//Setting up viewport
CRect rect;
GetClientRect(rect);
float w = rect.Width();
float h = rect.Height();
glViewport(0, 0, w, h);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
{
m_width = 2.0;
m_height = 2.0 * h / w;
}
else
{
m_height = 2.0;
m_width = 2.0 * w / h;
}
glOrtho(-m_width, m_width, -m_height, m_height, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

II. Thiết kế giao diện:


4. Trong Resource View -> Toolbar: chọn IDR_MAINFRAME, thêm mới hoặc hiệu chỉnh
lại các button có sẵn. VD: thay đổi icon của button đầu tiên (sử dụng editor trong MFC)
và sửa ID trong Properties thành ID_LINE (double click vào toolbar button để hiện thị ra
cửa sổ Properties).
5. Thêm enum STATE trong file MFCLab2View.h :
enum STATE {NONE, LINE, RECTANGLE, CIRCLE, POLYGON, CUBE, SPHERE,
CYLINDER};
6. Khai báo biến thành viên vào class CMFCLab2View:
enum STATE m_state;

7. Khai báo sự kiện cho toolbar button Line. Trong phần MESSAGE_MAP trong file
MFCLab2View.cpp, chèn thêm 2 dòng sau:

ON_COMMAND (ID_LINE, OnToolBarButtonLine)


ON_UPDATE_COMMAND_UI(ID_LINE, OnUpdateToolBarButtonLine)

8. Khai báo và hiện thực hàm thành viên OnToolBarButtonLine() trong class
CMFCLab2View như sau:
void CMFCLab2View::OnToolBarButtonLine()
{
m_state = LINE;
}

9. Khai báo và hiện thực hàm thành viên OnUpdateToolBarButtonLine() trong class
CMFCLab2View như sau:
void CMFCLab2View::OnUpdateToolBarButtonLine(CCmdUI *pCmdUI)
{
pCmdUI->SetRadio(m_state==LINE);
}
10. Hiện thực tương tự cho các button Rectangle, circle, cube, sphere, cylinder.

III. Hiện thực các đối tượng 2D:


11. Tạo lớp CGeometricObject là lớp cha của các đối tượng hình học cơ bản, sau đó khai báo
thêm hàm Draw(). Hàm này sẽ được override ở lớp con:
virtual void Draw() = 0;

12. Khai báo thêm 2 biến m_Begin và m_End có tầm vực protected trong lớp
CGeometricObject để các lớp con có thể thừa kế. Hai biến này thuộc kiểu CPoint3D (lớp
CPoint3D đã được hiện thực trong 2 file “HomoPoint.h” và “HomoPoint.cpp”). Hiện
thực các hàm get, set cho 2 biến này.
protected:
CPoint3D m_Begin;
CPoint3D m_End;

13. Khai báo 2 biến m_listObjects và m_numObject trong class CMFCLab2View. Biến
m_listObjects là danh sách các đối tượng và m_numObject là số lượng đối tượng đã
được vẽ.
CGeometricObject* m_listObjects[100]; //manage geometric objects
int m_numObject; // the number of geometric objects

14. Bổ sung hàm xử lý sự kiện cho thông điệp WM_PAINT (Visual Studio sinh ra
OnPaint()). Hiện thực hàm OnPaint() như sau:
void CMFCLab2View::OnPaint()
{
CPaintDC dc(this); // device context for painting

glClearColor(1.0f, 1.0f, 1.0f, 0.0f);


glClear(GL_COLOR_BUFFER_BIT);
//Draw all geometric objects
for(int i = 0; i < m_numObject; i++)
m_listObjects[i]->Draw();
glFlush();

SwapBuffers(dc.m_ps.hdc); // Swap the front and the back buffer


to show the created graphics
}
15. Bổ sung lớp CLine thừa kế từ lớp CGeometricObject và hiện thực hàm Draw() như sau:

void CLine::Draw()
{
glColor3f(0.0f, 0.0f, 0.0f);
glBegin(GL_LINES);
glVertex2f(m_Begin.getX(), m_Begin.getY());
glVertex2f(m_End.getX(), m_End.getY());
glEnd();
}

16. Thêm biến thành viên m_isMouseDown trong class CMFCLab2View.

bool m_isMouseDown;

17. Bổ sung hàm xử lý sự kiện cho thông điệp WM_LBUTTONDOWN()(Visual Studio sinh ra
OnLButtonDown()).Hiện thực hàm OnLButtonDown() như sau:

void CMFCLab2View::OnLButtonDown(UINT nFlags, CPoint point)


{
CGeometricObject *object;
m_isMouseDown = true;
CRect rect;
GetClientRect(rect);
//Change from window coordinate system to real coordinate system
float x = (float)2 * m_width * point.x/rect.Width() - m_width;
float y = 2 * m_height * (rect.Height() - point.y)/ (float)
rect.Height() - m_height;
if (m_state == LINE)
{
//Create a line object
CLine* line = new CLine();
line->getBegin()->setCoords(x, y, 0.0f);
line->getEnd()->setCoords(x, y, 0.0f);
m_listObjects[m_numObject] = line;
m_numObject++;
}
}
18. Bổ sung hàm xử lý sự kiện cho thông điệp WM_MOUSEMOVE() (Visual Studio sinh ra
OnMouseMove()).Hiện thực hàm OnMouseMove() như sau:

void CMFCLab2View::OnMouseMove(UINT nFlags, CPoint point)


{
if (m_isMouseDown)
{
CRect rect;
GetClientRect(rect);
//Change from window coordinate system to real coordinate
system
float x = (float)2 * m_width * point.x/rect.Width() -
m_width;
float y = 2 * m_height * (rect.Height() - point.y)/ (float)
rect.Height() - m_height;

if (m_state == LINE)
{
//Adjust the line object
CLine* line = (CLine*) m_listObjects[m_numObject -1];
line->getEnd()->setCoords(x, y, 0.0f);
Invalidate();
}
}
}
19. Bổ sung hàm xử lý sự kiện cho thông điệp WM_LBUTTONUP()(Visual Studio sinh ra
OnLButtonUp()).Hiện thực hàm OnLButtonUp() như sau:

void CMFCLab2View::OnLButtonUp(UINT nFlags, CPoint point)


{
m_isMouseDown = false;
}

IV. Thực thi:


20. Biên dịch và thực thi chương trình. Chọn button line trên Toolbar, sau đó dùng chuột để
vẽ các đoạn thẳng trên window.
21. Khi vẽ các đối tượng sẽ thấy cửa sổ hiện thị bị flick. Cần bổ sung thêm hàm xử lý sự kiện
WM_ERASEBKGRD()(Visual Studio sinh ra OnEraseBkgnd()).Hiện thực hàm
OnEraseBkgnd()như sau:
BOOL CMFCLab2View::OnEraseBkgnd(CDC* pDC)
{
return true;
}
Bài tập: (sinh viên chuẩn bị trước ở nhà)
1. Thêm các class CRectangle, Ccircle, CPolygon và hiện thực tương tự cho các đối
tượng hình học 2D này.
2. Thêm các class CCube, CSphere, CCylinder Ctetrahedron và hiện thực tương tự cho
các đối tượng hình học 3D này.
3. Thêm các class để vẽ Đồ thị/Bề mặt: Bề mặt 3D có đặc tả rõ hay ẩn (explicit hay
implicit), bề mặt địa hình random

You might also like