博文

发现拖(Drap)过来的信息(2005-12-02 09:21:00)

摘要:要让您的程序支持从其他程序 (如:资源管理器或浏览器)中拖过来的信息,首先要找到拖过来数据的Format 和组织情况,以下的代码可以让您迈出第一步:设置 FORM 的 OLEDropMode 为自动:Private Sub Form_OLEDragOver(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)For i = 1 To 255 ' 如果在该范围内没有,可以扩大范围!If Data.GetFormat(i) ThenDebug.Print Data.GetData(i) '数据内容Debug.Print I 'Format 编号End IfNextEnd Sub然后拖几个东东到 FORM 中去。可以发现, 超连接的有关信息 Format 为 1,而文件的 Format 为 15。。。......

阅读全文(2845) | 评论:0

关于天文数字十进制与十六进制间的转换(2005-11-17 21:35:00)

摘要:关于天文数字十进制与十六进制间的转换 对于一般的整型数字,16进制与10进制 间的转化可以用CLNG(),HEX()函数解决,但遇上天文数字,这些函数就无能为力了。下面是笔者写的几个函数,演示了天文数字计算中的一些技巧。 Dim largehex As String, largedec As String, start As Long, Y(20) As String '预备函数Function sums(ByVal X As String, ByVal Y As String) As String ' sum of two hugehexnum(两个大数之和)Dim max As Long, temp As Long, I As Long, result As Variantmax = IIf(Len(X) >= Len(Y), Len(X), Len(Y))X = Right(String(max, "0") & X, max)Y = Right(String(max, "0") & Y, max)ReDim result(0 To max)For I = max To 1 Step -1result(I) = Val(Mid(X, I, 1)) + Val(Mid(Y, I, 1))NextFor I = max To 1 Step -1temp = result(I) \ 10result(I) = result(I) Mod 10result(I - 1) = result(I - 1) + tempNextIf result(0) = 0 Then result(0) = ""sums = Join(result, "")Erase result End Function Function multi(ByVal X As String, ByVal Y As String) As String 'multi of two huge hexnum(两个大数之积)Dim result As VariantDim xl As Long, yl As Long, temp As Long, I As Longxl = Len(Trim(X))yl = Len(Trim(Y)) ReDim result(1......

阅读全文(252) | 评论:0

在关机或Logff前信息的拦截(2005-11-02 16:41:00)

摘要:在关机或Logff前信息的拦截 如果我们关机或Logoff时,我们的程序有时会因而无法按正常程序结束,一般我们会在Form的Unload中一段程序结束时要做什么事,但是,如果使用者直接用开始功能菜单的关机,会使UnLoad的部份没有做到,我们现在就想办法来拦截关机(或Logoff)时的信息。一般来说,关机或Logff后,Windows会传依序送出WM_QUERYENDSESSION的信息给每个Process,如果中间有一个Process不能顺利结束(例如:Word修改后未存档,而出现是否存档,但我们按取消),这时该信息执行的结果会传回False(0),这时Windows也就不再继续送WM_QUERYENDSESSION给下一个Proccess。反之,如果所有的Process都可以顺利结束(也就是每个送出的WM_QUERYENDSESSION都传回True),那才代表以以顺利结束。不管WM_QUERYENDSESSION最后的结果是可以顺利结束或不能顺利结束,Windows会再送一个WM_ENDSESSION的信息给所有的Process,而wParam的内容便是指出是否可以顺利结束(True菜单可以,False菜单不行,在vb中则Check wParam = 0 菜单False , 0菜单True),说到这里大概就知道该如何做啦,程序如下:'以下在FormPrivate Sub Form_Load()Dim ret As Long'记录原来的Window Procedure的位址preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)'设定form的window Procedure到wndprocret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)End SubPrivate Sub Form_Unload(Cancel As Integer)Dim ret As Long'取消Message的截取,而使之又只送往原来的Window Procedureret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)'这里只是要看看用关机的方式结束程序时,会不会执行到这里Dim fno As Longfno = Free......

阅读全文(2369) | 评论:0

怎样关闭一个正在运行的程序(2005-11-02 16:39:00)

