kaka

要这天,再遮不住我眼;要这地,再埋不了我心;要这众生,都明白我意;要那诸佛,都烟消云散!

IT博客 首页 新随笔 联系 聚合 管理
  4 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks

2005年8月7日 #

VB菜单编辑器所提供的默认菜单是不能在菜单项中加入图标的,而许多流行的软件大都采用了漂亮的带有小图标的菜单,如果想利用VB实现这种效果就必须要调用API函数来实现了。例中我们使用了三个与菜单操作有关的函数:GetMenu、SetMenuItemBitmaps、GetSubMenu。

  为了学习方便,提供的源码已经作了详细的中文注释,看看源码框中的代码:
'-------------------------------------------------
'               让菜单中出现图标一法
'-------------------------------------------------
'程序应用三个API函数实现了在菜单项中加入小图标
'GetMenu、GetSubMenu、SetMenuItemBitmaps
'-------------------------------------------------
Option Explicit
'【VB声明】
'  Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long

'【说明】
'  取得窗口中一个菜单的句柄

'【返回值】
'  Long,依附于指定窗口的一个菜单的句柄(如果有菜单);否则返回零

'【参数表】
'  hwnd -----------  Long,窗口句柄。对于vb,这应该是一个窗体句柄。注意可能不是子窗口的句柄
Private Declare Function GetMenu Lib "user32" _
   (ByVal hwnd As Long) As Long
'-------------------------------------------------
'【VB声明】
'  Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

'【说明】
'  取得一个弹出式菜单的句柄,它位于菜单中指定的位置

'【返回值】
'  Long,位于指定位置的弹出式菜单的句柄(如果有的话);否则返回零

'【参数表】
'  hMenu ----------  Long,菜单的句柄

'  nPos -----------  Long,条目在菜单中的位置。第一个条目的编号为0
Private Declare Function GetSubMenu Lib "user32" _
   (ByVal hMenu As Long, ByVal nPos As Long) As Long
'-------------------------------------------------
'【VB声明】
'  Private Declare Function SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long

'【说明】
'  设置一幅特定位图,令其在指定的菜单条目中使用,代替标准的复选符号(√)。位图的大小必须与菜单复选符号的正确大小相符,这个正确大小可以由GetMenuCheckMarkDimensions函数获得

'【返回值】
'  Long,非零表示成功,零表示失败。会设置GetLastError

'【备注】
'  使用的位图可能由多个条目共享。一旦不再需要,位图必须由应用程序清除,因为windows不能自动对它进行清除

'【参数表】
'  hMenu ----------  Long,菜单句柄

'  nPosition ------  Long,欲设置位图的一个菜单条目的标识符。如在wFlags参数中指定了MF_BYCOMMAND,这个参数就代表欲改变的菜单条目的命令ID。如设置的是MF_BYPOSITION,这个参数就代表菜单条目在菜单中的位置(第一个条目的位置为零)

'  wFlags ---------  Long,常数MF_BYCOMMAND或MF_BYPOSITION,取决于nPosition参数

'  hBitmapUnchecked -  Long,撤消复选时为菜单条目显示的一幅位图的句柄。如果为零,表示不在未复选状态下显示任何标志

