PowerBuilder应用开发系列讲座(15)


PowerBuilder的事件(续)

列表框消息(前缀:pbm_lb)
        addstring       向列表框控件中增加一项或一个字符串
        deletestring    从列表框中删除一项或一个字符串  
        dir             用目录列表填充列表框        
        findstring      在列表框中搜索与所给字符串部分匹配的第一项      
        findstringexact 在列表框中搜索与所给字符串精确匹配的第一项      
        getcaretindex   在列表框中搜索拥有聚焦的项      
        getcount        确定列表框中的项数      
        getcursel       确定所选项是第几项      
        gethorizontalextent 获得列表框的宽度、计算水平卷滚     
        getitemheight   确定列表框控件中项的高度        
        getitemrect     确定列表框的尺寸        
        getsel          获得列表框中当前所选的项    
        getselcount     在多选列表框中获得所选项的数目  
        getselitems     用列表框中表框各自的项号填充一个给定的整数数组  
        gettext         获得列表框中当前所选项的文本        
        gettextlen      获得列表框中当前所选项的文本中的字符数  
        gettopindex     确定列表框中可见的最上面一项的项号      
        insertstring    向列表框中加入一个新字符串      
        resetcontent    重置(消除)列表框中的内容        
        selectstring    搜索并加亮与所给字符匹配的字符串        
        selitemrange    选择/取消列表框中某一范围中的项 
        setcaretindex   设置列表框中的某一项拥有聚焦    
        setcolumnwidth  设置列表框中列的宽度    
        setcursel       在列表框中选择并加亮一项;如果需要,卷滚到列表框  
        sethorizontaltext   设置列表框中被水平卷滚的单元数      
        setitemdata     设置与列表框相关的32位/4字节值  
        setitemheight   设置列表框中项的高度。  
        setsel          在列表框中选择一个字符串    
        settabstops     设置列表框控件中tabstops的位置  
        settopindex     卷滚列表框使特定的项成为可见的最上面一项
列表框通知消息(前缀:pbm_en)
        dblclk          用户在列表框控件中的某一项上双击
        errspace        用户试图超越可在列表框中输入字符的最大限制      
        selcancel       当前选取文本被取消      
        selchange       用户在列表框中选择或取消了一项