摘要:怎样关闭一个正在运行的程序 你可以使用API函数FindWindow和PostMessage去寻找指定的窗口,并关闭它。下面的例子教给你怎样找到并关掉一个Caption为“Caluclator”的程序。Dim winHwnd As LongDim RetVal As LongwinHwnd = FindWindow(vbNullString, "Calculator")Debug.Print winHwndIf winHwnd <> 0 ThenRetVal = PostMessage(winHwnd, WM_CLOSE, 0&, 0&)If RetVal = 0 ThenMsgBox "置入消息错误!"End IfElseMsgBox "Calculator没有打开!"End If为了让以上的代码工作,你必须在模块文件中什么以下API函数:Declare Function FindWindow Lib "user32" Alias _"FindWindowA" (ByVal lpClassName As String, _ByVal lpWindowName As String) As Long Declare Function PostMessage Lib "user32" Alias _"PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _ByVal wParam As Long, lParam As Any) As Long Public Const WM_CLOSE = &H10......

阅读全文(3762) | 评论:1

为 ListBox 设定水平卷动轴(2005-11-02 16:34:00)

摘要:如何为 ListBox 设定水平卷动轴?- -VB 的 ListBox 并没有水平卷动轴的功能,如果遇到某一个资料项很长时, 使用者就无法看到这一个资料项的所有内容,问如何设定水平卷动轴给 ListBox? 可利用 SendMessage 传送 LB_SETHORIZONTALEXTENT 讯息给 ListBox,此一讯息的作用就是要求ListBox 设定水平卷动轴, 细节如下  1. API 的宣告:     Const LB_SETHORIZONTALEXTENT = &H194    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _            (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _            lParam As Any) As Long 2. 程式范例:   ' List1 为 ListBox 的名称   Call SendMessage(List1.hwnd, LB_SETHORIZONTALEXTENT, _        水平卷动轴的宽度, ByVal 0&) 特别注意:以上的水平卷动轴宽度的单位是 pixel(像素)。......

阅读全文(3378) | 评论:0

在VB中用按钮打开网页(2005-10-24 22:01:00)

摘要:'用按钮打开网页 Private Declare Function ShellExecute Lib "shell32.dll" Alias _"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPrivate Sub Command1_Click()ShellExecute Me.hwnd, "open", "http://www.programfan.com/club", "", "", 5End Sub......

阅读全文(362) | 评论:0

一组小技巧(2005-10-10 13:17:00)

摘要:路径问题 很多程序员在打开文件、调用程序时喜欢使用绝对文件路径,结果在另一台计算机上运行时便会遇到路径不对或需要重新拷贝到该目录的问题。其实,只要使用相对路径,就完全可以避免这个问题。在Windows下,某个程序一旦运行,除非特别指定了工作目录,一般该程序文件所在的目录就是工作目录,其他目录可以用工作目录为参照系。在编程中"App.Path"即为当前工作目录。另外,用安装程序向导制作安装盘时,只要在步骤"文件小结"中添加某文件时指定"文件详细资料"的路径即可安装该文件到指定的目录下。   生成透明窗体  利用API函数可做出透明窗体。以下为一种方法: Me.AutoRedraw = True   hBitmap = CreateCompatibleBitmap(Me.hdc, 0, 0)   SelectObject Me.hdc, hBitmap   调用Bitblt API函数  在编程中我们经常遇到需要拷贝图形的问题,一般利用API函数Bitblt或Stretchblt(后者可缩放). Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long Declare Function StretchBlt Lib "gdi32" Alias "StretchBlt" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeigh......

阅读全文(2594) | 评论:0

VB_小技巧(2005-10-10 00:20:00)

摘要:获取X字符串包含字母“B”的数量,最简单方法===========================    UBound(Split(x, "B"))剪贴板相关===========================================================  '全选   Private Sub mnuSelectAll_Click()   RichTextBox1.SelStart = 0   RichTextBox1.SelLength = Len(RichTextBox1.Text)   End Sub      '粘贴   Private Sub mnuPaste_Click()   RichTextBox1.SelText = Clipboard.GetText   End Sub      '查找   Private Sub mnuFind_Click()   sFind = InputBox("请输入要查找的字、词:", "查找内容", sFind)   RichTextBox1.Find sFind   End Sub      '继续查找   Private Sub mnuFindOn_Click()   RichTextBox1.SelStart = RichTextBox1.SelStart + RichTextBox1.SelLength + 1   RichTextBox1.Find sFind, , Len(RichTextBox1)   End Sub TextBox操作==========================================================1、限制只能输入数字参考下列程序:Sub Text1_KeyPress(KeyAscii As Integer)If KeyAscii < 48 Or KeyAscii > 57 ThenKeyAscii = 0End IfEnd Sub2、屏蔽特定字符Private Sub Text1_KeyPress(KeyAscii As Integer)    Dim sTemplate As String    s......

