为啥WM_SIZE会在WM_INITDIALOG之前发生?
这导致我在动态调整控件布局时崩溃...

解决方案 »

  1.   

    这是确定窗口的大小的。
    你下次改变窗口大小时还会发送WM_SIZE消息的。
      

  2.   

    设置个信号量bCreated不就行了
    OnInitDialog里控件初始化完毕后,bCreated = TRUE;
    OnSize()里,
    if (bCreated)
    //然后再调整布局,第一次初始化时先不调整布局
      

  3.   

    palmax(南宫煌)的方法不可取,有时初始化完后不走OnSize的,OnSize只在大小改变时执行。
      

  4.   

    几个函数的运行顺序是这样的: 
    Create => OnCreate => OnSize => OnInitDialog
    楼上的调查了再发言
      

  5.   

    请问楼上,如果lz把它的布局方法写在了OnSize里,照你那样做,同时按照你的说法,先走OnSize,再OnInit,窗口打开后能看的到初始化布局么?(如果控件最初摆放也是用MoveWindow的话)不知道我说了什么就使得你给这几个方法排了个序。不否认,你没搞错,在一般情况下,先OnSize再OnInit窗口就出来了,可是如果初始化后又调了MoveWindow之类的方法,窗口会在你看到它之前再走N次OnSize的。这种情况太常见了。我说的是这个意思。所以,如果按照你的说法,lz需在OnInit里初始化布局,再在OnSize里面调整布局。我这样可以把它们都放进OnSize归为一个方法,也比你少一个变量,明白?
      

  6.   

    呵呵,我们都没有说错什么,只是大家都不知道楼主具体是怎么实现的,如果对MFC的机制比较熟悉的话,应该不会犯你说的那种错误
      

  7.   

    我只是不同意你说的  "有时初始化完后不走OnSize的"
    请你证明你一下什么时候不走?
      

  8.   

    好久了才想起这个,谢谢各位。
    因为我要得到各个控件的位置就得有控件窗体句柄,所以,即使对话框的窗体句柄有效,控件的也不一定有效(对话框刚刚创建,然后OnSize)。
    所以不能在OnSize中使用GetSafeHwnd这种方法,只能在OnInitDialog中设个标记。