右下角的浮动框里嵌入了一个对话框,背景是一张地图图片。现在要根据坐标(x,y)的值在对话框上动态的以点显示轨迹。(X,Y)的坐标是在文件MainFrm.cpp文件中的CMainFrame类的ShowAux()方法中得到的,定时器每隔1秒就会(x,y)值是不断的变化的,也就是说点的位置是变动的,请问如何实现这样的功能?
如图所示,通过对话框类的OnPaint()方法可以实现在对话框上画线的效果
void CPaneDialog::OnPaint()
{
CPaintDC dc(this);
dc.MoveTo(0,0);
dc.LineTo(100.123,340.8976);
//dc.LineTo(x,y); //想实现的效果,可以画线至(x,y)坐标}现在的问题是:
1、如何将CMainFrame类的ShowAux()方法中的(x,y)的值以合适的方式传到void CPaneDialog::OnPaint()方法中??
实践不通的方法有:
1、在对话框类中重写带两个参数的OnPaint(float x,float y)方法测试证明没有任何效果
void CPaneDialog::OnPaint(float x,float y)
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用CDialog::OnPaint()
dc.MoveTo(0,0);
dc.LineTo(x,y);
CDialog::OnPaint();
//CDialog::OnPaint(float x,float y);
}
2、想着是不是可以通过设置全局变量的方法在ShowAux()方法中将坐标x,y的值存入其中,然后在OnPaint()方法中直接调用?不清楚该如何来写动态显示MFC界面Dialog动态画线Dialog动态画点
CMainFrame *m_pFrame;
然后
CMainFrame中你创建CPaneDialog的时候
CPaneDialog *XXX = new CPaneDialog;
XXX0->m_pFrame = this;将CMainFrame指针传给CPaneDialog
1、
请问:浮动框里加载对话框时,已经在MainFrm.h里包含了PaneDialog.h头文件。如果CPaneDialog类中定义一个CMainFrame指针
CMainFrame *m_pFrame;
就要在PaneDialog.h头文件中包含MainFrm.h头文件,这样就造成了相互嵌套,执行报错
CPaneDialog类中定义一个指针
CMainFrame *m_pFrame;
您 说的这点是不是说:CMainFrame *m_pFrame; 应该写成CPaneDialog *m_pFrame; 呢?最后两句代码如何实现如何将CMainFrame类的ShowAux()方法中的(x,y)的值传到
void CPaneDialog::OnPaint()方法中的呢?2、CMainFrame中你创建CPaneDialog的时候……
在CMainFrame类中加载对话框时用了OnDockingPaneNotify()方法,如下: LRESULT CMainFrame::OnDockingPaneNotify(WPARAM wParam, LPARAM lParam)
{
if (wParam == XTP_DPN_SHOWWINDOW)
{
// get a pointer to the docking pane being shown.
CXTPDockingPane* pPane= (CXTPDockingPane*)lParam;
if (!pPane->IsValid())
{
switch (pPane->GetID())
{ case ID_VIEW_POSITIONVIEW:
{
if (!::IsWindow(m_dlgPane.m_hWnd))
{
m_dlgPane.Create(IDD_DIALOG2, this);
}
pPane->Attach(&m_dlgPane);
break;
}
}
} return TRUE;
}
return FALSE;
}
请指点,非常感谢您jason_wentzel,我QQ邮箱[email protected],方便的话能加下我的QQ吗?
class CPaneDialog
{
CMainFrame *m_pFrame;
}LRESULT CMainFrame::OnDockingPaneNotify(WPARAM wParam, LPARAM lParam)
{
if (wParam == XTP_DPN_SHOWWINDOW)
{
// get a pointer to the docking pane being shown.
CXTPDockingPane* pPane= (CXTPDockingPane*)lParam;
if (!pPane->IsValid())
{
switch (pPane->GetID())
{
case ID_VIEW_POSITIONVIEW:
{
if (!::IsWindow(m_dlgPane.m_hWnd))
{ m_dlgPane.Create(IDD_DIALOG2, this);
m_dlgPane.m_pFrame = this;//这里把CMainFrame传过去,所以
}
pPane->Attach(&m_dlgPane);
break;
}
}
}
return TRUE;
}
return FALSE;
}