VBAからGDI+を使う資料集
inet上の達人の方々から御教示いただいたコードを少しアレンジさせてもらっています(切り貼りとも言います)。
  1. ホーム
  2. Other
  3. Win32API活用援用


Win32Apiをデータベース化し、選択した関数と必要な構造体をクリップボードに出力(読み物)

プログラムコードでなくて、お話です。
NonSoftさんの、Win32Api定義のサンプル(VB6)を愛用させていただいておりますが、
テキストエディターで検索するのに疲れ、Accessのデータベースに載せ替えてみました。
1.関数のテーブル
2.定数のテーブル
3.構造体のテーブル
を作成します。当然ADO+テキスト処理で自動でやります。
4.関数の宣言文から、関数毎の引数のテーブルを作ります。これもADO+テキスト処理で。
5.関数の帳票フォーム
 →選択したレコードの単票フォーム(構造体のサブフォーム付)
 →サブフォームから選択した引数のタイプの構造体宣言文のフォームを表示
といった感じで作ってみました。
更に追加して、
6.関数の帳票フォーム→出力するレコードにチェック
 →チェック済みのレコードのレコードセットを抽出
 →レコードセットの各レコードについて、引数テーブルから各引数を取り込み
 →Dictionaryを用いて、大文字のタイプ名(構造体名)の重複しないリストを作成
7.Dictionaryから、構造体名のリストを取り出し、構造体のテーブルからレコードセットを抽出。
各構造体の宣言文を文字列で結合
8.最初のレコードセットを先頭に戻し、関数の宣言文(複数)を7の文字列に追記
9.クリップボードに文字列を収納
といった感じで、選択した関数と、必要な宣言文を一つの文字列にまとめ、
クリップボード経由でVBEなどに複写できる機能を実現できました。
後は、二つ設けてあるキーワードのフィールドに適当な分類を入れていくと、更に使いやすいものになると期待しています。
抽出するところのコードは下記の通り。複数レコードセットをここまで駆使したのは初めてです。


'チェックをつけたレコードと、用いているタイプ名を抽出し、テキスト生成
'「Microsoft Forms 2.0 Object Library」または、「C:\WINNT(または Windows)\system32\FM20.DLL」に参照設定要。

Private Sub extractButton_Click()
  Dim cn As ADODB.Connection
  Dim rs As ADODB.Recordset
  Dim rs2 As ADODB.Recordset
  Dim buf As String, buf2 As String
  Dim mySQL As String, mySQL2 As String
  Dim i As Long
  Dim myDic As Object
  Dim myKey As Variant
  Dim myDO As DataObject
  
  Set myDic = CreateObject("Scripting.Dictionary")
  'DataObjectオブジェクトのインスタンスの生成
  Set myDO = New DataObject
  
  Set cn = CurrentProject.Connection
  Set rs = New ADODB.Recordset
  Set rs2 = New ADODB.Recordset
    'checkBoxを掴んでいると更新されないので、追加した
  DoCmd.RunCommand acCmdSelectRecord

  mySQL = "SELECT * FROM t_function WHERE check=true;"
  rs.CursorLocation = adUseClient
  rs.Open mySQL, cn, adOpenKeyset, adLockOptimistic
  Do While Not rs.EOF
    mySQL2 = "SELECT * FROM t_argment WHERE funcID='" & rs!funcID & "';"
    rs2.Open mySQL2, cn, adOpenKeyset, adLockOptimistic
    Do While Not rs2.EOF
      buf = rs2!argtype
      '大文字のタイプだけ対象とする
      If (Asc(Left(buf, 1)) >= 65 And Asc(Left(buf, 1)) <= 90) Then
        If Not myDic.exists(buf) Then
            myDic.Add buf, ""
        End If
      End If
      rs2.MoveNext
    Loop
    rs2.Close
    rs.MoveNext
  Loop
    
  myKey = myDic.Keys
  For i = 0 To myDic.Count - 1
      mySQL2 = "SELECT * FROM t_type WHERE typeName='" & myKey(i) & "';"
      rs2.CursorLocation = adUseClient
      rs2.Open mySQL2, cn, adOpenKeyset, adLockOptimistic
  
      If rs2.RecordCount >= 1 Then
        If buf2 = "" Then
          buf2 = rs2!declaration
        Else
          buf2 = buf2 & vbCrLf & vbCrLf & rs2!declaration
        End If
      End If
      rs2.Close
  Next i
  rs.MoveFirst
  Do While Not rs.EOF
    buf2 = buf2 & vbCrLf & vbCrLf & rs!declareStatement
    rs.MoveNext
  Loop
  '文字列のセット
  myDO.SetText buf2
  'クリップボードに転送
  myDO.PutInClipboard
  MsgBox "宣言文をクリップボードにコピーしました"
  
  Set rs = Nothing
  Set rs2 = Nothing
  Set cn = Nothing
  Set myDic = Nothing
End Sub

<実行例>
なんとかDCという名前の関数と、必要な構造体を抽出してみました
その構造体で更に必要な構造体まではサポートしておりませんが...

Type DEVMODE
        dmDeviceName As String * CCHDEVICENAME
        dmSpecVersion As Integer
        dmDriverVersion As Integer
        dmSize As Integer
        dmDriverExtra As Integer
        dmFields As Long
        dmOrientation As Integer
        dmPaperSize As Integer
        dmPaperLength As Integer
        dmPaperWidth As Integer
        dmScale As Integer
        dmCopies As Integer
        dmDefaultSource As Integer
        dmPrintQuality As Integer
        dmColor As Integer
        dmDuplex As Integer
        dmYResolution As Integer
        dmTTOption As Integer
        dmCollate As Integer
        dmFormName As String * CCHFORMNAME
        dmUnusedPadding As Integer
        dmBitsPerPel As Integer
        dmPelsWidth As Long
        dmPelsHeight As Long
        dmDisplayFlags As Long
        dmDisplayFrequency As Long
End Type

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

Declare Function CancelDC Lib "gdi32" (ByVal hdc As Long) As Long

Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long

Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As DEVMODE) As Long

Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Declare Function GetDCEx Lib "user32" (ByVal hwnd As Long, ByVal hrgnclip As Long, ByVal fdwOptions As Long) As Long

Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long

Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Declare Function ResetDC Lib "gdi32" Alias "ResetDCA" (ByVal hdc As Long, lpInitData As DEVMODE) As Long

Declare Function RestoreDC Lib "gdi32" (ByVal hdc As Long, ByVal nSavedDC As Long) As Long

Declare Function SaveDC Lib "gdi32" (ByVal hdc As Long) As Long

Declare Function ScrollDC Lib "user32" (ByVal hdc As Long, ByVal dx As Long, ByVal dy As Long, lprcScroll As RECT, lprcClip As RECT, ByVal hrgnUpdate As Long, lprcUpdate As RECT) As Long

Declare Function WindowFromDC Lib "user32" (ByVal hdc As Long) As Long