본문 바로가기

Dev::Etc/VB 6.0

Control 을 이미지로 저장


컨트롤의 모양을 그대로 이미지로 변환하여 저장할 때


가장 쉽게는 스크린샷을 떠서 그 위치만 오려내는 방법도 있지만 


이 방법은 화면에 보여지는 부분만 가져올 수 있고 


화면에 보여지지 않고 다른 컨트롤에 가려져 있다거나 사이즈가 커서 부모의 보여지는 범위를 넘어선 경우,


또는 내용에 따라서 스크롤을 통해서 내용이 가져진 경우는 스크린샷을 뜨는 방법으로는 한계가 있다.



그래서 사용한 다른 방법이 PictureBox 를 이용하는 방법이다.


Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long


Private Const WM_PAINT = &HF

Private Const WM_PRINT = &H317

Private Const PRF_CLIENT = &H4&

Private Const PRF_CHILDREN = &H10&

Private Const PRF_OWNED = &H20&


SendMessage API 를 사용하기 위해서 선언부와 사용에 필요한 상수들을 정의하고



Private Sub Command1_Click()

     

    Set Me.Text1.Container = Me.Picture1

     

    Me.Picture1.Width = Me.Text1.Width

    Me.Picture1.Height = Me.Text1.Height

    

    Me.Picture1.AutoRedraw = True

     

    SendMessage Me.Picture1.hwnd, WM_PAINT, Me.Picture1.hDC, 0

    SendMessage Me.Picture1.hwnd, WM_PRINT, Me.Picture1.hDC, PRF_CHILDREN Or PRF_CLIENT Or PRF_OWNED

         

    SavePicture Me.Picture1.Image, "C:\" & Format(Now, "YYYYMMDDHHMMSS") & ".BMP"

     

    Set Me.Text1.Container = Me

         

End Sub 


내용 입력 후 버튼 클릭시

이미지로 저장할 컨트롤 Text1 의 부모를 특정 PictureBox 로 변경하고 

Text1의 내용이 길다면 알맞게 조정하고 

SendMessage 를 통해서 PictureBox 의 자식들을 출력하게 하면 

PictureBox 에 자식 Control 이 그대로 그려지게 된다.


그려진 이미지를 그대로 저장하면 끝.




나는 Farpoint Spread 를 이미지로 변환이 필요하였고 

컬럼 과 로우 에 맞게 사이즈를 조정후 실행결과 원하는 답을 얻을 수 있었다.


C# 에서도 적절히 소스를 변환하면 동일한 결과를 얻을 수 있지만

C#은 DrawToBitmap 이 있으므로 무효.

'Dev::Etc > VB 6.0' 카테고리의 다른 글

VB6.0 컨트롤 동적생성  (0) 2010.01.30