要掌握 VB 使用 ArrayList 类,只需两个步骤:

一、了解 .NET 基类的基

在使用 ArrayList 类之前,了解 .NET 基类如何处理对象数组是很重要的。.NET 提供了一系列基本的类来处理和操作数组。ArrayList 类是其中一个重要的类,它实现了一个可以动态调整大小的对象数组。

二、在 VB 中使用 ArrayList

  1. 导入命名空间: 在 VB 中使用 ArrayList 类,需要导入 System.Collections 命名空间。这可以让你使用 ArrayList 类来存储和管理对象。

    vb

    Imports System.Collections
  2. 基本操作

    • 创建和添加元素: 创建一个 ArrayList 实例并添加元素到其中。

      vb

      Dim szElement As String = "insert-me"
      Dim szArray As New ArrayList()
      szArray.Add(szElement)
    • 检索元素: 可以通过索引来访问数组中的元素,也可以使用 Item() 方法。方括号 []Item() 方法的简写。

      vb

      Console.WriteLine(szArray(0)) ' 使用方括号
      Console.WriteLine(szArray.Item(0)) ' 使用 Item() 方法

通过以上两个步骤,你可以在 VB 中有效地使用 ArrayList 类来管理和操作动态数组。


联调 VB 和 VC 的步骤

  1. 创建工程

    • 在 VB 中建立一个 Standard EXE 工程(例如 project1.vbp),在该工程中调用由 VC 编写的 DLL。
    • 在 VC 中建立一个 DLL 工程(例如 TestDll),编写相关的函数实现。
  2. 配置 VC 工程

    • 设置输出路径:在 VC 工程的 General 选项卡中,将输出文件路径设置为 VB 工程所在目录。
    • 设置调试参数:在 Debug 选项卡中,将 “Executable for debug session” 设置为 VB6.exe,将 “Working directory” 设置为 VB 工程目录,”Program arguments” 中填写 project1.vbp。可以添加 /r 参数来自动启动调试。
    • 确认链接选项:确保 DLL 输出路径和名称设置正确。
  3. 调试步骤

    • 在 VC 的源代码中设置断点,然后按 F5 开始调试。
    • 如果配置了 /r 参数,VB 工程会自动打开并运行。如果没有设置,手动在 VB 中开始调试。
    • 当 VB 调用 DLL 函数时,VC 环境会自动切换到前面,你可以在 VC 环境中调试 DLL。
    • 使用 F11 进行函数的退出调试,VC 环境会自动切换回 VB 环境。

通过这些步骤,你可以实现 VB 和 VC 的联合调试,以便更高效地调试和分析 DLL 函数的执行。

 

以下是将 VB 的 `PictureBox` 完整内容复制到剪贴板的代码示例:

### **步骤 1: 创建 VB 项目**

1. **创建新项目**:
– 打开 VB6 或 VB.NET,新建一个 Windows Forms 项目。

2. **添加控件**:
– 在窗体上放置一个 `CommandButton` 和一个 `PictureBox`。
– 设置 `PictureBox` 的 `AutoRedraw` 属性为 `True`(VB6)或 `AutoSize` 属性为 `True`(VB.NET)。

### **步骤 2: 添加标准模块**

1. **添加标准模块**:
– 在项目中添加一个标准模块,通常可以在项目资源管理器中右击项目,选择“添加” -> “模块”。

2. **复制以下代码**:

