오스크 등의 프로그램을 위해 윈도우 타이틀바를 필요치 않으면 Form 속성중 BorderStyle을 0으로 설정하는데

런타임시에 Show/Hide를 하고 싶을때 아래 코드를 참고하자.



Private Declare Function GetWindowLong Lib "user32" _

                  Alias "GetWindowLongA" _

                        (ByVal hwnd As Long, _

                         ByVal nIndex As Long) As Long


Private Declare Function SetWindowLong Lib "user32" _

                  Alias "SetWindowLongA" _

                        (ByVal hwnd As Long, _

                         ByVal nIndex As Long, _

                         ByVal dwNewLong As Long) As Long


Private Declare Function GetWindowRect Lib "user32" _

                        (ByVal hwnd As Long, _

                         lpRect As RECT) As Long


Private Declare Function SetWindowPos Lib "user32" _

                        (ByVal hwnd As Long, _

                         ByVal hWndInsertAfter As Long, _

                         ByVal x As Long, _

                         ByVal y As Long, _

                         ByVal cx As Long, _

                         ByVal cy As Long, _

                         ByVal wFlags As Long) As Long


Private Const GWL_STYLE = (-16)


Private Const WS_CAPTION = &HC00000 ' WS_BORDER Or WS_DLGFRAME

Private Const WS_MAXIMIZEBOX = &H10000

Private Const WS_MINIMIZEBOX = &H20000

Private Const WS_THICKFRAME = &H40000

Private Const WS_SYSMENU = &H80000


Private Const SWP_NOSIZE = &H1

Private Const SWP_NOMOVE = &H2

Private Const SWP_NOZORDER = &H4

Private Const SWP_FRAMECHANGED = &H20


Private Type RECT

    Left As Long

    Top As Long

    Right As Long

    Bottom As Long

End Type



Private Sub Command1_Click()

  SetWindowLong Me.hwnd, GWL_STYLE, _

                GetWindowLong(Me.hwnd, GWL_STYLE) And Not (WS_CAPTION)


  SetWindowPos Me.hwnd, 0, 0, 0, 0, 0, _

                SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOZORDER Or SWP_FRAMECHANGED

End Sub


Private Sub Command2_Click()

  SetWindowLong Me.hwnd, GWL_STYLE, _

                GetWindowLong(Me.hwnd, GWL_STYLE) Or (WS_CAPTION)


  SetWindowPos Me.hwnd, 0, 0, 0, 0, 0, _

                SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOZORDER Or SWP_FRAMECHANGED

End Sub


Private Sub Form_Load()

  Command1.Caption = "Hide"

  Command2.Caption = "Show"

End Sub


Tip.
코드를 실행시켜보면 단순히 타이틀만 없어지고 사이즈 조절은 된다.
BorderStyle을 없음(0)으로 설정한 것과 같이 하려면 WS_CAPTION을 WS_CAPTION OR WS_THICKFRAME 로 
변경하면 된다.

'VB6 > Interface' 카테고리의 다른 글

폼에 보여줄 영역 만들기(구멍난 폼)  (0) 2013.03.28
바탕화면 아이콘 Show/Hide  (0) 2013.03.28
폼 위치, 크기 구하기  (0) 2013.03.27
폼 투명도 주기  (0) 2013.03.27
폼 타이틀바 이동효과  (0) 2013.03.26

폼에 Picture박스를 한개 가져다 놓고, 

아래와 같이 Visible속성을 적용하여 객체를 가시적으로 표현할 수 있습니다.


감출땐

Picture1.Visible = False    ' Hide


보이게할땐

Picture1.Visible = True     ' Show



이와 동일한 효과를 주기위해 ShowWindow 를 이용하여 폼이나 컨트롤 등의 핸들값을 가지는 객체를 Show/Hide 할 수 있습니다.


Private Declare Function ShowWindow Lib "user32" _

                        (ByVal hWnd As Long, _

                         ByVal nCmdShow As Long) As Long


