跟随我的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);
}
现在我在COpenGLControl
中创建了两个类CDialogEx
的实例:
COpenGLControl m_oglWindow1;
COpenGLControl m_oglWindow2;
在my another question的第一张图片中看到m_oglWindow1
是较大的窗口,而m_oglWindow2
是较小的窗口。我按如下方式设置了两个窗口的模式:(这些模式在构造函数中设置为false
)
m_oglWindow1.WantToSetRectangle = true;
m_oglWindow2.WantToDrawRectangle = true;
每次调用onDraw
的{{1}}函数时,都会设置m_oglWindow1
。这些数据应该动态传递给ViewRectangle
RectangleToDraw
,然后立即调用m_oglWindow2
OnDraw
函数来在较小的窗口上绘制范围矩形始终处于m-oglWindow2
模式
请记住,对于像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);
}
,pan
和zoom in to the point
等使用zoom out of the point
类mouse-event handlers
实施的其他任务中,我需要某种依据两个类实例之间的时间数据交换:
COpenGLControl
答案 0 :(得分:0)
每个控件都可以通知父对话框需要更新另一个控件。
GetParent()->PostMessage(UWM_UPDATE2, 0, 0);
用户定义的消息是:
#define UWM_UPDATE1 (WM_APP + 1)
#define UWM_UPDATE2 (WM_APP + 2)
如果将ON_MESSAGE放入其消息映射中,该对话框可以处理这些消息。
ON_MESSAGE(UWM_UPDATE2, OnUpdate2)
LRESULT CMyOpenGLTestDlg::OnUpdate2(WPARAM, LPARAM)
{
}