динамический обмен данными между двумя экземплярами класса 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);
}

Теперь я создаю два экземпляра класса COpenGLControl в моем CDialogEx:

COpenGLControl m_oglWindow1;
COpenGLControl m_oglWindow2;

как вы видите на первом рисунке в мой другой вопрос m_oglWindow1 это большее окно и m_oglWindow2 меньше. Я установил режимы двух окон следующим образом: (эти режимы установлены false в конструкторе)

m_oglWindow1.WantToSetRectangle = true;
m_oglWindow2.WantToDrawRectangle = true;

каждый раз onDraw функция 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Мне нужен некоторый обмен данными между двумя экземплярами класса:

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);
}

1

Решение

Каждый элемент управления может уведомить родительский диалог о необходимости обновления другого элемента управления.

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)
{}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]