右下角的浮动框里嵌入了一个对话框,背景是一张地图图片。现在要根据坐标(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动态画点

解决方案 »

  1.   

    定时器每隔1秒就会执行一次ShowAux()方法,也就是(x,y)值是不断的变化的……
      

  2.   

    将CMainFrame指针传入到CPaneDialog即可CPaneDialog类中定义一个指针
    CMainFrame *m_pFrame;
    然后
    CMainFrame中你创建CPaneDialog的时候
    CPaneDialog *XXX = new CPaneDialog;
    XXX0->m_pFrame = this;将CMainFrame指针传给CPaneDialog
      

  3.   


    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吗?
      

  4.   

    class CMainFrame;// 此处只引用,在cpp中才把加#include "MainFrm.h",这样就不会出现相互嵌套
    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;
    }
      

  5.   

    在子窗体内创建公有变量:x1,y1。在父窗体获得(x,y)坐标的同时,拷贝一份给子窗体的x1、y1。这样,子窗体绘图时就不需要访问父窗体的成员了。