“ 用ScrollWindow来滚动客户区的内容,而不是重绘 ” ,例如上滚;
ScrollWindow 就把 图 向上移动。 他本身不绘什么。而 图上移后 , 下面 缺的 部分, 应该 在 OnPaint 补上。

解决方案 »

  1.   

    我不是用的MFC,用API做的,我把整个消息处理函数都发上来,对话框本身比较大,所以初始化的时候设置的比较小,就为了用滚动条,我根本就没有WM_PAINT的处理,但是用ScrollWindow一样把下面的部分移动上来了,运行都正常的!用ScrollWindowEx就是下面什么也没有!BOOL CALLBACK GoToProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) 

    switch (message) 

        case WM_INITDIALOG: 
    {
    RECT rc;
    ::GetWindowRect(hwndDlg,&rc);
    ::SetWindowPos(
    hwndDlg,             // handle to window
    NULL,  // placement-order handle
    5,                 // horizontal position
    5,                 // vertical position
    rc.right-rc.left,                // width
    200,                // height
    NULL            // window-positioning options
    );

    }
    return TRUE; 
    case WM_VSCROLL :
    {
    switch(LOWORD(wParam))
    {
    case SB_LINEDOWN:
    {
    ScrollWindow(
    hwndDlg,              // handle to window
    0,            // horizontal scrolling
    -20,            // vertical scrolling
    NULL,     // client area
    NULL  // clipping rectangle
    );
    }
    break;
    }
    }
    return TRUE;

        case WM_COMMAND: 
    switch (LOWORD(wParam)) 

             case IDOK: 

    return TRUE; 

             case IDCANCEL: 
    DestroyWindow(hwndDlg); 
    ::PostQuitMessage(0);
    return TRUE; 


    return FALSE; 
      

  2.   

    "我根本就没有WM_PAINT的处理,但是用ScrollWindow一样把下面的部分移动上来了,"
    不是“我根本就没有WM_PAINT的处理” 而是 使用 默认的 。
      

  3.   

    int ScrollWindowEx (HWND hwnd, // 发生滚屏的窗口的句柄
              int dx, // 水平滚屏的数值
              int dy, // 垂直滚屏的数值
              CONST RECT*prcScroll,//记录发生滚屏的矩形区域的RECT结构体的地址
              CONST RECT* prcClip, //记录发生剪切的矩形区域的 RECT结构体的地址
              HRGN hrgnUpdate,// 需要更新区域的句柄
              LPRECT prcUpdate, // 记录需要更新矩形区域的 RECT结构体的地址
              UINT flags // 滚屏控制标志这个 Flagstaff为:
    SW_ ERASE当和 SW_INVALIDATE值同时使用时,会通过向 window发送一个WM_ ERASEBKGND消息将最近变得无效的区域抹去;
      SW_INVALIDATE在发生滚屏后使由hrgnUpdate参数指定的区域无效;
      SW_SCROLLCHILDREN使所有的子窗口都发生滚屏;
      SW_ SMOOTHSCROLL在 Windows 95及以后的版本中使窗口发生平滑滚屏。返回值:如果函数运行成功,返回值为SIMPLEREGION(矩形的无效区域),COMPLEXREGION(非矩形的无效区域)或NULLREGION(没有使无效的区域)如果函数运行失败,返回值为ERROR。请 检查 返回值 !
      

  4.   

    SW_ ERASE|SW_INVALIDATE  返回 2
    SW_INVALIDATE     返回 2
    SW_SCROLLCHILDREN     返回 2
    SW_ SMOOTHSCROLL     编译错误 error C2065: 'SW_SMOOTHSCROLL' : undeclared identifier
      

  5.   

    ScrollWindowEx(hwnd, -xDelta, -yDelta, (CONST RECT *) NULL, 
                (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, 
                SW_INVALIDATE); 
            UpdateWindow(hwnd); MSDN上有例子代码的。
    另外你可以使用CScrollHelper类,codeproject上搜索一下,很容易使用的。
      

  6.   

    “SW_SMOOTHSCROLL:Windows NT 5.0或以上版本中:使用平滑滚动。”
    返回值为SIMPLEREGION(矩形的无效区域),COMPLEXREGION(非矩形的无效区域)或NULLREGION(没有使无效的区域)
    2 =COMPLEXREGION 吧
      

  7.   

    向是 下面 没有 重绘, invalidate 看看。
      

  8.   

    搜索"SYSMET3"
    是"windows  编程(5版)"的例子
      

  9.   


    看过了,使用的textout函数,所以我在开始问 “ 而且关于窗口滚动的例子代码,都是滚动文本,用的是TextOut函数,我这是个对话框,客户区上面是控件不是文本,不能用TextOut吧,该把TextOut函数换成哪个函数呢?? ”
      

  10.   

    不是用不用TextOut的问题,重点是如何Paint 滚动后的区域
      

  11.   

    用CScrollHelper这个类,代码自己看下就知道了,跟你需求完全吻合http://www.codeproject.com/Articles/10902/Add-Scrolling-to-a-CWnd-or-CDialog-using-a-C-Helpe
      

  12.   

    谢谢大家,滚动的问题解决了,可是那个问题还是不明白,“ 用ScrollWindow来滚动客户区的内容,而不是重绘 ” 不是说只要客户区的内容发生变化就要重绘吗?向上移动了不还是要整个客户区显示都变了,虽说一部分内容没变,但是位置变了,在新的位置重新画出来那些内容,不都要重绘吗?就连移动一下窗口都要重绘,如果滚动不算重绘,到底什么是重绘??而且ScrollWindow也发送WM_PAINT消息的
      

  13.   

    "SYSMET3" 上不是说得很清楚了吗.
    1. ScrollWindow 滚动客户区的内容,而不是重绘, 指的说显示器缓冲区的起始地址改了.
    2. 会给窗口发重绘消息,要求用户把 空出来的部分 填满(因为滚动而未被覆盖的).
    3. ScrollWindow  不是GDI函数 (不要求dc).