“`vb
‘ 定义RECT类型
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

‘ GDI函数
Private Declare Function BitBlt Lib “gdi32” (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
Private Declare Function CreateCompatibleDC Lib “gdi32” (ByVal hDC As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib “gdi32” (ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function SelectObject Lib “gdi32” (ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib “gdi32” (ByVal hObject As Long) As Long

‘ 剪贴板函数
Private Declare Function OpenClipboard Lib “USER32” (ByVal hWnd As Long) As Long
Private Declare Function CloseClipboard Lib “USER32” () As Long
Private Declare Function SetClipboardData Lib “USER32” (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function EmptyClipboard Lib “USER32” () As Long

Private Const CF_BITMAP = 2
Private Const SRCCOPY = &HCC0020 ‘ (DWORD) dest = source

‘ 复制 PictureBox 内容到剪贴板
Public Function CopyEntirePicture(ByRef objFrom As Object) As Boolean
Dim lhDC As Long
Dim lhBMP As Long
Dim lhBMPOld As Long

‘ 在内存中建立一个指向 PictureBox 的 DC
lhDC = CreateCompatibleDC(objFrom.hDC)
If (lhDC <> 0) Then
‘ 创建一张与 PictureBox 同大小的位图
lhBMP = CreateCompatibleBitmap(objFrom.hDC, objFrom.ScaleWidth \ Screen.TwipsPerPixelX, objFrom.ScaleHeight \ Screen.TwipsPerPixelY)
If (lhBMP <> 0) Then
‘ 选入位图到内存 DC 中,并保存原位图
lhBMPOld = SelectObject(lhDC, lhBMP)
‘ 复制 PictureBox 内容到内存中的位图
BitBlt lhDC, 0, 0, objFrom.ScaleWidth \ Screen.TwipsPerPixelX, objFrom.ScaleHeight \ Screen.TwipsPerPixelY, objFrom.hDC, 0, 0, SRCCOPY
‘ 恢复 DC 中的内容
SelectObject lhDC, lhBMPOld
‘ 将位图装入剪贴板
EmptyClipboard
OpenClipboard 0
SetClipboardData CF_BITMAP, lhBMP
CloseClipboard
‘ 释放 GDI 对象
DeleteObject lhBMP
End If
DeleteObject lhDC
End If
CopyEntirePicture = True
End Function
“`

### **步骤 3: 使用模块**

1. **在窗体代码中调用函数**:
– 在窗体的 `CommandButton` 的点击事件中调用 `CopyEntirePicture` 函数。

“`vb
Private Sub Command1_Click()
Call CopyEntirePicture(PictureBox1)
MsgBox “PictureBox 内容已复制到剪贴板!”
End Sub
“`

### **步骤 4: 测试程序**

1. **运行项目**:
– 点击 `CommandButton`,它会将 `PictureBox` 的全部内容复制到剪贴板。

2. **验证**:
– 打开一个图像编辑工具(如 Paint),使用粘贴功能验证 `PictureBox` 的内容是否成功复制。

通过上述步骤,你可以将 `PictureBox` 控件的完整内容复制到剪贴板,超越了 VB 默认的限制,确保包括所有图形内容。

 

 

 

文本框控件消息及应用

文本框控件(TextBox)在 Windows 编程中用于输入和编辑文本。它是标准 Windows 编辑控件的一个子类,支持多种编辑控件消息。这些消息不仅扩展了控件的功能,还允许通过子类处理来更灵活地控制控件。下面是对文本框控件消息的介绍以及一些常见应用示例。

常用通知消息

消息名称 消息说明
EN_CHANGE 编辑控件内容发生改变时发送此消息。
EN_ERRSPACE 内存不足以完成编辑操作时发送此消息。
EN_HSCROLL 用户点击编辑控件的水平滚动条时发送此消息。
EN_KILLFOCUS 编辑控件失去输入焦点时发送此消息。
EN_MAXTEXT 用户输入文字超过限制时发送此消息。
EN_SETFOCUS 编辑控件获得输入焦点时发送此消息。
EN_UPDATE 编辑控件文本显示更新之前发送此消息。
EN_VSCROLL 用户点击编辑控件的垂直滚动条时发送此消息。

常用消息