阅读全文(133) | 评论:0

VB中窗体控制特效代码收集(2005-10-09 23:58:00)

摘要:在Visual Basic中如何拖动窗体或控件 现在的许多Windows下的应用程序,都采用了图形化的界面,例如:WINAMP等!这样做的好处是可以使程序界面更漂亮生动,更具吸引力。但是在这样的界面下就不能使用Windows原来的标题条了,否则会影响界面的美观性。那么在没有标题条的情况下如何用鼠标拖动窗体呢?或者拖动其它的控件呢? 其实,采用API函数调用很容易实现,下面我们以拖动窗体(Form1)为例来具体讲一下实现方法: 1.新建立一个项目,名称为:test.vbp. 2. 填加一个模块,名称为:test.bas,并且在声明部分加入以下代码: Declare Function ReleaseCapture Lib "user32" () As Long Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const WM_SYSCOMMAND = &H112 Public Const SC_MOVE = &HF012 其中ReleaseCapture函数是用来释放鼠标捕获的,SendMessage函数是一个在WindowsAPI中非常重要的函数,在这里的作用是用来向Windows发送移动窗体的消息。WM_SYSCOMMAND是向Windows发送消息的常量。SC_MOVE是控制移动窗体的常量。请注意:这里SC_MOVE的赋值一定要是&HF012,它表示鼠标对象。 3.在窗体的MouseDown过程中加入以下代码: ReleaseCapture SendMessage Form1.hwnd, WM_SYSCOMMAND, SC_MOVE, 0 其中ReleaseCapture函数用来释放鼠标捕获,SendMessage函数向Windows发送移动窗体的消息。 4.保存并运行程序,按下鼠标,你会发现窗体会随着鼠标的移动而移动。就和其它著名的应用程序一样。 以上讲述了如何在VB中用鼠标拖动窗体,其实,控件的拖动的原理是一样的。 例如以下代码可以实现图片框的拖动: ReleaseCaptur......

阅读全文(5988) | 评论:0

VB编程的必备技巧(2005-10-09 15:32:00)

摘要:---- 一.怎样创建自定义的光标---- 1.当在设计一个应用程序时,Visual Basic允许程序员将许多控件的MousePointer属性设计成12个预先定义好的鼠标光标之一。然而,有些程序员或许会希望显示一个预定义形状之外的光标。本文说明如何创建一个不同的鼠标指针(光标),包括为一个没有MousePointer属性的控件创建光标。----要在Visual Basic应用程序中将光标(鼠标指针)改变成个不同的形状,可以添加代码来改变希望监视的控件的MouseMove和DragOver事件。----MouseMove事件所包含的代码用于触发该控件的Drag方法。当鼠标在被选中的控件上移动的时候,轮流显示新的鼠标指针。当鼠标指针离开该控件时,则DragOver事件被触发。在Visual Basic程序中,可以重新复位此Drag属性,以便以前的鼠标指针能够被再次显示出来。---- 2.下面的样例程序实现当鼠标指针移动到一个文件列表框控件上时,将其改变成不同的形状。---- 首先采用缺省的方法建立Form1。在Form1上添加一个文件列表框控件,采用缺省的方法建立File1。将File1控件的DragIcon属性设置为所选择的.ICO文件。---- 将如下代码添加到File1的MouseMove事件中:Private Sub File1-MouseMove(ButtonAsInteger, Shift As Integer, X As Single, Y As Single)File1.Drag 1 'icon onEnd Sub---- 将如下代码添加到Form1的DragOver事件中:Private Sub Form-DragOver(Source As Control,X As Single, Y As Single, State As Integer)File1.Drag 0 ′icon offEnd Sub---- 按下F5功能键执行此程序。得到的运行结果是:将鼠标指针移动到该文件列表框控件上时,程序将把所选中的.ICO文件作为缺省的鼠标光标;将鼠标指针离开该控件时,光标则会自动恢复为缺省的形状。---- 二.怎样在窗体上点鼠标右键产生一个弹出式选单(PopUp Menu)?---- 大家都知道,在Windows95/98/2000的桌面和许多流行软件的......

阅读全文(3754) | 评论:0