对话框中函数
OnInitDialog
{。
m_tree.InsertColumn(0, _T(MY_STRING_ID(IDS_STRING34384)), LVCFMT_LEFT, lx / 6);
m_tree.InsertColumn(1, _T(MY_STRING_ID(IDS_STRING34385)), LVCFMT_LEFT, lx / 6);

}ONSIZE((UINT nType, int cx, int cy)
{
lx = cx ;   //lx定义为对话框类的私有成员。
}我调试跟踪程序,会发现运行过程是
先调用ONSIZE的到lx为255,然后调用OnInitDialog,
m_tree.InsertColumn(0, _T(MY_STRING_ID(IDS_STRING34384)), LVCFMT_LEFT, lx / 6);
m_tree.InsertColumn(1, _T(MY_STRING_ID(IDS_STRING34385)), LVCFMT_LEFT, lx / 6);
设置CLISTCTRL的栏目
最后再次调用ONSIZE,得到lx为755.(因为对话框的父窗口指定了对话框大小为最大化窗口)
可是此时CLISTCTRL的标题栏目已经在OnInitDialog设置完成了。我本来想动态调整CLISTCTRL栏目宽度,用lx记住CLISTCTRL的宽度,可现在由于运行顺序造成我用的是lx的第一次值,可我需要的是lx的第二次值。高手来啊。我想我应该说清楚啦。有什么方法可以解决我这个问题。
m_tree.InsertColumn(0, _T(MY_STRING_ID(IDS_STRING34384)), LVCFMT_LEFT,100);
m_tree.InsertColumn(1, _T(MY_STRING_ID(IDS_STRING34385)), LVCFMT_LEFT, 100);这样可以,但我不想设置的太固定。

解决方案 »

  1.   

    不明白,想动态调整CLISTCTRL栏目宽度用CListCtrl::SetColumnWidth不就可以么
      

  2.   

    也不明白想说什么……
    取CLISTCTRL实际宽度:
    RECT   rect;   
      m_wbxListCtrl.GetWindowRect(&rect)   
      long   width   =   rect.right   -   rect.left;   
      for   (int   i   =   0;   i   <   3;   i++)   
      {   
          m_wbxListCtrl.SetColumnWidth(i,   width   /   3);   
      }
      

  3.   

    如果想动态调整控件的大小,那么你应该在OnSize中去调整尺寸,而不应该在OnInitDialog中进行。
    如果你希望列表控件和对话框一样框,然后再平均分配每个栏的大小,你可以获得对话框的大小(不用cx参数,用GetClientRect获取),再用列表控件的MoveWindow设置其位置。再用楼上的方法调整每个栏的大小。
      

  4.   

    for  (int  i  =  0;  i  <  5;  i++)  
    {  
    m_wndSoftCur.SetColumnWidth(i,  cx  /  5);  
    }怎么会出错呢
      

  5.   

    void CSoftPage::OnSize(UINT nType, int cx, int cy)
    {
    CDialog::OnSize(nType, cx, cy); int lx = cx / 2; if (nType == SIZE_RESTORED || nType == SIZE_MAXIMIZED)
    {
    CWnd* child;
    child = GetDlgItem(IDC_LIST1);
    if (child != NULL)
    {
    child->MoveWindow(0, 0, cx/2-LINERECT, cy);
    }
    child = GetDlgItem(IDC_LIST2);
    if (child != NULL)
    {
    child->MoveWindow(cx/2+LINERECT, 0, cx/2-LINERECT, cy);
    }
    }
    if(m_wndSplitter.GetSafeHwnd()) 

    m_wndSplitter.MoveWindow(cx/2-LINERECT, 0, LINERECT * 2, cy); 
    } for  (int  i  =  0;  i  <  5;  i++)  
    {  
    m_wndSoftCur.SetColumnWidth(i,  lx  /  5);  
    m_wndSoftBase.SetColumnWidth(i,  lx  /  5);  
    }
    }两个左右LIST的COLUMN都是等宽。可是加
    for  (int  i  =  0;  i  <  5;  i++)  
    {  
    m_wndSoftCur.SetColumnWidth(i,  lx  /  5);  
    m_wndSoftBase.SetColumnWidth(i,  lx  /  5);  
    }
    就出错
      

  6.   

    你要先判断m_wndSoftCur.m_hWnd!=NULL才行
      

  7.   

    在首次执行OnSize时,对话框上的控件与变量之间还没有建立关系,所以直接用变量控制控件会出错,要判断变量的m_hWnd是否有效。