2014-07-16 5 views
2

설정에 따라 런타임에 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

+0

MSDN 기사에서는 일부 변경 내용을 적용하기 위해 SetWindowPos를 호출해야한다고 언급합니다. 코드가이를 변경합니까 (예 : Redraw 메서드)? – Rikalous

+0

바로 거기에 SetWindowLongPtr (hWnd, GWL_STYLE, nStyle) 호출이 있습니다. 위 코드에 Sub Redraw()를 추가했습니다. – dblwizard

답변

0

에 한번 당신의 swpFlags 일정에 SWP_NOACTIVATE (&H10) 비트를 추가.

Btw, 이는 비 클라이언트 영역 만 다시 그립니다. RedrawNonclient과 같은 이름은 분명하게 나타납니다.

+0

그랬어! 엄청 고마워! – dblwizard