窗口消息(前缀:pbm_)
        activateapp     被激活的窗口属于另外一个应用
        askcbformatname 要求剪贴板中的内容被复制到一个使用自定义格式的文本缓冲区中      
        char            传送键盘上按下的键  
        chartoitem      通过转换键盘来的字符,帮助列表框定位其中的项     
        childactivate   一个子窗口被移动或激活  
        clear           用户要删除当前编辑器控件中的内容    
        command         用户选择了一个菜单项、控件,或使用了加速键   
        compacting      系统内存资源不足;当Windows占用了多于1/8的CPU时间紧缩内存时,产生这条消息 
        compareitem     当新的一项被加入列表框或组合框时产生此消息,Window用这条消息进行项之间的比较     
        ctlcolor        一个控件即将被画出,可在此时改变控件的颜色       
        deadchar        用户选择了一种非英语字符集或其它特殊字符集,这将改变下面将要输入的字符
        deleteitem      从列表框或通用对话框中移去一项  
        destroyclipboard    剪贴板内容被清除    
        devmodechanged      WIN.INI中的一个设备名被修改 
        drawclipboard   剪贴板内容发生改变      
        drawitem        列表框或通用对话框的一项内容被改变      
        dropfiles       当鼠标左键在一个注册为拖放文件接受器的应用上释放时,发出该消息   
        erasebkgnd      窗口的客户区需要重画    
        fontchange      应用可用的字体数改变    
        getdlgcode      通知消息,说明当前使用哪种类型的键盘     
        getfont         获取当前激活的字体  
        getminmaxinto   Windows正在检查最小化或最大化窗口的尺寸 
        gettext         从一个控件(如按钮或编辑器控件)中复制文本到一个内存缓冲区    
        gettextlength   用来确定一个控件中的字符数      
        hscrollclipboard    剪贴板的水平卷滚条被使用    
        iconerasebkgnd  一个最小化窗口需要重化背景      
        initdialog      一个对话框即将被显示    
        initmenu        一个菜单即将被显示      
        initmenupopup   一个弹出式窗口即将被显示        
        keydown         键盘上的一个键被按下        
        keyup           键盘上的一个键被释放        
        mdiactive       一个MDI子窗口(表单)被激活       
        mdicascade      以重叠的形式重排所有的表单      
        mdicreate       创建一个表单    
        mdidestroy      从MDI框架中移去一个表单 
        mdigetactive    获得当前活动的MDI表单的句柄     
        mdiiconrange    在一个MDI框架中重排最小化表单的图标     
        mdimaximize     最大化一个MDI子表单     
        mdinext         激活下一个MDI表单(紧接着活动表单的表单)     
        mdirestore      把MDI表单恢复到它原来的大小     
        mdisetmenu      将一个菜单与一个MDI表单联系起来 
        mdifitle        平铺所有的MDI表单       
        measureitem     这个消息被送给即将创建的、内有按钮或其它控件的窗口      
        menuchar        用户使用了一个快捷键,但系统不支持该快捷键       
        menuselect      用户选择了一个菜单项    
        mouseactivate   用户在一个非活动窗口中点击了鼠标        
        mousemove       用户移动了鼠标  
        ncactivate      窗口的非客户区即将被激活        
        nccalcsize      窗口的尺寸需要重新计算  
        nccreate        窗口即将创建它的非客户区        
        ncdestroy       窗口的非共享区被析构    
        nchittest       每次非客户区被移动时都发送该消息        
        nclbuttondblclk 用户在非客户区双点了鼠标左键    
        ncpaint         非客户需要画出      
        nextdlgctl      在对话框中将聚焦转给另一个控件  
        paint           窗口的客户区需要被画出      
        paintclipboard  剪贴板应用有剪贴操作,剪贴板查看器需重画 
        palettechanged  系统调色板被改变         
        paletteischanging   系统调色板即将被改变        
        parentnotify    通知父窗口一个子窗口即将被创建  
        querydragicon   用户要拖一个最小化窗口  
        queryendsession 通知消息,说明窗口即将被关闭     
        querynewpalette 应用即将收到输入聚焦,应该执行必要的颜色调整     
        queryopen       一个最小化窗口即将被恢复        
        quit            应用处理的最后一个消息      
        renderallformats    通知一个剪贴板格式的拥有者,应用将失去所有的格式     
        renderformats   通知消息,说明放在剪贴板中的数据应该用一种特殊格式传送   
        setcursor       通知消息,说明鼠标指针在一个窗口中移动    
        setfont         用来在对话框中改变字体      
        setredraw       在加一个新项之前发送给列表框或通用对话框        
        settext         用来改变窗口的标题或文本    
        sizeclipboard   剪贴板查看器应用改变尺寸        
        spoolerstatus   一个打印管理器任务被添加或删除  
        syschar         <ALT>键和其它某键同时被按下       
        syscolorchange  一种或多种系统颜色被改变        
        syscommand      用户选择了一个系统菜单命令      
        sysdeadchar     通知消息,说明一种非英语字符集被选定     
        syskeydown      用户按下某键的同时按下了<ALT>键       
        syskeyup        用户释放了<ALT>组合键 
        timechange      系统时钟被修改  
        undo            从undo缓冲区复制文本到编辑器控件    
        vkeytoitem      当一个列表框拥有聚焦时,用户按下了一个键 
        vscroll         用户点击了垂直卷滚条        
        vscrollclipboard    剪贴板查看器的垂直卷滚条被点击      
        windowposchanged    窗口位置发生改变    
        windowposchanging   窗口位置即将发生改变        
        wininichange    WIN.INI文件被修改

编程举例

许多最终用户曾长期使用基于DOS平台或基于字符终端的软件应用,在这些软件中,同一个窗口下的多个输入列之间聚焦的转换一般是靠键入回车驱动的,因此大多数的录入员都习惯于使用键盘右侧的数字键盘录入数据,每项数据录入后敲击回车,转到下一个输入项。在Windows环境下,同一个窗口下不同控件之间的转换是用tab键实现的,在一个DataWindow中无论是FreeForm形式还是Tabular或Grid形式,系统缺省都是使用tab键或Shift-tab键转换到下一个数据列或上一个数据列;而用户敲击回车键,系统会将聚焦转到下一条记录的第一个输入列上。这样用户就会向开发者提出这样的需求:希望用回车键来实现列之间的切换,以符合录入员的习惯。 如果我们熟悉了DataWindow的事件定义,就可以轻而易举地实现上述功能。我们在DataWindow中定义一个EnterKey事件,以捕捉用户在DataWindow中输入的回车,并对其应实现的功能进行转换。 在"UserEvents..."的对话框中加入EventName为EnterKey,EventID为pbm_dwnprocessenter的事件,对其编程如下:

int li_CurCol int li_cnt ∥得到当前光标所在的列数 
li_CurCol=getcolumn() ∥假设这个DataWindow共有6列 
if li_CurCol<6 then ∥如果当前列不是最后一列,将聚焦转到下一列
   setcolumn(li_CurCol+1) 
elseif rowcount()<=getrow() then ∥当前列是最后一列,而且当前行是最后一行,
                                  ∥则增加一行,并将聚焦转至该行的第一列 
   li_cnt=insertrow(0) 
   scrolltorow(li_cnt)
   setcolumn(1) 
else ∥当前列是最后一列,当前行不是最后一行,则将聚焦转至下一行的第一列
   li_cnt=getrow()+1 
   setrow(li_cnt) 
   scrolltorow(li_cnt) 
   setcolumn(1) 
endif
return 1