Private Const SW_HIDE = 0

Private Const SW_SHOW = 5


감출땐 
ShowWindow Picture1.hWnd, SW_HIDE

보일게할땐
ShowWindow Picture1.hWnd, SW_SHOW



프로젝트 내에서 접근가능한 객체를 위와같이 Show/Hide하진 않지만 대상이 윈도우의 시작버튼이나 다른 프로그램의 경우라면

ShowWindow와 같은 API를 사용해야 합니다.

참고가 될만한 예로 바탕화면에 있는 아이콘을 말끔하게 지워버리는(?) 간단한 코드를 작성해봅니다.

폼에 Command버튼을 2개 만들고 각 버튼의 Caption 값을 Hide 와 Show로 합니다. 



Private Declare Function FindWindowEx Lib "user32" Alias _

                        "FindWindowExA" _

                        (ByVal hWnd1 As Long, _

                         ByVal hWnd2 As Long, _

                         ByVal lpsz1 As String, _

                         ByVal lpsz2 As String) As Long

                         

Private Declare Function ShowWindow Lib "user32" _

                        (ByVal hWnd As Long, _

                         ByVal nCmdShow As Long) As Long


Private Const SW_HIDE = 0

Private Const SW_SHOW = 5


'Hide 하는 버튼

Private Sub Command1_Click()

  Dim lHandle   As Long

  lHandle = FindWindowEx(0&, 0&, "Progman", vbNullString)

  ShowWindow lHandle, SW_HIDE

End Sub


'Show 하는 버튼

Private Sub Command2_Click()

  Dim lHandle As Long

  lHandle = FindWindowEx(0&, 0&, "Progman", vbNullString)

  ShowWindow lHandle, SW_SHOW

End Sub


lHandle 변수에 대상이 되는 객체에 핸들값을 얻어 ShowWindow 함수에 첫번째 인자값으로 넘겨주고 

SW_HIDE 또는 SW_SHOW 를 두번째 인자에 적용하기만 하면 되는 예입니다.


대상 객체의 핸들값을 구할 수 있는 방법은 여러가지 방법이 있겠지만 대체로 FindWindowEx, FindWindow 등을 이용하니 

검색을 통해 더 많은 정보를 찾으시길 바람니다.


Tip.

마우스 포인트가 위치하는 윈도우 핸들 구하기




'VB6 > Interface' 카테고리의 다른 글

폼에 보여줄 영역 만들기(구멍난 폼)  (0) 2013.03.28
폼 타이틀바 Show/Hide  (0) 2013.03.28
폼 위치, 크기 구하기  (0) 2013.03.27
폼 투명도 주기  (0) 2013.03.27
폼 타이틀바 이동효과  (0) 2013.03.26

마우스커서가 현재 위치하고 있는 윈도우 핸들을 알고 싶을때 아래 코드를 참고하자.

PointToHandle와 같이 함수형태로 만들어 놓으면 호출시 핸들값을 리턴한다.


GetCursorPos는 현재 마우스커서의 위치를 POINTAPI 구조체에 담아주고, WindowFromPoint 를 통해 x좌표, y좌표를 넘겨주면 해당 좌표에 핸들을 리턴한다.


Private Declare Function GetCursorPos Lib "user32" _

                        (lpPoint As POINTAPI) As Long

                        

Private Declare Function WindowFromPoint Lib "user32" _

                        (ByVal xPoint As Long, _

                         ByVal yPoint As Long) As Long

Private Type POINTAPI

        x As Long

        y As Long

End Type


Private Function PointToHandle() As Long

  Dim pt        As POINTAPI

  GetCursorPos pt

  PointToHandle = WindowFromPoint(pt.x, pt.y)

End Function


'VB6 > Function' 카테고리의 다른 글

Desktop 이름 구하기  (0) 2013.04.01
대기시간 함수  (0) 2013.03.27

+ Recent posts