共用方式為


AddressOf 運算子

一元運算子,會將它之前之 程式 的位址傳遞至 API 程式,而該程式需要在 變數清單中該位置的函式指標。

語法

AddressOfprocedurename

必要的 procedurename 會指定要傳遞其位址的程式。 它必須代表專案中進行呼叫之標準模組中的程式。

註解

當程式名稱出現在引數清單中時,通常會評估程式,並傳遞程式傳回值的位址。 AddressOf 允許將程式的位址傳遞至動態連結程式庫中的 Windows API 函 式, (DLL) ,而不是傳遞程式的傳回值。 然後,API 函式可以使用 位址來呼叫基本程式,也就是稱為回呼的進程。 AddressOf運算子只會出現在 API 程式的呼叫中。

雖然您可以使用 AddressOf 在基本程式之間傳遞程式指標,但您無法從 Basic 中透過這類指標呼叫函式。 例如,這表示以 Basic 撰寫的 類別 無法使用這類指標對其控制器進行回呼。 使用 AddressOf 在 Basic 內的程式之間傳遞程式指標時,所呼叫程式的 參數 必須輸入 為 Long

如果您不完全瞭解函式回呼的概念,使用 AddressOf 可能會造成無法預期的結果。 您必須瞭解回呼的基本部分運作方式,以及您要傳遞函式位址的 DLL 程式碼。 偵錯這類互動很困難,因為程式會在 開發環境的相同程式中執行。 在某些情況下,可能無法進行系統化偵錯。

注意事項

您可以在使用Microsoft Visual C++ (或類似的工具) 編譯的 DLL 中建立自己的回呼函式原型。 若要使用 AddressOf,您的原型必須使用__stdcall呼叫慣例。 (__cdecl) 的預設呼叫慣例將無法與 AddressOf 搭配使用。

因為回呼的呼叫端不在您的程式內,所以回呼程式中的錯誤必須不會傳播回呼端。 您可以在回呼程式的開頭放置 On Error Resume Next 語句來完成此作業。

範例

下列範例會建立含有清單方塊的表單,其中包含您系統中字型的字母排序清單。

若要執行此範例,請在表單上建立具有清單方塊的表單。 表單的程式碼如下所示:

Option Explicit

Private Sub Form_Load()
    Module1.FillListWithFonts List1
End Sub

將下列程式碼放在模組中。 EnumFontFamilies 函式定義中的第三個引數是代表程式的 Long 。 引數必須包含程式的位址,而不是程式傳回的值。 在呼叫 EnumFontFamilies 時,第三個引數需要 AddressOf 運算子傳回 EnumFontFamProc 程式的位址,這是您在呼叫 Windows API 函式 EnumFontFamilies時所提供的回呼程式名稱。 當您將 AddressOf EnumFontFamProc 傳遞至 EnumFontFamilies時,Windows 會針對系統上的每個字型系列呼叫 EnumFontFamProc 一次。 傳遞至 EnumFontFamilies 的最後一個引數會指定顯示資訊的清單方塊。

'Font enumeration types
Public Const LF_FACESIZE = 32
Public Const LF_FULLFACESIZE = 64

Type LOGFONT
        lfHeight As Long
        lfWidth As Long
        lfEscapement As Long
        lfOrientation As Long
        lfWeight As Long
        lfItalic As Byte
        lfUnderline As Byte
        lfStrikeOut As Byte
        lfCharSet As Byte
        lfOutPrecision As Byte
        lfClipPrecision As Byte
        lfQuality As Byte
        lfPitchAndFamily As Byte
        lfFaceName(LF_FACESIZE) As Byte
End Type

Type NEWTEXTMETRIC
        tmHeight As Long
        tmAscent As Long
        tmDescent As Long
        tmInternalLeading As Long
        tmExternalLeading As Long
        tmAveCharWidth As Long
        tmMaxCharWidth As Long
        tmWeight As Long
        tmOverhang As Long
        tmDigitizedAspectX As Long
        tmDigitizedAspectY As Long
        tmFirstChar As Byte
        tmLastChar As Byte
        tmDefaultChar As Byte
        tmBreakChar As Byte
        tmItalic As Byte
        tmUnderlined As Byte
        tmStruckOut As Byte
        tmPitchAndFamily As Byte
        tmCharSet As Byte
        ntmFlags As Long
        ntmSizeEM As Long
        ntmCellHeight As Long
        ntmAveWidth As Long
End Type

' ntmFlags field flags
Public Const NTM_REGULAR = &H40&
Public Const NTM_BOLD = &H20&
Public Const NTM_ITALIC = &H1&

'  tmPitchAndFamily flags
Public Const TMPF_FIXED_PITCH = &H1
Public Const TMPF_VECTOR = &H2
Public Const TMPF_DEVICE = &H8
Public Const TMPF_TRUETYPE = &H4

Public Const ELF_VERSION = 0
Public Const ELF_CULTURE_LATIN = 0

'  EnumFonts Masks
Public Const RASTER_FONTTYPE = &H1
Public Const DEVICE_FONTTYPE = &H2
Public Const TRUETYPE_FONTTYPE = &H4

Declare Function EnumFontFamilies Lib "gdi32" Alias _
     "EnumFontFamiliesA" _
     (ByVal hDC As Long, ByVal lpszFamily As String, _ 
     ByVal lpEnumFontFamProc As Long, LParam As Any) As Long
Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, _
     ByVal hDC As Long) As Long

Function EnumFontFamProc(lpNLF As LOGFONT, lpNTM As NEWTEXTMETRIC, _ 
     ByVal FontType As Long, LParam As ListBox) As Long
Dim FaceName As String
Dim FullName As String
    FaceName = StrConv(lpNLF.lfFaceName, vbUnicode)
    LParam.AddItem Left$(FaceName, InStr(FaceName, vbNullChar) - 1)
    EnumFontFamProc = 1
End Function

Sub FillListWithFonts(LB As ListBox)
Dim hDC As Long
    LB.Clear
    hDC = GetDC(LB.hWnd)
    EnumFontFamilies hDC, vbNullString, AddressOf EnumFontFamProc, LB
    ReleaseDC LB.hWnd, hDC
End Sub

另請參閱

支援和意見反應

有關於 Office VBA 或這份文件的問題或意見反應嗎? 如需取得支援服務並提供意見反應的相關指導,請參閱 Office VBA 支援與意見反應