消息名称 消息说明
EM_CANUNDO 判断前一次编辑操作是否可以撤销。
EM_EMPTYUNDOBUFFER 清除编辑控件的撤销缓冲区。
EM_UNDO 撤销前一次编辑操作。
EM_FMTLINES 决定文本中是否包含软回车字符。
EM_GETLIMITTEXT 获取编辑控件中文本的最大长度。
EM_GETMARGINS 获取编辑控件的左、右边距。
EM_GETRECT 获取编辑控件的格式化矩形。
EM_LIMITTEXT 限制编辑控件中可以输入的文本长度。
EM_SETLIMITTEXT 设置编辑控件中文本的最大长度。
EM_SETMARGINS 设置编辑控件的左、右边距。
EM_SETRECT 设置编辑控件的格式化矩形。
EM_SETTABSTOPS 设置编辑控件中的制表符停靠位置。
EM_CHARFROMPOS 判断指定位置的字符。
EM_GETFIRSTVISIBLELINE 获取编辑控件中显示的第一行。
EM_GETLINE 获取指定行的内容。
EM_GETLINECOUNT 获取编辑控件的总行数。
EM_GETMODIFY 判断编辑控件的内容是否已被修改。
EM_GETPASSWORDCHAR 获取编辑控件的密码字符。
EM_GETSEL 获取编辑控件中选定内容的起点和终点。
EM_LINEFROMCHAR 获取指定字符所在的行号。
EM_LINEINDEX 获取指定行的第一个字符的编号。
EM_LINELENGTH 获取指定行的长度。
EM_LINESCROLL 滚动编辑控件的内容。
EM_POSFROMCHAR 获取指定字符在编辑控件中的位置。
EM_REPLACESEL 用指定文本替换编辑控件中的当前选定内容。
EM_SETMODIFY 设置或清除编辑控件的修改标志。
EM_SETPASSWORDCHAR 设置编辑控件的密码字符。
EM_READONLY 设置编辑控件为只读模式。
EM_SETSEL 设置编辑控件中选定内容的起点和终点。

应用示例

  1. 获取文本行数

    vb

    Function GetLineCount(CTextBox As TextBox) As Long
    GetLineCount = SendMessage(CTextBox.hWnd, EM_GETLINECOUNT, 0, 0)
    End Function
  2. 获取可见的第一行

    vb

    Function GetFirstVisibleLine(CTextBox As TextBox) As Long
    GetFirstVisibleLine = SendMessage(CTextBox.hWnd, EM_GETFIRSTVISIBLELINE, 0, 0)
    End Function
  3. 获取可见行数

    vb

    Function GetVisibleLines(CTextBox As TextBox) As Long
    Dim rc As RECT
    Dim hDC As Long
    Dim lfont As Long, oldfont As Long
    Dim di As Long
    Dim tm As TEXTMETRIC

    SendMessage(CTextBox.hWnd, EM_GETRECT, 0, rc)
    lfont = SendMessage(CTextBox.hWnd, WM_GETFONT, 0, 0)
    hDC = GetDC(CTextBox.hWnd)
    If lfont <> 0 Then oldfont = SelectObject(hDC, lfont)
    GetTextMetrics(hDC, tm)
    If lfont <> 0 Then SelectObject(hDC, oldfont)
    GetVisibleLines = (rc.Bottom - rc.Top) / tm.tmHeight
    ReleaseDC(CTextBox.hWnd, hDC)
    End Function

  4. 滚动文本框

    vb

    Function ScrollTextBox(CTextBox As TextBox, nVal As Long, Optional nVertical As Boolean = True) As Long
    If nVertical Then
    ScrollTextBox = SendMessage(CTextBox.hWnd, EM_LINESCROLL, 0, nVal)
    Else
    ScrollTextBox = SendMessage(CTextBox.hWnd, EM_LINESCROLL, nVal, 0)
    End If
    End Function
  5. 获取指定行的文本

    vb

    Function GetLineText(CTextBox As TextBox, LineIndex As Long) As String
    Dim lc As Long, linechar As Long
    linechar = SendMessage(CTextBox.hWnd, EM_LINEINDEX, LineIndex, 0)
    lc = SendMessage(CTextBox.hWnd, EM_LINELENGTH, linechar, 0) + 1
    GetLineText = String\((lc + 2, 0)
    Mid\)(GetLineText, 1, 1) = Chr(lc And &HFF)
    Mid$(GetLineText, 2, 1) = Chr(lc \ &H100)
    lc = SendMessage(CTextBox.hWnd, EM_GETLINE, LineIndex, GetLineText)
    GetLineText = Left(GetLineText, lc)
    End Function
  6. 设置控件左边距

    vb

    Public Const EM_SETMARGINS As Long = &HD3
    Public Const EC_LEFTMARGIN As Long = &H1
    Function SetMargins(CTextBox As TextBox, nVal As Long) As Long
    SetMargins = SendMessage(CTextBox.hWnd, EM_SETMARGINS, EC_LEFTMARGIN, nVal)
    End Function

