설정에 따라 런타임에 ControlBox를 제거하기 위해 GetWindowLong 및 SetWindowLong을 사용하는 이전 vb6 응용 프로그램과 여전히 지원하고 있습니다. 이것은 모든 32 비트 시스템에서 훌륭하게 작동하지만 64 비트 시스템에서 실행될 때 기본 창은 더 이상 적절하게 새로 고쳐지지 않습니다. 문제는 TextBox, ListBox 또는 CommandButton과 같은 입력 컨트롤 인 것 같습니다. 특정 창에 의해 가려진 후 포커스를받을 때까지 표시되지 않으며 테두리가 제대로 표시되지 않습니다.VB6 SetWindowLong Windows 7에서 새로 고침 문제 발생 64 비트
MSDN 설명서 http://msdn.microsoft.com/en-us/library/ms633591%28v=vs.85%29.aspx에 의해이 기능이 대체되었다고 읽었습니다. WindowLongPtr 함수는 32 비트 및 64 비트 시스템과 호환 될 수 있습니다. 필자가 읽었던 모든 것들은 실제로 다른 플랫폼에서 실행되는 대신 32 비트와 64 비트 버전을 모두 컴파일하는 것에 대한 이야기입니다. 나는
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
에
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
에서 내 선언을 변경 해봤하지만 오류가 "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
MSDN 기사에서는 일부 변경 내용을 적용하기 위해 SetWindowPos를 호출해야한다고 언급합니다. 코드가이를 변경합니까 (예 : Redraw 메서드)? – Rikalous
바로 거기에 SetWindowLongPtr (hWnd, GWL_STYLE, nStyle) 호출이 있습니다. 위 코드에 Sub Redraw()를 추가했습니다. – dblwizard