Windows学习笔记8——文字输出<二>

来源:互联网 发布:电脑打开软件迟钝 编辑:程序博客网 时间:2024/05/13 05:51

1、卷动列

      <1>、 在Windows应用程序中包含卷动列的方法:

      CreateWindow的第三个参数(dwStyle):包含窗口风格标识WS_VSCROLL(垂直卷动),WS_HSCROLL(水平卷动)。

      <2>、卷动列的范围与位置

      *每个卷动列都有一个范围和位置的概念。

      *范围:由一对整数组成,分别代表最小值和最大值;位置:卷动方块在范围内的值。

      *当卷动方块在卷动列的顶部(或左端)时,卷动方块的位置是范围的最小值;当卷动方块咋卷动列的底部(或最右端)时,卷动方块的位置是范围的最大值。内定的卷动范围是0到100;

      *卷动方块的位置总是离散的整数值。

      *改变卷动列的范围可调用:SetScrollRange(hwnd, iBar, iMin, iMax,bRsdraw);

      *得到卷动列的当前范围:GetScrollRange函数;

      *在卷动列范围内设置卷动方块的位置:SetSrcollPos(hwnd,iBar,iPos, bRedraw);

      *得到卷动方块的当前位置:GetScrollPos函数;

     <3>、Window系统对卷动列的处理:

               *处理所有卷动列鼠标事件;

               *当使用者在卷动列内点击鼠标时,提供一种“反相显示”的闪烁;

               *当使用者在卷动列内拖动卷动方块时,移动卷动方块;

               *为包含卷动列的窗口的窗口过程发送卷动列消息;

           程序写作者应该完成的工作:

               *初始化卷动列的范围和位置;

               *处理窗口过程的卷动列消息;

               *更新卷动列内卷动方块的位置;

               *更新显示区域的内容以回应卷动列的改变;

      <4>、卷动列消息:

        在用鼠标单击卷动列或者拖动卷动方块时,Windows给窗口过程发送WM_VSCROLL(汞上下移动)或WM_HSCROLL(供水平移动)。在卷动列上每个鼠标动作都至少产生两个消息,鼠标按下,鼠标弹起;

        WM_VSCROLL和WM_HSCROLL消息的两个参数,lParam只用于作为子窗口而建立的卷动列(通常在对话框内),wParam参数被分为一个低字组和一个高字组。

        wParam的低字组是一个数值,它指出鼠标对卷动列进行的操作,也称“通知码”。(是以SB(scroll bar)打头的识别字);在wParam的低字组是“SB_THUMBPOSITION”或“SB_THUMBTRACK”时,wParam的高字组指定卷动方块的当前位置;对于其他的卷动列操作,wParam的高字组应该被忽略。

      注意SB_THUMBTRACK和SB_THUMBPOSITION通知码:

      *为了给使用者提供回馈,Windows在用户用鼠标拖动卷动方块时移动它,同时你的程序会收SB_THUMBTRACK消息,但是,如果程序写作者不通过调用SetScrollPos来处理SB_THUMBTRACK或SB_THUMBPOSITION消息,在使用者释放鼠标键时,卷动方块会迅速跳回原来位置。

      *程序一般不同时处理SB_THUMBTRACK和SB_THUMBPOSITION消息,如果处理SB_THUMBTRACK消息,在使用者拖动卷动方块时,程序写作者移动显示区域的内容;但是如果处理SB_THUMBPOSITION消息,则只需要在使用者停止拖动卷动方块时移动显示区域的内容。

      <5>、作为应用程序窗口一部分的卷动列(通过指定CreateWindow的第三个参数而建立的),永远不会接收到SB_TOP 、SB_BOTTOM、SB_LEFT、SB_RIGHT通知码。

       <6>、应用举例

case WM_VSCROLL:
   switch(LOWORD(wParam))
   {
   case SB_LINEUP:
     scrollPos -= 1;
     break;
   case SB_LINEDOWN:
     scrollPos += 1;
     break;
   case SB_PAGEUP:
     scrollPos -= cyClient/cyChar;
     break;
   case SB_PAGEDOWN:
     scrollPos += cyClient/cyChar;
     break;
   case SB_THUMBPOSITION:
    //SetScrollPos(hwnd, SB_VERT, HIWORD(wParam), TRUE);//设置卷动方块的位置为当前拖动到的位置
     scrollPos = HIWORD(wParam);
     break;
   default :
    break;
   }

      <7>、绘图程序的组织

       *最好在窗口过程响应WM_PAINT消息时,进行显示区域的绘图;如果需要在代码其他地方绘制显示区域,可以使用InvalidateRect函数使显示区域无效(它会发送WM_PAINT消息到消息队列);

       *如果希望在显示区域无效后,立刻更新显示区域,可以在调用InvalidateRect函数之后调用UpdateWindow函数,如果显示区域中存在无效区域,则UpDateWIndow将导致Windows用WM_PAINT消息调用窗口过程,注意:这一WM_PAINT消息不进入消息队列,直接由Windows调用窗口过程,然后返回控制到UpdateWindow之后的代码。

 

2、Win32API中的新函数——卷动列资源函数

       SetScrollRange、SetScrollPos、GetScrollRange、GetScrollPos函数是过时的,但仍可以使用;

下面介绍功能更强大的SetScrollInfo和GetScrollInfo。

       SetScrollRange和GetScrollInfo 更加的新功能:

       *可以改变卷动方块的大小

       近似公式:         卷动方块的大小/卷动列的长度

                             =   页面大小/范围

                             =   显示的文件数量/文件的总大小

      *更加卷动列的范围最大为真正的32位值

注意:卷动方块的大小与页面大小正相关,(SCROLLINFO结构中的nPage值)

      <1>、函数原型:

               int SetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi, BOOL fRedraw);  

               BOOl GetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi);

               参数:

               hwnd:滚动条控件句柄或含有标准滚动条的窗口的句柄,这取决于fnBar参数的值;

               fnBar:可以是SB_CTL、SB_HORZ、SB_VERT之一;当为SB_CTL时,获取滚动条控件参数,此时hwnd参数必须是滚动条控件句柄。

               lpsi:SCROLLINFO结构指针;

               fRedraw:重绘标志。

       <2>、注意PAINTSTRUCT结构中的rcPaint参数,这是需要重绘的矩形区域,其坐标相对于客户区。

       PAINTSTRUCT ps;

       ps.rcPaint.top 或ps.rcPaint.bottom,可以在绘图时灵活使用这些重绘矩形的相关信息。

       <3>、关于重绘区域(右图阴影区域)

      

     

0 0