类 COpenGLControl 的两个实例之间的动态数据交换
dynamic data exchange between two instances of the class COpenGLControl
在我的另一个问题之后,假设我的类中有两个公共成员数据用作模式:
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;
正如您在我另一个问题的第一张照片中看到的那样,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);
}
但是在其他任务中,如pan
、zoom in to the point
和zoom out of the point
,使用类COpenGLControl
mouse-event handlers
实现,我需要类的两个实例之间进行某种实时数据交换:
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);
}
每个控件都可以通知父对话框需要更新另一个控件。
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)
{
}
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- C++两个源文件之间共享的枚举的静态实例
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 比较两个 std::chrono::time_point 实例时出错
- 在两个类实例之间共享向量
- 编译时检查是否有两个具有相同模板参数的模板实例化
- 使用模板检查我的类的两个实例是否相等
- 随机洗牌似乎会产生相同的结果,但仅在前两个实例中产生相同的结果.我如何避免这种情况
- 运算符*=来自两个实例(矩阵),结果不好
- 如何超载分配运算符,该操作员总计两个实例变量
- 如何使用两个实例中的值进行计算
- 如何检查我的类的两个实例是否相等
- 访问两个实例
- 类 COpenGLControl 的两个实例之间的动态数据交换
- 如何用不同的静态值启动同一个应用程序的两个实例
- Boost asio和线程,如果我运行两个实例,我得到cpu在100%
- 如何消除具有相同模板参数名称的模板类的两个实例的歧义
- c++对象正在创建同一数组的两个实例,但作用域不同
- c++在child的两个实例之间共享parent属性
- 在两个不同的输入数据集上运行同一个C/ c++程序的两个实例