Professional Documents
Culture Documents
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();
}
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:
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.
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
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();
}
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:
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: