2

私はまだサポートしており、GetWindowLong と SetWindowLong を利用して設定に応じて実行時に ControlBox を削除する古い vb6 アプリケーションをサポートしています。これはすべての 32 ビット システムでうまく機能しますが、64 ビット システムで実行すると、メイン ウィンドウが適切に更新されなくなります。問題は、TextBox、ListBox、または CommandButton などの入力コントロールにあるようです。特定のウィンドウに覆われた後、フォーカスを受け取るまで表示されず、境界線が正しく表示されません。

MSDN のドキュメントhttp://msdn.microsoft.com/en-us/library/ms633591%28v=vs.85%29.aspxを読みましたが、これらの関数は互換性を保つために ...WindowLongPtr 関数に取って代わられていると書かれています32 ビット システムと 64 ビット システムの両方で使用できます。私が読むことができたすべてのものから、実際には、異なるプラットフォームで実行するのではなく、32 ビット バージョンと 64 ビット バージョンの両方をコンパイルすることについて話していることがわかりました。宣言をから変更しようとしました

Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Declare Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

しかし、「user32 に DLL エントリ ポイント GetWindowLongPtrA が見つかりません」というエラーが表示されます。そこで、エイリアスを「... WindowLongA」のままにしてみましたが、それが実行され、予想どおり、更新の問題に違いはありません。

他の誰かがこれを見たことがありますか、何か提案がありますか?

コードの使用方法のサンプルを次に示します。

Private Sub Form_Activate()
   ...
   Call SetControlBox(Me.hWnd, DisableFullScreen)
End Sub


Public Sub SetControlBox(ByVal hWnd As Long, ByVal Value As Boolean)
   ' Set WS_SYSMENU On or Off as requested.
   Call FlipBit(hWnd, WS_SYSMENU, Value)
End Sub

Public Function FlipBit(ByVal hWnd As Long, ByVal Bit As Long, ByVal Value As Boolean) As Boolean
   Dim nStyle As Long

   ' Retrieve current style bits.
   nStyle = GetWindowLongPtr(hWnd, GWL_STYLE)

   ' Attempt to set requested bit On or Off,
   ' and redraw
   If Value Then
      nStyle = nStyle Or Bit
   Else
      nStyle = nStyle And Not Bit
   End If
   Call SetWindowLongPtr(hWnd, GWL_STYLE, nStyle)
   Call Redraw(hWnd)

   ' Return success code.
   FlipBit = (nStyle = GetWindowLongPtr(hWnd, GWL_STYLE))
End Function

Public Sub Redraw(ByVal hWnd As Long)
   ' Redraw window with new style.
   Const swpFlags As Long = SWP_FRAMECHANGED Or SWP_NOMOVE Or SWP_NOZORDER Or SWP_NOSIZE
   SetWindowPos hWnd, 0, 0, 0, 0, 0, swpFlags
End Sub

ありがとう

dbl

4

1 に答える 1