本人自己制作了一个基于cdialog based的窗口,窗口比较宽,超出了我笔记本的宽度,所以自己添加了一个 横方向的滚动条
,经过一些列的代码添加,现在滚动挑可以滚动,但是窗口界面不移动,超出的界面看不到,请问是否是还要在OnPaint()事件里面添加什么么?首先我列出我修改的代码
一,新建一个基于对话框的工程Ex081122。 
二,在上面增加一个滚动条控件,并为其关联一个水平滚动条控件,命名为(IDC_SCROLLBAR2 
三,在CEx081122Dlg::OnInITDialog的初始化函数中加上如下代码: 
CScrollBar* pSB=(CScrollBar*)GetDlgItem(IDC_SCROLLBAR2); //这里用于选择是那个进度条
pSB->SetScrollRange(0,100);//n
m_scroll.SetScrollPos(0); 
四,利用类向导为主对话框增加WM_HSCROLL消息的响应函数。 
void CEx081122Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 

if(SB_LINERIGHT == nSBCode) 
{//点击右键头 
int iCurPos = pScrollBar->GetScrollPos(); 
pScrollBar->SetScrollPos(iCurPos+1); 
CString strTITle ; 
strTITle.Format("滚动条的值是:%d",iCurPos+1); 
SetWindowText(strTITle); 

else if( SB_THUMBPOSITION == nSBCode ) 
{//拖动 
pScrollBar->SetScrollPos(nPos); 
CString strTITle ; 
strTITle.Format("滚动条的值是:%d",nPos); 
SetWindowText(strTITle); 
} CDialog::OnHScroll(nSBCode, nPos, pScrollBar); 
现在添加完后,滚动条是可以滚动了,但是那个主窗口dialog不移动,导致右边超出部分界面看不到,各位高手请帮忙

解决方案 »

  1.   

    你叫dlg滚动不容易,不如在dlg中放个大的edit控件,否则你需要根据滚动位置自己画dlg,(WM_PAINT)
      

  2.   

    前辈,有2个问题
    1.我的窗口里面放了30多个按钮,其余没什么,您的意思是我把这些按钮都放到edit控件里面么?
    2 请问edit控件放上去之后,我把按钮都放到这个大的eidt控件里面,之后应该怎样弄呢?能否详细说明下呢?给个代码,辛苦啦!
      

  3.   


    前辈,有2个问题
    1.我的窗口里面放了30多个按钮,其余没什么,您的意思是我把这些按钮都放到edit控件里面么?
    2 请问edit控件放上去之后,我把按钮都放到这个大的eidt控件里面,之后应该怎样弄呢?能否详细说明下呢?给个代码,辛苦啦!
      

  4.   

    30多个按钮?你是要滚动按钮?还是滚动text
      

  5.   

    可以这样做哈,create一个wnd,将按钮都以这个wnd作为父窗口,在滚动条消息OnHScoll和OnVScoll中动态移动cwnd,不过这样可能界面会闪,对话框加滚动条很麻烦的,还要计算坐标什么的
      

  6.   

    不如加一个按钮“more”,把dlg分成2个界面。
      

  7.   

    前辈,我的按钮即那个button空间,我把他们放到dialog上面的,比较宽,所以显示的时候,超出部分上面放的button控件就看不到了。我想加入滚动条让窗口滚动,能看到,能解决么?
      

  8.   

    这个大哥,计算坐标我滚动条可以计算呀,滚动多少,都有的,就是不知道在哪里输入什么代码,可以让我按滚动条的时候,把超出屏幕界面的那些在dialog上面的button控件 按钮 给显示出来。
      

  9.   

    就是基于dialog那个主窗口,主窗口我调的很大,很宽,很高,希望通过滚动条,把上面的所有button控件都能显示出来,
      

  10.   

    我目前的想法是在OnPaint()函数里面重绘。上面滚动条设置那个代码是我测试好了的,可以用的,就是滚动条水平移动的时候,那个顶部标题会有数字变动,接下来希望窗口重绘区域能给从滚动条移动的起始位置开始重绘,比如水平移动了40像素,希望dialog重绘的时候从对话框最左端向右40像素的位置开始重绘,把剩余的部分绘出到屏幕上,怎么改动呢》
    这是没有改动的代码,大家看下该怎么改?假设这里从偏离对话框最左边40像素开始绘图
    void CMy2017Dlg::OnPaint() 
    { if (IsIconic())
    {
    CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle中心在客户端矩形图标
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
    dc.DrawIcon(x, y, m_hIcon); }
    else
    {   
    CDialog::OnPaint();
    }
    }
      

  11.   

    14楼正解。
    对话框的OnPaint是没用的,因为它只能重画对话框窗口本身,而你的控件是对话框的子窗口,它们如何重画跟对话框一点关系都没有。
      

  12.   

    可以考虑下工程用单文档基于CFormView来做
      

  13.   

    贴个图上来。另外, 我把按钮做成CListCtrl的Item。让List帮你滚吧。或者派生CScrollView试试。
      

  14.   

    给你VERTICAL的例子看看:void CAboutDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    // TODO: Add your message handler code here and/or call default
    //
    int now=m_SbVert.GetScrollPos();
    int vert=0;
    switch (nSBCode)
    {
    case SB_LINEUP:
    vert=-10;
    break;
    case SB_LINEDOWN:
    vert=10;
    break;
    case SB_PAGEUP:
    vert=-40;
    break;
    case SB_PAGEDOWN:
    vert=40;
    break;
    }
    m_SbVert.SetScrollPos(now+vert);
    //clean dlg
    Invalidate();//清除对话框
    //
    int ID=0;
    CWnd *hwndChild = this->GetWindow(GW_CHILD);
    HWND hChild = ::GetWindow(hwndChild->m_hWnd,GW_HWNDFIRST);
    while(hChild)
    {//枚举所有子窗口,因为有几个是动态产生的,随意的ID
    ID=::GetDlgCtrlID(hChild);
    if(IDC_SCROLLBAR_VERT==ID)
    {//滚动条不能移动
    hChild = ::GetWindow(hChild,GW_HWNDNEXT);
    continue;
    }
    // char txt[260];
    // ::GetWindowText(hChild,txt,260);
    // afxDump << txt << " " <<  ID << "\n";;
    CRect rc;
    ::GetWindowRect(hChild,&rc);//screen
    ScreenToClient(rc);
    rc.top    += vert;
    rc.bottom += vert;
    ::MoveWindow(hChild,rc.left,rc.top,rc.Width(),rc.Height(),FALSE);
    //
    hChild = ::GetWindow(hChild,GW_HWNDNEXT);
    }
    }
      

  15.   

    看这个例子,可以滚动对话框内的子控件
    http://www.codeproject.com/KB/dialog/scrolling_support.aspx
      

  16.   

    两种解决:
    (一):修改你的第二步:
    “二,在上面增加一个滚动条控件,并为其关联一个水平滚动条控件,命名为IDC_SCROLLBAR2”
    这是不必的,你将对话框的属性“Horizontal scroll”选上,窗口就出现了水平滚动条控件。再增加WM_HSCROLL消息的响应函数就可以了。
    (二):也采用你的第二步: 
    “二,在上面增加一个滚动条控件,并为其关联一个水平滚动条控件,命名为IDC_SCROLLBAR2”
    (1)接着在classWizard中为水平滚动条控件添加变量CScrollBar m_prejilu;
    (2)在OnInitDialog函数中加m_prejilu.SetScrollRange(0,250);
    (3)增加WM_HSCROLL消息的响应函数:  
    void CMy1Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    int minpos;
       int maxpos;
       pScrollBar->GetScrollRange(&minpos, &maxpos); 
       maxpos = pScrollBar->GetScrollLimit();   // Get the current position of scroll box.
       int curpos = pScrollBar->GetScrollPos();   // Determine the new position of scroll box.
       switch (nSBCode)
       {
       case SB_LEFT:      // Scroll to far left.
          curpos = minpos;
          break;   case SB_RIGHT:      // Scroll to far right.
          curpos = maxpos;
          break;   case SB_ENDSCROLL:   // End scroll.
          break;   case SB_LINELEFT:      // Scroll left.
          if (curpos > minpos)
             curpos--;
          break;   case SB_LINERIGHT:   // Scroll right.
          if (curpos < maxpos)
             curpos++;
          break;   case SB_PAGELEFT:    // Scroll one page left.
       {
          // Get the page size. 
          SCROLLINFO   info;
          pScrollBar->GetScrollInfo(&info, SIF_ALL);
       
          if (curpos > minpos)
          curpos = max(minpos, curpos - (int) info.nPage);
       }
          break;   case SB_PAGERIGHT:      // Scroll one page right.
       {
          // Get the page size. 
          SCROLLINFO   info;
          pScrollBar->GetScrollInfo(&info, SIF_ALL);      if (curpos < maxpos)
             curpos = min(maxpos, curpos + (int) info.nPage);
       }
          break;   case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position
          curpos = nPos;      // of the scroll box at the end of the drag operation.
          break;   case SB_THUMBTRACK:   // Drag scroll box to specified position. nPos is the
          curpos = nPos;     // position that the scroll box has been dragged to.
          break;
       }   // Set the new position of the thumb (scroll box).
       pScrollBar->SetScrollPos(curpos);
    m_prezuobiao=curpos;   //qianshendraw();
       
    CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
    //m_prejilu.SetScrollPos(nPos);
    }