none
vs2008下的调用DoModal()产生非模式对话框 RRS feed

  • 问题

  • windowsxp。vs2008。

    新建一个对话框对象,然后调用DoModal()显示,结果发现父窗口竟然还能获得焦点。百思不得其解。

    还有一个问题。我新建一个对话框对象,但不调用DoModal()。后面我直接操作这个对话框的某个函数。而这个函数会对该对话框变量进行操作。运行的时候出错。经过调试,是在对一个对话框变量m_list操作的时候报错。

    2010年4月5日 11:05

答案

  • 确定子窗口风格是WS_CHILD,并且其父窗口是你的这个窗口。

    最好用SPY++把窗口风格发上来,可能还是子窗口风格不对。


    0xBAADF00D
    • 已标记为答案 felix9 2010年4月5日 12:06
    2010年4月5日 11:18
    版主

全部回复

  • 确定子窗口风格是WS_CHILD,并且其父窗口是你的这个窗口。

    最好用SPY++把窗口风格发上来,可能还是子窗口风格不对。


    0xBAADF00D
    • 已标记为答案 felix9 2010年4月5日 12:06
    2010年4月5日 11:18
    版主
  • 问题一:  这种情况应该是对话框出现了不应该的嵌套调用导致的,消息跑到了父窗口的消息循环上,我说的只是一种情况哈,也许还有别的问题。

    问题二:  我不知道你的m_list 是什么类型的变量,我猜应该是一个控件吧。 你这种情况是这样的: 当你创建了一个对话框对象时,这个对象只在内存中占有字节,但是与其关联的用来显示的窗口还没有创建,也就是说这个对话框还没有关联一个有效的Handle。 如果你的对话框不想用DoModel 显示,那也应该用CDialog::Create() 方法把对话框窗体创建出来。

     

    2010年4月5日 11:23
    版主
  • 我找到这个属性,然后改为child。结果新建的对话框直接在原对话框的面板上绘制,很别扭。而不是另外弹出来一个对话框。我把style改为Overlapped后就可以了。
    2010年4月5日 11:39
  • 问题一:  这种情况应该是对话框出现了不应该的嵌套调用导致的,消息跑到了父窗口的消息循环上,我说的只是一种情况哈,也许还有别的问题。

    问题二:  我不知道你的m_list 是什么类型的变量,我猜应该是一个控件吧。 你这种情况是这样的: 当你创建了一个对话框对象时,这个对象只在内存中占有字节,但是与其关联的用来显示的窗口还没有创建,也就是说这个对话框还没有关联一个有效的Handle。 如果你的对话框不想用DoModel 显示,那也应该用CDialog::Create() 方法把对话框窗体创建出来。

     

    我的想法是在后台建立这个对话框,但不显示出来,而是在后台运行工作,等到需要的时候再出现。我用了Creat,但新建这个对话框对象的时候出错了。可能是我用错这个creat函数了。正确该怎么用。
    2010年4月5日 11:48
  • 先new一个对话框对象,然后调用Create传入一个父窗口句柄。需要的时候再show出来
    麻烦把正确答案设为解答。
    2010年4月5日 12:02
    版主