после моего another question предположит, что у меня есть два данных общих членов в моем классе, используемых в качестве режимов:динамический обмен данных между двумя экземплярами класса 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;
как вы видите на первом изображении в my another questionm_oglWindow1
- это b igger window и 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);
}
Так что мне нужно изучить о пользовательских сообщениях – sepideh
спасибо @ ScottMcP-MVP просто сказать мне это правильный путь? На самом деле я просто думал о пользовательских сообщениях, но, поскольку я новичок в MFC, для этого требуется некоторое время. Этот проект должен быть готов, как только я смогу, поэтому я не хочу идти не так и начинать с нуля? Так скажите мне, если пользовательские сообщения являются правильной концепцией, которую я должен изучать? – sepideh
Да, пользовательское сообщение является правильной концепцией для уведомления родительского окна. Это не займет много времени, чтобы реализовать. –