2013-08-28 1 views
1

после моего 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 установлен. эти данные должны быть динамически переданы в RectangleToDrawm_oglWindow2, и сразу же после этого следует вызвать функцию OnDrawm-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); 
} 

ответ

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


} 
+0

Так что мне нужно изучить о пользовательских сообщениях – sepideh

+0

спасибо @ ScottMcP-MVP просто сказать мне это правильный путь? На самом деле я просто думал о пользовательских сообщениях, но, поскольку я новичок в MFC, для этого требуется некоторое время. Этот проект должен быть готов, как только я смогу, поэтому я не хочу идти не так и начинать с нуля? Так скажите мне, если пользовательские сообщения являются правильной концепцией, которую я должен изучать? – sepideh

+0

Да, пользовательское сообщение является правильной концепцией для уведомления родительского окна. Это не займет много времени, чтобы реализовать. –

Смежные вопросы