'  hBitmapChecked -  Long,复选时为菜单条目显示的一幅位图的句柄。可设为零,表示复选时不显示任何标志。如两个位图句柄的值都是零,则为这个条目恢复使用默认复选位图
Private Declare Function SetMenuItemBitmaps Lib "user32" _
   (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, _
    ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long
'-------------------------------------------------

Const MF_BYPOSITION = &H400&

Private Sub Form_Load()
    Dim mHandle As Long, lRet As Long, sHandle As Long, sHandle2 As Long
    '取得菜单的句柄并赋值给mHandle
    mHandle = GetMenu(hwnd)
    '取得mHandle句柄所指菜单的第一个弹出式菜单(文件&F)的句柄并赋值给sHandle
    sHandle = GetSubMenu(mHandle, 0)
    '将弹出式菜单的第0-4项加上图片,为什么跳过2呢?因为2是分割线
    lRet = SetMenuItemBitmaps(sHandle, 0, MF_BYPOSITION, imOpen.Picture, imSave.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 1, MF_BYPOSITION, imSave.Picture, imSave.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 3, MF_BYPOSITION, imPrint.Picture, imPrint.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 4, MF_BYPOSITION, imPrintSetup.Picture, imPrintSetup.Picture)
    '取得mHandle句柄所指菜单的第二个弹出式菜单(编辑&E)的句柄并赋值给sHandle
    sHandle = GetSubMenu(mHandle, 1)
    '取得sHandle句柄所指菜单的第一个次级菜单(次级菜单&S)的句柄并赋值给sHandle2
    sHandle2 = GetSubMenu(sHandle, 0)
    '将次级菜单中的第1项加上图片
    lRet = SetMenuItemBitmaps(sHandle2, 0, MF_BYPOSITION, imCopy.Picture, imCopy.Picture)
'提示:在SetMenuItemBitmaps()我们把后两项设为相同的图片,如果设为不同的两张图片会有什么效果呢?
'      原来这两张图片分别表示复选和撤消复选时的状态,你只须在菜单项被点击的函数中加入以下语句:
'      Private Sub mnuOpen_Click()
'       If mnuOpen.Checked = True Then
'       mnuOpen.Checked = False
'       Else: mnuOpen.Checked = True
'       End If
'      End Sub
'      然后在SetMenuItemBitmaps()我们把后两项设为不同的图片即可,有兴趣的话试一试。
End Sub

(源程序下载)
我们先来声明API函数,本例中用到的三个函数声明如下:
   Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long

   Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

   Private Declare Function SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long

  GetMenu函数的作用得到一个窗口中的菜单的句柄(这个菜单句柄应理解为处于某个窗体上的所有菜单的入口),其中各个参数的意义如下表所示:

参数
意义
hwnd Long,窗口句柄。对于vb,这应该是一个窗体句柄
返回值 Long,依附于指定窗口的一个菜单的句柄(如果有菜单);否则返回零

  GetSubMenu函数用于取得一个弹出式菜单(弹出式菜单是指处于任何一级的菜单,注意不是菜单项)的句柄,它位于菜单中指定的位置,它的各个参数的意义如下:

参数
意义
hMenu Long,菜单的句柄
nPos Long,次级菜单在上级菜单中的位置。第一个位置的编号为0
返回值 Long,位于指定位置的弹出式菜单的句柄(如果有的话);否则返回零

  SetMenuItemBitmaps函数用于设置一幅特定位图,令其在指定的菜单条目中使用,代替标准的复选符号(√),它的各个参数的意义如下:

参数
意义
hMenu Long,菜单的句柄
nPosition Long,欲设置位图的一个菜单条目的标识符。如在wFlags参数中指定了MF_BYCOMMAND,这个参数就代表欲改变的菜单条目的命令ID。如设置的是MF_BYPOSITION,这个参数就代表菜单条目在菜单中的位置(第一个条目的位置为零)
wFlags Long,常数MF_BYCOMMAND或MF_BYPOSITION,取决于nPosition参数
hBitmapUnchecked Long,撤消复选时为菜单条目显示的一幅位图的句柄。如果为零,表示不在未复选状态下显示任何标志
hBitmapChecked Long,复选时为菜单条目显示的一幅位图的句柄。可设为零,表示复选时不显示任何标志。如两个位图句柄的值都是零,则为这个条目恢复使用默认复选位图
返回值 Long,非零表示成功,零表示失败。

  下面我们看看怎样为菜单的指定项目加上图标,步骤一:取得菜单的句柄并赋值给mHandle,接着取得mHandle句柄所指菜单的第一个弹出式菜单的句柄并赋值给sHandle:
   mHandle = GetMenu(form.hwnd)
   sHandle = GetSubMenu(mHandle, 0)

  然后就为菜单项加入图标,这里我们把wFlags参数设为了MF_BYPOSITION,也就是说使用菜单项的位置(从序号0开始)来标示菜单项:
   lRet = SetMenuItemBitmaps(sHandle, 0, MF_BYPOSITION, imOpen.Picture, imOpen.Picture)
   lRet = SetMenuItemBitmaps(sHandle, 1, MF_BYPOSITION, imSave.Picture, imSave.Picture)

  以上是为菜单项添加图标的基本方法,例中还演示了怎样为次级菜单中的菜单项添加图标,以及菜单项处于复选/非复选状态时,对应图标发生变化的方法,具体的实现方法可以参照程序中的注释。

posted @ 2005-08-07 15:29 卡卡 阅读(506) | 评论 (0)编辑 收藏

       ActiveBar 是一款设计用户界面必不可少的 ActiveX 控件,如果你想让自己的程序变得更专业,就必须用它。使用它可以制作出像 Word 一样的个性化菜单、“自定义”对话框;像 Outlook 的快捷按钮栏;像 CorelDRAW 的入坞式窗口;像 Delphi 的控件选择页面。并且使用十分简单,保存设计图和加载设计图都十分简单,只用几个方法既可。SP3 中全面支持了 XP 样式,可以在非 XP 操作系统中实现XP 的介面。这个控件可以用在 VB5、VB6 和 VC++ 上。
      以下是在程序中使用的部分代码:
     Dim oTool As Tool
      acbToolBar.Bands.Add "系统工程"
    With acbToolBar.Bands("系统工程")
        Set oTool = .Tools.Add(0, "miProjLoad")
        oTool.Caption = "&ProjLoad"
        oTool.SetPicture Index:=0, Picture:=LoadPicture( _
            App.Path & "\图标配置\工具栏图标\系统工程\ProjLoad.ico"), Color:=&HC0C0C0
        oTool.Width = 15
        oTool.ToolTipText = "载入工程"
        oTool.BeginGroup = True
       
        Set oTool = .Tools.Add(1, "miProjSave")
        oTool.Caption = "&ProjSave"
        oTool.SetPicture Index:=0, Picture:=LoadPicture( _
            App.Path & "\图标配置\工具栏图标\系统工程\ProjSave.ico"), Color:=&HC0C0C0
        oTool.Width = 15
        oTool.ToolTipText = "保存工程"
                
        Set oTool = .Tools.Add(2, "miProjClose")
        oTool.Caption = "&ProjClose"
        oTool.SetPicture Index:=0, Picture:=LoadPicture( _
            App.Path & "\图标配置\工具栏图标\系统工程\ProjClose.ico"), Color:=&HC0C0C0
        oTool.Width = 15
        oTool.ToolTipText = "关闭工程"
       
posted @ 2005-08-07 13:40 卡卡 阅读(319) | 评论 (0)编辑 收藏

2005年8月5日 #

今天阅读了一篇关于组件式地理信息系统的论文,将部分内容摘录如下:

论文名称:《组件式地理信息系统研究与开发》
作者:宋关福 钟耳顺
来源:中国图象图形学报 1998年4月第3卷第4期

组件式软件是新一代GIS的重要基础,ComGIS是面向对象技术和组件式软件在GIS软件开发中的应用。认识ComGIS,首先需要了解所依赖的技术基础——组件式对象模型和ActiveX控件。

COM是组件式对象模型(Component Object Model)的英文缩写,是OLE(Object Linking & Embedding)和ActiveX共同的基础。COM不是一种面向对象的语言,而是一种二进制标准。COM所建立的是一个软件模块与另一个软件模块之间的链接当这种链接建立之后,模块之间就可以通过称之为“接口”的机制来进行通信。COM标准增加了保障系统和组件完整的安全机制,扩展到分布式环境。这种基于分布式环境下的COM被称作DCOM(Distributed COM)。DCOM实现了COM对象与远程计算机上的另一个对象之间直接进行交互。

ActiveX是一套基于COM的可以使软件组件在网络环境中进行互操作而不管该组件是用何种语言创建的技术。作为ActiveX技术的重要内容,ActiveX控件是一种可编程、可重用的基于COM的对象。ActiveX控件通过属性、事件、方法等接口与应用程序进行交互。

ComGIS的基本思想是把GIS的各大功能模块划分为几个控件,每个控件完成不同的功能。各个GIS控件之间,以及GIS控件与其它非GIS控件之间,可以方便地通过可视化的软件开发工具集成起来,形成最终的GIS应用。控件如同一堆各式各样的积木,它们分别实现不同的功能(包括GIS和非GIS功能),根据需要把实现各种功能的“积木”搭建起来,就构成应用系统。

传统GIS软件与用户或者二次开发者之间的交互,一般通过菜单或工具条按钮、命令以及二次开发语言进行。ComGIS与用户和客户程序之间则主要通过属性、方法和事件交互。

属性(Properties):指描述控件或对象性质(Attributes)的数据,如:BackColor(地图背景颜色)、GPSIcon(用于GPS动态目标跟踪显示的图标)等。可以通过重新指定这些属性的值来改变控件和对象性质。在控件内部,属性通常对应于变量(Variables)。

方法(Methods):指对象的动作(Actions),如:Show(显示)、AddLayer(增加图层)、Open(打开)、Close(关闭)等。通过调用这些方法可以让控件执行诸如打开地图文件、显示地图之类的动作。在控件内部,方法通常对应于函数(Functions)。

事件(Events):指对象的响应(Responses)。当对象进行某些动作时(可以是执行动作之前,也可以
是动作进行过程中或者动作完成后),可能会激发一个事件,以便客户程序介入并响应这个事件。比如用鼠标在地图窗口内单击并选择了一个地图要素,控件产生选中事件(如ItemPicked)通知客户程序有地图要素被选中,并传回描述选中对象的个数、所属图层等等信息的参数。属性、方法和事件是控件的通用标准接口,适用于任何可以作为ActiveX包容器的开发语言,具有很强的通用性。

posted @ 2005-08-05 20:18 卡卡 阅读(508) | 评论 (1)编辑 收藏

2005年8月4日 #

今天是暑假生产实习的第一天,但由于不知道实验室计算机的管理员密码,无法安装实习所必需的SQL Server和MapObjects,导致的直接结果就是实习的第一天什么也没做。

本次暑假实习主要是在一个师兄的程序基础上继续进行开发

项目名称:基于MapObjects的油田测井信息管理系统的设计与实现

已经实现的功能:

1、通过ESRI MapObjects接口实现图层数据的显示、查询、渲染和部分ESRI MapObjects组件内置的具体功能;

2、使用ADO接口实现图层、图层记录与SQL Server数据库中数据表之间的关联操作,并根据SQL属性数据查询空间数据和根据空间数据查询属性数据的关联查询功能的最优实现;

3、根据自然电位测井原理,绘制自然电位测井曲线(SP曲线)和划分沙泥岩层

实习要求:

1、根据沙泥岩层实现绘制地层分层曲线

2、利用VBA实现VB和Excel的连接

posted @ 2005-08-04 17:46 卡卡 阅读(336) | 评论 (0)编辑 收藏

仅列出标题