我想在资源管理器中建立一个对话框,对话框的内容包括一张表,表很长,有一百项左右(每个表项是一个编辑框,有没有更好的办法?)。这样一页肯定容纳不下,需要加上垂直滚动条。可是我的问题是:在资源管理器中创建对话框时,是所见即所得的。即使在对话框的右端加上了一个滚动条,但是由于是在创建阶段,滚动条是不工作的。如何让它向下滚动以便我在下面加上新的编辑框呢?

解决方案 »

  1.   

    可以动态改变对话框大小啊
    SetWindowsPos MoveWindow
      

  2.   

    需要处理WM_HSCROLL/WM_VSCROLL消息
      

  3.   


    // WM_VSCROLL消息
    void   CXXXDlg::OnVScroll(UINT   nSBCode,   UINT   nPos,   CScrollBar*   pScrollBar)   

    //   TODO:   Add   your   message   handler   code   here   and/or   call   default SCROLLINFO scrollinfo; 
    GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
    switch   (nSBCode) 

    case   SB_BOTTOM: 
    ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax)*10); 
    scrollinfo.nPos = scrollinfo.nMax; 
    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
    break; 
    case   SB_TOP: 
    ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin)*10); 
    scrollinfo.nPos = scrollinfo.nMin; 
    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
    break; 
    case   SB_LINEUP: 
    scrollinfo.nPos -= 1; 
    if   (scrollinfo.nPos <scrollinfo.nMin) 

    scrollinfo.nPos = scrollinfo.nMin; 
    break; 

    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
    ScrollWindow(0,10); 
    break; 
    case   SB_LINEDOWN: 
    scrollinfo.nPos += 1; 
    if   (scrollinfo.nPos> scrollinfo.nMax) 

    scrollinfo.nPos = scrollinfo.nMax; 
    break; 

    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
    ScrollWindow(0,-10); 
    break; 
    case   SB_PAGEUP: 
    scrollinfo.nPos -= 5; 
    if   (scrollinfo.nPos <scrollinfo.nMin) 

    scrollinfo.nPos = scrollinfo.nMin; 
    break; 

    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
    ScrollWindow(0,10*5); 
    break; 
    case   SB_PAGEDOWN: 
    scrollinfo.nPos += 5; 
    if   (scrollinfo.nPos> scrollinfo.nMax) 

    scrollinfo.nPos = scrollinfo.nMax; 
    break; 

    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
    ScrollWindow(0,-10*5); 
    break; 
    case   SB_ENDSCROLL: 
    // MessageBox( "SB_ENDSCROLL "); 
    break; 
    case   SB_THUMBPOSITION: 
    // ScrollWindow(0,(scrollinfo.nPos-nPos)*10); 
    // scrollinfo.nPos = nPos; 
    // SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
    break; 
    case   SB_THUMBTRACK: 
    ScrollWindow(0,(scrollinfo.nPos-nPos)*10); 
    scrollinfo.nPos = nPos; 
    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
    break; 
    } CDialog::OnVScroll(nSBCode,   nPos,   pScrollBar); 
    } // WM_HSCROLL 消息
    void   CXXXDlg::OnHScroll(UINT   nSBCode,   UINT   nPos,   CScrollBar*   pScrollBar)   

    //   TODO:   Add   your   message   handler   code   here   and/or   call   default SCROLLINFO scrollinfo; 
    GetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
    switch   (nSBCode) 

    case   SB_LEFT: 
    ScrollWindow((scrollinfo.nPos-scrollinfo.nMin)*10,0); 
    scrollinfo.nPos = scrollinfo.nMin; 
    SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
    break; 
    case   SB_RIGHT: 
    ScrollWindow((scrollinfo.nPos-scrollinfo.nMax)*10,0); 
    scrollinfo.nPos = scrollinfo.nMax; 
    SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
    break; 
    case   SB_LINELEFT: 
    scrollinfo.nPos -= 1; 
    if   (scrollinfo.nPos <scrollinfo.nMin) 

    scrollinfo.nPos = scrollinfo.nMin; 
    break; 

    SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
    ScrollWindow(10,0); 
    break; 
    case   SB_LINERIGHT: 
    scrollinfo.nPos += 1; 
    if   (scrollinfo.nPos> scrollinfo.nMax) 

    scrollinfo.nPos = scrollinfo.nMax; 
    break; 

    SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
    ScrollWindow(-10,0); 
    break; 
    case   SB_PAGELEFT: 
    scrollinfo.nPos -= 5; 
    if   (scrollinfo.nPos <scrollinfo.nMin) 

    scrollinfo.nPos = scrollinfo.nMin; 
    break; 

    SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
    ScrollWindow(10*5,0); 
    break; 
    case   SB_PAGERIGHT: 
    scrollinfo.nPos += 5; 
    if   (scrollinfo.nPos> scrollinfo.nMax) 

    scrollinfo.nPos = scrollinfo.nMax; 
    break; 

    SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
    ScrollWindow(-10*5,0); 
    break; 
    case   SB_THUMBPOSITION: 
    break; 
    case   SB_THUMBTRACK: 
    ScrollWindow((scrollinfo.nPos-nPos)*10,0); 
    scrollinfo.nPos = nPos; 
    SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
    break; 
    case   SB_ENDSCROLL: 
    break; 
    } CDialog::OnHScroll(nSBCode,   nPos,   pScrollBar); 

      

  4.   

    谢谢!滚动条我以前做过,有印象。但是我有一个疑问:按照上面一位网友的说法,要设计两个对话框,一个父对话框,一个子对话框。父对话框只是一个窗口,子对话框才显示真正的内容。但是:创建对话框的函数是CreateDialogParam,这个函数创建对话框的时候,对话框的位置和大小是以模板中的对话框数据创建的。而且这个位置是以屏幕为基准的。不是以父对话框为基准的。但是我在创建子对话框的时候,希望它以父对话框为基准,而且显示的内容也仅限于父对话框以内,这个怎么办?
      

  5.   

    你不会是在用SDK做吧
    把对话框的风格属性设成child
    然后调用Create函数就可以创建啊
      

  6.   

    我就是用SDK,原来对话框的属性还可以设为Child,感谢!
      

  7.   

    表很长,有一百项左右(每个表项是一个编辑框,有没有更好的办法?
    为哈不用listbox呢?
      

  8.   

    惭愧!怎么把对话框的属性设为Child?我找了半天找不到啊?是在资源编辑器里,右击对话框,在弹出的菜单中选“属性”是吗?可是里面几个选项,都没有child属性啊
      

  9.   

    我一急,到资源脚本文件里,把对话框的属性里加了一个WS_CHILD属性,不知可不可以?再到资源编辑器里,发现需要重新装载,重新装载以后,再看对话框的属性,似乎没有什么变化。难道WS_CHILD属性不是在资源编辑器里设的?
      

  10.   

    我也有此疑问。为什么不用ListCtrl
    ////////////////////////////////////////
    资源里面,对话框属性里面可以设置Child
      

  11.   

    项目太多不能用静态方法,
    要用动态的方法,要点:
        1)父窗口:对象指针数组
         2)父窗口初始化:Create
        3)对象:对象中执行语句:如Click(父窗口->postmessage (消息号,函数X))
      4)父窗口: mapmessage(函数X,消息号)
        5)父窗口:退出前清理释放:对象指针数组
      

  12.   

    请问,在资源编辑器里,如何设计对话框的属性为Child?我用的是VC6.0,我看只有“常规”、“样式”、“更多样式”、“扩展样式”、“更多扩展样式”几个,里面没有设置Child的啊,请问在哪个里面?
      

  13.   

    你说的是Listview Control吗?那个好象是通用控件,我的教材里没有介绍这个的,无法使用。汗listBox是不行的,我做的就象一个数据库一样,每条记录有几个字段,一共有100条记录左右。在打开对话框里,要从文件中读入相应的内容。然后在对话框中修改以后,按“确定”再存储到文件中。
      

  14.   

    那就listctrl啊,选择报表格式
      

  15.   

    难道你做软件必须参考教材啊。Listctrl完全实现你目前的要求在“Style”(样式)中“Style”里面选择“Child”(popup,child,overlapped)三选一
      

  16.   

    用List Ctrol很方便啊,我公司里面用的软件就是这样的,上千行的记录,实时的显示,查找,存储,要用编辑框不疯掉了,程序运行几个月都好用的