我在做一个项目,视图中显示的为一个地图,定义了一个对话框用来说明地图上不同区域的属性信息,我的想法是将对话框搞成非模式的,这样可以连续的通过点击地图上不同部分来获得对应位置的属性信息,而不用关闭对话,在不用的时候将对话框设置为不显示的。现在的状况是对话框为模式对话框,点击地图能够获得属性信息。显示一个位置的属性后需要关闭对话框才能够进行下一次检索,说明由对话框获得数据(ACCESS中的)已经没有问题。但对话框显示在屏幕的中央,这就挡住了一部分地图,我想把它放在窗口的右下角。请大侠指教以下问题:
1.非模式对话框应该在什么时候构造,放在哪个类中为好
2.非模式对话框具体如何显示,销毁以及销毁的时机
3.如何将对话框在屏幕上定位显示,将对话框的父窗口设置为视图还是框架
4.如果有什么好的方法,可否告知。

解决方案 »

  1.   

    放在视图中最好,方便数据关联替视图类设一成员变量 CTestDlg m_dlg;
    在初始化函数中
    m_dlg.Create(对话框ID,this);//创建
    m_dlg.ShowWindow(SW_SHOW);//显示
    m_dlg.SetWindowPos(....);//设置位置
      

  2.   

    楼上这位大哥,刚才我尝试得到视图的RECT和对话框的RECT,用这个来定位,出错,编译能通过,运行是提示user32模块出错,代码如下:
    CDistributeDlg dlg(distri,this);//根据记录调用对话框显示数据
    CRect *rect1;
    GetWindowRect(rect1);//这里用this->GetWindowRect(rect1)也不行
    CRect *rect2;
    dlg.GetWindowRect(rect2);
    long width=(rect2->right)-(rect2->left);
    long height=(rect2->bottom)-(rect2->top);
    dlg.SetWindowPos(this,rect1->right-width,rect1->bottom-height,0,0,SWP_NOSIZE);
    dlg.DoModal();
    还是模式的方式
      

  3.   

    将GetWindowRect(rect1);以下dlg.DoModal()以上的代码注释后也能编译通过,运行错误相同
      

  4.   

    CRect *rect1;
    GetWindowRect(rect1);
    晕,你定义了指针没有替他分配空间,当然会出错
    CRect rect1;
    GetWindowRect(&rect1);
    或者CRect *rect1=new CRect;
    GetWindowRect(rect1);
    ....delete rect1;
      

  5.   

    void CAnimalView::OnInitialUpdate() 
    {
       CView::OnInitialUpdate();
       // TODO: Add your specialized code here and/or call the base class
       CDC *pdc=this->GetDC();
       pdc->SetMapMode(MM_TEXT);
       GetClientRect(&m_Rectwnd);
       ScreenToClient(&m_Rectwnd);
       m_Distributedlg.Create(IDD_DISTRIBUTE_PAGE,this);//m_Distributedlg 为对话框对象
       m_Distributedlg.SetWindowPos(this,m_Rectwnd.right-130,m_Rectwnd.bottom-  222,0,0,SWP_NOSIZE);
       m_Distributedlg.ShowWindow(SW_RESTORE);
    }
    请大家看一下我的这段代码问题出在哪里,老是调不准,另外如何得到对话框的宽度、高度,并根据此在视图中定位对话。
    解决给分,守信
      

  6.   

    dlg.GetWindowRect()可以得到对话框的高度、宽度。定位的话
    CRect r1, r2;
    dlg.GetWindowRect(&r1);
    GetClientRect(&r2);
    // r1.Width()为宽度
    // r1.Height()为高度
    MoveWindow((r2.right-r1.Width())/2, (r2.buttom-r1.Height())/2,
    r1.Width(), r1.Height());