0

楽しみのために、Excel-vba から GDI (win32) 描画関数を呼び出したいと思いました。以下は私のdll関数宣言です。これらはすべて win32 からインポートされます。

Public Declare Function GetDC _
Lib "user32.dll" _
(ByVal handle As Long) As Long

Public Declare Function MoveToEx _
Lib "gdi32.dll" _
(ByVal handle As Long, ByVal x As Integer, ByVal y As Integer, ByVal lppoint As Long) As Integer

Public Declare Function LineTo _
Lib "gdi32.dll" _
(ByVal handle As Long, ByVal x As Integer, ByVal y As Integer) As Integer

Public Declare Function ReleaseDC _
Lib "user32.dll" _
(ByVal hwnd As Long, ByVal hdc As Long) As Integer

Public Declare Function GetSystemMetrics _
Lib "user32.dll" _
(ByVal i As Integer) As Integer

取得したい結果は、画面の左上隅から右下隅までの線です。次のコードは、必要な結果を提供します。

Private Sub CommandButton1_Click()
    Dim dc As Long

    dc = GetDC(0)
    screenX = GetSystemMetrics(0)
    screenY = GetSystemMetrics(1)
    MoveToEx dc, 0, 0, 0
    LineTo dc, screenX, screenY

    ReleaseDC 0, dc
End Sub

しかし問題は、次のコードが何もしないことです。なんで?

Private Sub CommandButton1_Click()
    Dim dc As Long
    Dim screenX, screenY As Integer

    dc = GetDC(0)
    screenX = GetSystemMetrics(0)
    screenY = GetSystemMetrics(1)
    MoveToEx dc, 0, 0, 0
    LineTo dc, screenX, screenY

    ReleaseDC 0, dc
End Sub

唯一の違いは、2 番目のコードの 3 行目で変数が宣言されてscreenXおりscreenY、最初のコードでは変数が宣言されていないことです。誰が何が起こっているのか説明してもらえますか?

4

3 に答える 3

3

バリアントの意図しない使用につながる、変数のすべての誤った宣言と同様に、さらにいくつかの問題が見られます。

  1. Integer多くの API 呼び出しで使用します。しかし、VBAIntegerでは符号付き 16 ビット型です。ステートメントでのすべての使用はInteger、代わりに、符号付き 32 ビット整数である必要があります。DeclareLong
  2. 画面 DC に描画しています。あなたはこれをするべきではありません。予想外の結果になります。画面はシステムによって所有されているため、その DC に描画しないでください。何をしようとしても、別の方法を見つける必要があります。
于 2013-01-11T12:23:02.893 に答える
1

試す:

Dim screenX As Integer
Dim screenY As Integer

実際にDim screenX, screenY As Integerは次と同等です。

Dim screenX As Variant
Dim screenY As Integer
于 2013-01-11T04:10:33.237 に答える
1

変数宣言を必須に設定しないでください。もしそうなら、あなたは

Option Explicit

各モジュールの上部にあります。

あなたはそれを持っていないので、最初のコード サンプルではscreenXとの両方screenYがバリアントにデフォルト設定されています。

2 番目のサンプルでは、screenX​​任意のデータ型に対応するバリアントに設定していますが、明示的にscreenY整数として設定しており、整数は実行しているデータ型として適切ではありません。

編集:デビッドの答えによると、整数ではなく長整数が必要です。

注: バリアントは奇妙で見つけにくいバグを引き起こす可能性があるため、注意してください。整数は明らかに適切な型ではありませんが、必要なデータ型を把握して明示的に宣言する必要があります。

于 2013-01-11T04:52:24.390 に答える