这些示例展示了如何利用文本框控件的消息来实现更高级的功能,从获取文本行数到设置控件边距。这些技术可以帮助开发者在处理文本框控件时拥有更高的灵活性和控制力。

VB辅导: 实现屏幕阴暗效果

在 Windows 9x 系统中,当系统关闭时,屏幕会变暗。我们可以在自己的 VB 应用程序中实现类似的效果。以下是详细步骤及相关代码,演示如何使用 VB 实现屏幕变暗和恢复的效果。

基本思路

  1. 获取屏幕的设备上下文:使用 GetDC 函数获取整个屏幕的设备上下文。
  2. 创建图案刷子:使用 CreatePatternBrush 函数创建一个图案刷子。
  3. 填充设备上下文:使用 PatBlt 函数将图案刷子填充到屏幕设备上下文。
  4. 清理资源:使用 DeleteObject 删除图案刷子。
  5. 恢复屏幕:通过 InvalidateRect 函数使屏幕恢复到变暗之前的状态。

步骤

  1. 创建窗体和按钮

    • 创建一个新的 VB6 项目。
    • 在窗体上放置两个 CommandButton 控件。
    • 将第一个按钮的 Caption 属性设置为“变暗”,第二个按钮的 Caption 属性设置为“恢复”。
  2. 声明 API 函数和类型

    在窗体代码模块中添加以下声明:

    vb

    Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
    End Type

    Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
    Private Declare Function CreatePatternBrush Lib "gdi32" (ByVal hBitmap As Long) As Long
    Private Declare Function PatBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal dwRop As Long) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long
    Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
    Private Declare Function InvalidateRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT, ByVal bErase As Long) As Long
    Private Const SRCCOPY As Long = &HCC0020

  3. 编写代码实现变暗和恢复

    • 变暗操作

      vb

      Private Sub Command1_Click()
      Dim hdc As Long
      Dim hBitmap As Long
      Dim hBrush As Long
      Dim oldBrush As Long
      Dim rect As RECT

      ' 获取屏幕设备上下文
      hdc = GetDC(0)

      ' 创建一个全黑位图
      hBitmap = CreateBitmap(Screen.Width, Screen.Height, 1, 1, ByVal 0&)

      ' 创建图案刷子
      hBrush = CreatePatternBrush(hBitmap)

      ' 选择图案刷子
      oldBrush = SelectObject(hdc, hBrush)

      ' 获取屏幕矩形
      rect.Left = 0
      rect.Top = 0
      rect.Right = Screen.Width
      rect.Bottom = Screen.Height

      ' 填充屏幕
      PatBlt hdc, rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top, SRCCOPY

      ' 恢复旧图案刷子
      SelectObject hdc, oldBrush

      ' 删除创建的图案刷子和位图
      DeleteObject hBrush
      DeleteObject hBitmap

      ' 释放设备上下文
      ReleaseDC 0, hdc
      End Sub

    • 恢复操作

      vb

      Private Sub Command2_Click()
      Dim rect As RECT

      ' 获取屏幕矩形
      rect.Left = 0
      rect.Top = 0
      rect.Right = Screen.Width
      rect.Bottom = Screen.Height

      ' 恢复屏幕显示
      InvalidateRect 0, rect, True
      End Sub

说明

  • GetDCReleaseDC:用来获取和释放设备上下文,这里我们使用 0 作为参数以获取整个屏幕的设备上下文。
  • CreateBitmap:创建一个黑色的位图,这个位图将用于创建图案刷子。
  • CreatePatternBrush:创建一个图案刷子,用来填充屏幕。
  • PatBlt:用创建的图案刷子填充设备上下文,从而实现屏幕变暗的效果。
  • InvalidateRect:使整个屏幕区域重新绘制,从而恢复显示状态。

这段代码可以实现类似于 Windows 9x 关闭时的屏幕变暗效果。你可以根据需要进一步调整和优化代码以适应不同的应用场景。