【发布时间】:2013-08-28 17:34:41
【问题描述】:
按照我的another question 假设我的班级中有两个公共成员数据用作模式:
bool WantToSetRectangle;
bool WantToDrawRectangle;
我还有两个公共成员数据,它们是具有 4 个成员的向量,用于设置矩形和绘制矩形。
vector<int>ViewRectangle;
vector<int>RectangleToDraw;
这是类的OnDraw函数的实现,在每个导航任务(如缩放、平移等)之后运行。
void COpenGLControl::OnDraw(CDC *pDC)
{
// TODO: Camera controls
wglMakeCurrent(hdc,hrc);
glLoadIdentity();
gluLookAt(0,0,1,0,0,0,0,1,0);
glTranslatef(m_fPosX, m_fPosY, 0.0f);
glScalef(m_fZoom,m_fZoom,1.0);
if (WantToSetRectangle)
setViewRectangle();
if (WantToDrawRectangle)
DrawRectangleOnTopOfTexture();
wglMakeCurrent(NULL, NULL);
}
现在我在 CDialogEx 中创建了 COpenGLControl 类的两个实例:
COpenGLControl m_oglWindow1;
COpenGLControl m_oglWindow2;
正如您在my another question 的第一张图片中看到的,m_oglWindow1 是较大的窗口,m_oglWindow2 是较小的窗口。我设置两个窗口的模式如下:(这些模式在构造函数中设置false)
m_oglWindow1.WantToSetRectangle = true;
m_oglWindow2.WantToDrawRectangle = true;
每次调用m_oglWindow1 的onDraw 函数时,都会设置ViewRectangle。这些数据应动态传递给m_oglWindow2 的RectangleToDraw,然后立即调用m-oglWindow2 的OnDraw 函数以在始终处于Full Extent 模式的较小窗口上绘制范围矩形。
请记住,对于像Fixed Zoom in 这样的任务,我可以很容易地在我的CDialogEx 的按钮单击处理程序中编写此代码:
void CMyOpenGLTestDlg::OnBnClickedButton4()
{
// TODO: Add your control notification handler code here
m_oglWindow1.FixedZoomOut();
m_oglWindow2.RectangleToDraw = m_oglWindow1.ViewRectangle;
m_oglWindow2.OnDraw(NULL);
}
但是在使用mouse-event handlers 类mouse-event handlers 实现的其他任务中,例如pan、zoom in to the point 和zoom out of the point,我需要在类的两个实例之间进行某种实时数据交换:
void COpenGLControl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (WantToPan)
{
if (m_fLastX < 0.0f && m_fLastY < 0.0f)
{
m_fLastX = (float)point.x;
m_fLastY = (float)point.y;
}
int diffX = (int)(point.x - m_fLastX);
int diffY = (int)(point.y - m_fLastY);
m_fLastX = (float)point.x;
m_fLastY = (float)point.y;
if (nFlags & MK_MBUTTON)
{
m_fPosX += (float)0.2f*m_fZoomInverse*diffX;
m_fPosY -= (float)0.2f*m_fZoomInverse*diffY;
}
OnDraw(NULL);
}
CWnd::OnMouseMove(nFlags, point);
}
void COpenGLControl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (WantToUseZoomTool)
{
if (nFlags & MK_LBUTTON)
{
m_fZoom = 1.05f*m_fZoom;
m_fZoomInverse = 1/m_fZoom;
int diffX = (int)(point.x - oglWindowWidth/2);
int diffY = (int)(point.y - oglWindowHeight/2);
m_fPosX -= (float)diffX;
m_fPosY += (float)diffY;
}
OnDraw(NULL);
}
CWnd::OnLButtonDown(nFlags, point);
}
void COpenGLControl::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (WantToUseZoomTool)
{
if (nFlags & MK_RBUTTON)
{
m_fZoom = 0.95f*m_fZoom;
m_fZoomInverse = 1/m_fZoom;
int diffX = (int)(point.x - oglWindowWidth/2);
int diffY = (int)(point.y - oglWindowHeight/2);
m_fPosX -= (float)diffX;
m_fPosY += (float)diffY;
}
OnDraw(NULL);
}
CWnd::OnRButtonDown(nFlags, point);
}
【问题讨论】:
标签: c++ opengl real-time dynamic-data multiple-instances