● 비트맵 정보 헤더
● 원형
 
구조
 
구조 멤버
biSize ━ 이 구조체 바이트 크기
biWidth ━ 비트맵 폭 픽셀수
biHeight ━ 비트맵 높이 픽셀수
biPlanes ━ 면수
biBitCount ━ 픽셀당 비트수
biCompression ━ 압축 방법
biSizeImage ━ 이미지 크기
biXPelsPerMeter ━ 미터당 픽셀수 수평
biYPelsPerMeter ━ 미터당 픽셀수 수직
biClrUsed ━ 칼라 테이블의 칼라수
biClrImportant ━ 필요한 칼라수
● 상수
● biCompression 사용, 압축 방법

상수 설명
BI_RGB 0 압축되지 않음
BI_RLE8 1
BI_RLE4 2
BI_BITFIELDS 3
BI_JPEG 4 JPEG 이미지
BI_PNG 5 PNG 이미지

'API > 선언' 카테고리의 다른 글

BITMAPFILEHEADER 구조  (0) 2011.12.16
WM_PRINT 메세지  (0) 2011.11.20
GetDeviceCaps 함수  (0) 2011.11.04
FLASHWINFO 구조  (0) 2011.10.28
FlashWindowEx 함수  (0) 2011.10.28

● 비트맵 파일의 헤더
● 원형
 
구조
 
구조 멤버
bfType ━ 파일 타입, BM
bfSize ━ 비트맵 파일 크기, 바이트
bfReserved1 ━ 0
bfReserved2 ━ 0
bfOffBits ━ 이 구조의 시작에서 부터 비트맵 비트 데이타가 시작되는 옵셋 위치

'API > 선언' 카테고리의 다른 글

BITMAPINFOHEADER 구조  (0) 2011.12.16
WM_PRINT 메세지  (0) 2011.11.20
GetDeviceCaps 함수  (0) 2011.11.04
FLASHWINFO 구조  (0) 2011.10.28
FlashWindowEx 함수  (0) 2011.10.28

● 지정된 윈도우의 시각적인 부분을 지정된 DC에 그릴때 발생
● 원형
 
 ● 선언
WM_PRINT = &H317
wparam
지정된 윈도우를 그릴 윈도우의 DC 핸들
● lparam
지정된 윈도우에서 어떤 부분을 그릴지를 나타낸다. OR로 묶을수 있다.
● 상수
● lparam에서 사용, 지정된 윈두에서 그릴 영역

상수 16 설명
PRF_CHECKVISIBLE 1 시각적으로 보이는 윈도우만 그린다
PRF_CHILDREN 10 모든 보이는 자식 윈도우를 그린다
PRF_CLIENT 4 윈도우의 클라이언트 영역만 그린다
PRF_ERASEBKGND 8 윈도우 그리기전에 배경은 지운다
PRF_NONCLIENT 2 윈도우의 비클라이언트 영역만 그린다
PRF_OWNED 20 모든 소유한 윈도우를 그린다

이 메세지를 보내므로서 윈도우의 자식 윈도우가 포함 되어 있을 경우
자식 윈도우가 포함된 클라이언트 영역의 이미지를 얻을수 있다.

'API > 선언' 카테고리의 다른 글

BITMAPINFOHEADER 구조  (0) 2011.12.16
BITMAPFILEHEADER 구조  (0) 2011.12.16
GetDeviceCaps 함수  (0) 2011.11.04
FLASHWINFO 구조  (0) 2011.10.28
FlashWindowEx 함수  (0) 2011.10.28

● 관련 ━ 디스플레이,장치,정보
● 디스플레이 장치의 정보를 얻는다
● 원형
 
선언
GetDeviceCaps Lib "GDI32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
인수
hdc ━ 알고자 하는 DC 정보
nIndex ━ 알고자 하는 DC의 속성
● 반환
성공 ━ 지정된 항목에 해당하는 값
● 상수
● nIndex 사용, 속성

상수 설명
DRIVERVERSION 0 DC와 관련된 장치의 드라이버 버전
TECHNOLOGY 2 디바이스의 종류를 조사한다. DC의 대상 장치가 프린터인지 화면인지를 구분할 수 있다
HORZSIZE 4 장치의 폭(밀리미터)
VERTSIZE 6 장치의 높이(밀리미터)
HORZRES 8 장치의 폭(픽셀)
VERTRES 10 장치의 높이(픽셀)
LOGPIXELSX 88 인치당 X축 픽셀수
LOGPIXELSY 90 인치당 Y축 픽셀수
BITSPIXEL 12 픽셀당 비트수
PLANES 14 색상면의 수
NUMBRUSHES 16 장치의 브러쉬 갯수
NUMPENS 18 장치의 펜의 갯수
NUMFONTS 22 장치의 폰트 갯수
NUMCOLORS 24 장치가 8bpp이하 일경우 색상 테이블의 항목 수
ASPECTX 40 선을 그을때 상대적인 폭
ASPECTY 42 선을 그을때 상대적인 높이
ASPECTXY 44 선을 그을때 대각선의 폭
PDEVICESIZE 26 예약
CLIPCAPS 36 장치의 클리핑 능력,클리핑 가능은 1, 그렇치 않으면 0
SIZEPALETTE 104 시스템 팔레트의 엔트리 갯수
NUMRESERVED 106 시스템 팔레트의 예약된 엔트리 갯수
COLORRES 108 장치의 실제 색상 수
PHYSICALWIDTH 110 프린터에 해당하며, 페이지의 실제 폭
PHYSICALHEIGHT 111 프린터에 해당하며, 페이지의 실제 높이
PHYSICALOFFSETX 112 인쇄 가능한 영역과 용지와의 X축 거리
PHYSICALOFFSETY 113 인쇄 가능한 영역과 용지와의 X축 거리
SCALINGFACTORX 114 프린터 확대시 X축 비율
SCALINGFACTORY 115 프린터 확대시 Y축 비율
RASTERCAPS 38 장치의 래스트 출력 능력
CURVECAPS 28 장치의 곡선 기능
LINECAPS 30 장치의 선 기능
POLYGONALCAPS 32 장치의 폴리곤 기능
TEXTCAPS 34 장치의 문자처리 기능
● nIndex 에서 TECHNOLOGY 지정시 반환된 값
상수 설명
DT_PLOTTER 0 벡터 플로터
DT_RASDISPLAY 1 라스터 표시장치
DT_RASPRINTER 2 라스터 프린터
DT_RASCAMERA 3 라스터 카메라
DT_CHARSTREAM 4 문자 스트림
DT_METAFILE 5 메타파일
DT_DISPFILE 6 디스플레이 파일
● nIndex 에서 RASTERCAPS 지정시 반환된 각 비트값
상수 16 설명
RC_BANDING 2 밴딩 지원이 요구
RC_BITBLT 1 비트맵 전송을 지원,BitBlt 함수 사용 가능
RC_BITMAP64 8 64K 이상 비트맵 지원
RC_DI_BITMAP 80 Get(Set)DlBits 함수 사용 가능
RC_DIBTODEV 200 SetDlBitsToDevice 함수 사용 가능
RC_FLOODFILL 1000 면 채우기 기능 사용 가능
RC_GDI20_OUTPUT 10 16비트 윈도우 2.0 기능 지원
RC_PALETTE 100 팔레트 기반 장치
RC_SCALING 4 확대 지원
RC_STRETCHBLT 800 StretchBlt 함수 사용 가능
RC_STRETCHDIB 2000 StretchDIBits 함수 사용 가능
● nIndex 에서 CURVECAPS 지정시 반환된 값
상수 설명
CC_NONE 0 곡선을 지원하지 않음
CC_CIRCLES 1 원을 그릴 수 있음
CC_PIE 2 파이(Pie)를 그릴 수 있음
CC_CHORD 4 현을 그릴 수 있음
CC_ELLIPSES 8 타원을 그릴 수 있음
CC_WIDE 16 넓은 원주선을 그릴 수 있음
CC_STYLED 32 무뉘가 있는 원주선을 그릴 수 있음
CC_WIDESTYLED 64 넓은 무뉘가 있는 원주선을 그릴 수 있음
CC_INTERIORS 128 내부 장식이 가능함
CC_ROUNDRECT 256 둥근 사각형을 그릴 수 있음
● nIndex 에서 LINECAPS 지정시 반환된 값
상수 설명
LC_NONE 0 선을 지원하지 않음
LC_POLYLINE 2 다각선을 지원함
LC_MARKER 4 표시마크를 지원함
LC_POLYMARKER 8 여러 표시마크를 지원함
LC_WIDE 16 넓은 선을 지원함
LC_STYLED 32 무늬 선을 지원함
LC_WIDESTYLED 64 넓은 무늬 선을 지원함
LC_INTERIORS 128 내부 장식을 지원함
● nIndex 에서 POLYGONALCAPS 지정시 반환된 값
상수 설명
PC_NONE 0 폴리곤을 지원하지 않음
PC_POLYGON 1 채움 폴리곤을 지원함
PC_RECTANGLE 2 사각형을 지원함
PC_WINDPOLYGON 4 구불구불한 폴리곤을 지원함
PC_SCANLINE 8 단일 스캔라인을 지원함
PC_WIDE 16 넓은 외곽선을 지원함
PC_STYLED 32 무늬 있는 외곽선을 지원함
PC_WIDESTYLED 64 넓은 무늬 있는 외곽선을 지원함
PC_INTERIORS 128 내부 장식을 지원함
● nIndex 에서 TEXTCAPS 지정시 반환된 값
상수 16 설명
TC_OP_CHARACTER 1 문자 출력
TC_OP_STROKE 2 강조 문자 출력
TC_CP_STROKE 4 강조 클립 성능
TC_CR_90 8 90도 회전 가능
TC_CR_ANY 10 모든 문자 회전 가능
TC_SF_X_YINDEP 20 x 또는 y 방향으로 크기 변경 가능
TC_SA_DOUBLE 40 2배 크기 가능
TC_SA_INTEGER 80 문자 크기를 위해 배수 확대 가능
TC_SA_CONTIN 100 정확한 문자 크기를 위한 배수 확대 가능
TC_EA_DOUBLE 200 2중 문자 지원
TC_IA_ABLE 400 이탤릭 문자 지원
TC_UA_ABLE 800 밑줄 문자 지원
TC_SO_ABLE 1000 강조 지원
TC_RA_ABLE 2000 래스터 글꼴 지원
TC_VA_ABLE 4000 백터 글꼴 지원
TC_RESERVED 8000 예약
TC_SCROLLBLT 10000 비트 블록 이동을 이용한 스크롤 사용불가

'API > 선언' 카테고리의 다른 글

BITMAPFILEHEADER 구조  (0) 2011.12.16
WM_PRINT 메세지  (0) 2011.11.20
FLASHWINFO 구조  (0) 2011.10.28
FlashWindowEx 함수  (0) 2011.10.28
FlashWindow 함수  (0) 2011.10.28
윈도우가 새로 생기거나 그러면, 해당 윈도우의캡션바나, 작업표시줄의 해당 윈도우의 버튼이 깜박이는 것을 보실수 있읍니다.
이는 간단히 FlashWindowFlashWindowEx 를 사용해 구현이 가능합니다.
더군다나 FlashWindowEx를 사용하면 더 세분화 대게 조절이 가능합니다.캡션바냐? 작업표시줄이냐? 언쩨까지? 몇회?가 조절이 가능합니다.
● 윈도우의 캡션바나, 작업표시줄의 해당 윈도우의 버튼을 깜박이게하는 정보
● 원형
 
구조
 
구조 멤버
cbSize ━ 이 구조의 크기
hwnd ━ 깜박이게 할 윈도우 핸들
dwFlags ━ 플래그
uCount ━ 깜박이는 횟수
dwTimeout ━ 깜박이는 속도, 밀리초(ms)
● 상수
● dwFlags 사용, 플래그(하나 이상 OR 연결 사용 가능)
상수 16 설명
FLASHW_STOP 0 깜박임 정자,윈도우 원래 상태로
FLASHW_CAPTION 1 윈도우 캡션바 깜박임
FLASHW_TRAY 2 윈도우의 작업표시줄 버튼 깜박임
FLASHW_ALL 3 FLASHW_CAPTION Or FLASHW_TRAY
FLASHW_TIMER 4 연속적인 깜박임, FLASHW_STOP이 호출될 때까지
FLASHW_TIMERNOFG C 연속적인 깜박인, 윈도우가 활성 상태가 될 때까지

'API > 선언' 카테고리의 다른 글

WM_PRINT 메세지  (0) 2011.11.20
GetDeviceCaps 함수  (0) 2011.11.04
FlashWindowEx 함수  (0) 2011.10.28
FlashWindow 함수  (0) 2011.10.28
SetTimer 함수  (0) 2011.10.21

● 윈도우와, 윈도우의 작업표시줄에 표시된 항목을 깜박거리개 한다.
● 원형
 
선언
FlashWindowEx Lib "user32" (pfwi As FLASHWINFO) As Boolean
● 인수
pfwi ━ 윈도우 핸들
● 반환
이 함수를 호출하기 전의 윈도우의 상태, 윈도우가 활성 상태이면 0이 아닌 값, 그 외는 0

'API > 선언' 카테고리의 다른 글

GetDeviceCaps 함수  (0) 2011.11.04
FLASHWINFO 구조  (0) 2011.10.28
FlashWindow 함수  (0) 2011.10.28
SetTimer 함수  (0) 2011.10.21
KillTimer 함수  (0) 2011.10.21

● 윈도우와, 윈도우의 작업표시줄에 표시된 항목을 깜박거리개 한다.
● 원형
 
● 선언

FlashWindow Lib "user32" (ByVal hWnd As Long, ByVal bInvert As Long) As Boolean
● 인수
hWnd ━ 윈도우 핸들
bInvert ━ True이면 윈도우의 상태를 반전, False이면 윈도우의 원래 상태로
● 반환
이전 상태

'API > 선언' 카테고리의 다른 글

FLASHWINFO 구조  (0) 2011.10.28
FlashWindowEx 함수  (0) 2011.10.28
SetTimer 함수  (0) 2011.10.21
KillTimer 함수  (0) 2011.10.21
CopyMemory,MoveMemory,RtlMoveMemory 함수  (0) 2011.10.15

● 타이머를 설정한다, 타이머 제거시 KillTimer를 사용한다
● 원형
 
선언 
SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
● 인수
hwnd ━ 타이머와 연관된 윈도우 핸들(호출될 쓰레드를 포함하는 윈도우),
nIDEvent ━ 0이 아닌 타이머 식별자
uElapse ━ 타임아웃 시간,밀리초
lpTimerFunc ━ 타임아웃시 호출할 콜백함수 TimerProc
● 복귀
성공 ━ hwnd가 Null이면 타이머 식별자,hwnd가 Null이 아니면 0이 아닌값
실패 ━ 0

'API > 선언' 카테고리의 다른 글

FlashWindowEx 함수  (0) 2011.10.28
FlashWindow 함수  (0) 2011.10.28
KillTimer 함수  (0) 2011.10.21
CopyMemory,MoveMemory,RtlMoveMemory 함수  (0) 2011.10.15
GetWindowDC 함수  (0) 2011.10.13

● 타이머를 제거한다
● 원형
 
선언
KillTimer Lib "user32" (ByVal hwnd As Long, ByVal uIDEvent As Long) As Long
● 인수
hwnd ━ 타이머와 연관된 윈도우 핸들
uIDEvent ━ 타이머 식별자로, hwnd이 Null이 아니면 SetTimer에 uIDEvent값, hwnd이 Null이면 타이머 식별자인
SetTimer의 반환값 지정
● 복귀
성공 ━ 0이 아닌값
실패 ━ 0

'API > 선언' 카테고리의 다른 글

FlashWindow 함수  (0) 2011.10.28
SetTimer 함수  (0) 2011.10.21
CopyMemory,MoveMemory,RtlMoveMemory 함수  (0) 2011.10.15
GetWindowDC 함수  (0) 2011.10.13
WM_ACTIVATE 윈도우 메세지  (0) 2011.10.13

타이머 컨트롤을 사용하려면 반드시 컨트롤이 필요하며, 컨트롤은 반드시 폼을 필요한다. 따라서 타이머 컨트롤을 사요하기 위해서는 폼이 필요하다. 그러나 일반 모듈 같은 곳에서 타이머를 사용하려면 방법이 없는 것은 아니다. API를 사용하여 타이머를 사용할 수 있다. SetTimer로 타이머를 작동시키고 KillTimer로 지정된 타이머를 삭제할수 있다.

다음은 소스이다.
'일반 모듈이다.
' 윈도우 없이 타이머를
Option Explicit

Public Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
Public Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long

Public state As Boolean ' 타이머 종료 프로시저 호출 상태
Public ID As Long ' 타이머 ID

Sub main()
    ID = SetTimer(0&, 1000, 100, AddressOf TimerProc)
    Form1.Show
End Sub

' 타이머 프로시저
Public Sub TimerProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
    Debug.Print state '
End Sub

다음은 폼 모듈이다.
Option Explicit

Private Sub Command1_Click()
    state = True
    KillTimer 0&, ID ' 타이머를 제거한다.
End Sub

여기서 폼 모듈은, KillTimer의 호출 여부를  확인 하기 위한 상태 변수를 지정하기 위함이다.
소스를 실행시키면 직접 실행창에 KillTimer의 호출 상태를 나타내는 State의 상태 값이 쭉 표시된다.
폼의 커맨드 버튼을 누름과 거의 동시에 State 상태 값이 출력되는 것이 정지되는 볼수 있다. 즉 타이머가 삭제된 것이다.

● 메모리의 지정된 부분을 복사한다.
● 사용시 Type 데이타형 복사시에 Type데이타를 직접 사용하여도 된다, copymemory a,b,lenb(b)
● 원형

● 선언
CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long) RtlMoveMemory Lib "kernel32" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
● 인수
Destination ━ 복사받을 변수
Source ━ 복사할 변수
Length ━ 복사할 바이트 수

'API > 선언' 카테고리의 다른 글

SetTimer 함수  (0) 2011.10.21
KillTimer 함수  (0) 2011.10.21
GetWindowDC 함수  (0) 2011.10.13
WM_ACTIVATE 윈도우 메세지  (0) 2011.10.13
ReleaseDC 함수  (0) 2011.10.11

● 지정된 윈도우의 핸들의 DC를 얻는다.
● 반환은 ReleaseDC를 사용한다.
● 원형
HWND WINAPI GetDesktopWindow(void); 
선언 
GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
● 인수
hwnd ━ DC를 얻고 싶은 윈도우 핸들, Null(0)이면 전체 화면 DC를 반환한다.
● 반환
성공 ━ 핸들에서 얻은 DC
실패 ━ Null

'API > 선언' 카테고리의 다른 글

KillTimer 함수  (0) 2011.10.21
CopyMemory,MoveMemory,RtlMoveMemory 함수  (0) 2011.10.15
WM_ACTIVATE 윈도우 메세지  (0) 2011.10.13
ReleaseDC 함수  (0) 2011.10.11
GetDC 함수  (0) 2011.10.11
캐럿(Caret)이란 텍스트 박스(입력 상자)에서 입력 위치를 나타내주는 일잔적인 I자 모양을 캐럿이라고 한다.
비트맵을 로드 하여 캐럿을 생성하고, 텍스트 박스에 캐럿을 표시하는 형태이며
윈도우 활성,비활성을 알아보기 위해서 서브 클래싱을 사용했으면
WM_ACTIVATE 윈도우 메세지로, 윈두우 프로시저에서 윈도우 활성,비활성을 확인한다.

다음은 소스이다.
' 모듈 소스
Option Explicit

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const WA_INACTIVE = 0
Private Const WM_ACTIVATE = &H6

Public PreviosWindowProcedure As Long

Public Function WndProc(ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If MSG = WM_ACTIVATE And Not ((wParam & &HFFFF&) = WA_INACTIVE) Then
        Form1.TextShowCaret
    End If
    WndProc = CallWindowProc(PreviosWindowProcedure, hWnd, MSG, wParam, lParam)
End Function

'폼 소스
Option Explicit

Private Declare Function CreateCaret Lib "user32" (ByVal hWnd As Long, ByVal hBitmap As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function DestroyCaret Lib "user32" () As Long
Private Declare Function ShowCaret Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject 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 Const GWL_WNDPROC = (-4)
Private Const IMAGE_BITMAP = 0
Private Const LR_LOADFROMFILE = &H10

Private BitmapID As Long ' 이미지 핸들
Private FilePath As String ' 파일 경로

Private Sub Form_Load()
    FilePath = App.Path & "\mypic.bmp"
    BitmapID = LoadImage(App.hInstance, FilePath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)
    PreviosWindowProcedure = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf WndProc)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    SetWindowLong Me.hWnd, GWL_WNDPROC, PreviosWindowProcedure
    DestroyCaret
    DeleteObject BitmapID
    BitmapID = 0
End Sub

Private Sub txtCaret_Click()
    TextShowCaret
End Sub

Private Sub txtCaret_GotFocus()
    TextShowCaret
End Sub

Public Sub TextShowCaret()
    If BitmapID = 0 Then Exit Sub
    With txtCaret
        .SetFocus
        CreateCaret .hWnd, BitmapID, 0, 0
        ShowCaret .hWnd
    End With
End Sub

 

● 윈도우가 활성,비활성화 될 때 발생한다
● 원본
#define WM_ACTIVATE 0x0006
● 선언
WM_ACTIVATE= &H6
● wparam
하위 워드는 윈도우가 활성,비활성인지를 나타낸다.
윈도우가 최소화 상태인지를 나타낸다. 0이 아닌 값이면 최소화 상태
● lparam
윈도우 활성될때 이전의 활성 윈도우 핸들,윈도우가 비활성 될 때 다음에 활성되는 윈도우 핸들
● 상수
wparam 하위 워드 사용, 윈도우 활성,비활성 여부

상수 설명
WA_ACTIVE 1 활성
WA_CLICKACTIVE 2 마우스 클릭에 의한 활성
WA_INACTIVE 0 비활성

'API > 선언' 카테고리의 다른 글

KillTimer 함수  (0) 2011.10.21
CopyMemory,MoveMemory,RtlMoveMemory 함수  (0) 2011.10.15
GetWindowDC 함수  (0) 2011.10.13
ReleaseDC 함수  (0) 2011.10.11
GetDC 함수  (0) 2011.10.11

● 원형
int ReleaseDC(
  __in  HWND hWnd,
  __in  HDC hDC
)
● 지정된 윈도우의 DC를 반환,해제한다
GetWindowDC, GetDC로 얻은 DC
● 선언
ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hDC As Long) As Long
● 인수
hwnd ━ 반환할 DC를 갖는 핸들
hDC ━ 반환할 DC
● 반환
성공 ━ 1이면 반환
실패 ━ 0이면 반환 실패


'API > 선언' 카테고리의 다른 글

KillTimer 함수  (0) 2011.10.21
CopyMemory,MoveMemory,RtlMoveMemory 함수  (0) 2011.10.15
GetWindowDC 함수  (0) 2011.10.13
WM_ACTIVATE 윈도우 메세지  (0) 2011.10.13
GetDC 함수  (0) 2011.10.11

● 원형
HDC GetDC(
  __in  HWND hWnd
)
● 지정된 윈도우 핸들에서 클라이언트 영역만 사용 가능한 DC(커먼 DC)를 얻는다.
● 반환은 ReleaseDC를 사용한다.
● 선언
GetDC Lib "user32" (ByVal hwnd As Long) As Long
● 인수
hwnd ━ DC를 얻고 싶은 핸들
● 반환
성공 ━ 핸들에서 얻은 DC의 핸들
실패 ━ Null

'API > 선언' 카테고리의 다른 글

KillTimer 함수  (0) 2011.10.21
CopyMemory,MoveMemory,RtlMoveMemory 함수  (0) 2011.10.15
GetWindowDC 함수  (0) 2011.10.13
WM_ACTIVATE 윈도우 메세지  (0) 2011.10.13
ReleaseDC 함수  (0) 2011.10.11
■ DC는 Device Context의 약자로 출력(화면 출력,프린터 출력 등등)에 필요한 모든 정보를 가지는 구조체이며, 윈도우 상의 모든 출력 함수는 이 DC를 참조하여 출력을 하게 되며, 이 DC를 지칭하는 고유한 번호가 HDC(Handle Device Context)이다. 이 HDC를 사용하여 특정한 DC를 지정한다.

DC에는 그리기에 필요한 여러 가지 정보가 저장되어 있으며, 출력 함수들은 DC의 정보를 참조하여 그리기를 하고, DC의 정보를 조작하여 그리는 방법을 변경한다. 운영체제는 프로그램들끼리 상호 영역을 침법하지 않고 최대한 효율적으로 그리기를 할 수 있도록 DC의 정보를 관리한다.

■ DC 구조체의 멤버
멤버 초기값
배경색상 제어판에서 지정한 윈도우의 배경색
배경모드 불투명(QPAQUE)
비트맵 선택되지 않은 상태
브러시 흰색 브러시,WHITE_BRUSH
브러시 원점 (0,0)
클리핑 영역 작업영역 전체
팔레트 DEFAULT_PALETTE
펜 위치(CP) (0,0)
장치 원점 작업영역의 좌상단
그리기 모드 R2_COPYPEN
폰트 SYSTEM_FONT
자간 0
맵핑 모드 MM_TEXT
BALCK_PEN
다각형 채우기 모드 ALTERNATE
스트레치 모드 BLACKONWHITE
덱스트 색상 제어판에서 설정한 텍스트 색상
뷰포트 확장 (1,1)
뷰포트 원점 (0,0)
윈도우 확장 (1,1)
윈도우 원점 (0,0)
DC는 그리기 관련 정보의 집합된 구조체로 멤버가 좀 많은 구조체일 뿐이다. 이 구조체에는 그리기에 필요한 각종 정보가 멤버로 포함되어 있다. 이 외에도 훨씬 더 많은 런타임 데이터들이 포함될 것이다.

운영체제는 프로그램이 DC를 요구할 때마다 DC에 적절한 초기값을 대입하여 그 핸들(HDC)을 넘겨준다. 프로그램은 넘겨받은 DC핸들로 그림을 그리며 DC 정보가 정확한 이상 그리기는 항상 정확하게 수행된다고 보장할 수 있다.

■ DC의 타입에는 4가지가 있다.
디스플레이 DC 화면 출력에 사용된다.
프린터 DC 프린터 출력에 사용된다.
메모리 DC 비트맵 출력에 사용된다.
정보 DC 정보 취득을 위해 사용된다
디스플레이 DC는 다시 5가지로, 클래스 DC, 커먼 DC, 프라이빗 DC, 윈도우 DC, 페어런트 DC로 나누어진다.

■ 클래스 DC(Class Device Contexts)
16비트 호완을 위해서 있는것으로, 클래스 DC를 사용할 일이 있으면 프라이빗 DC를 사용을 권하고 있다

■ 커먼 DC(Common Device Contexts)
작업영역에 그리기를 하는 가장 보편적인 DC이며 화면 출력을 위해 사용하는 DC이다. GetDC나 BeginPaint로 DC의 핸들을 발급받으며 사용한 후에는 ReleaseDC나 EndPaint로 해제한다.

■ 프라이비트 DC(Private Device Contexts)
하나의 윈도우가 독자적으로 사용하는 DC이다. 커먼 DC는 그리기를 할 때마다 매번 발급받아야 하는데 비해 프라이비트 DC는 윈도우가 생성될 때 한번만 만들어지며 윈도우가 실행되는 동안 계속 존재한다. 그래서 프라이비트 DC에 한번 설정해 놓은 속성은 일부러 바꾸지 않는 한 계속 유효하며 그리기를 할 때마다 DC를 준비하지 않아도 되므로 그만큼 빠르게 그리기를 할 수 있다. 윈도우에서 이 DC를 사용기 위해서는 윈도우 클래스의 스타일에 CS_OWNDC 스타일을 지정해야한 다. 이런 스타일이 지정된 윈도우 클래스부터 윈도우가 만들어질 때마다 운영체제는 프라이비트 DC를 생성한다. 이렇게 생선된 DC의 핸들은 프로그램 전체를 통틀어 한번만(WM_CREATE 등에서) 읽으며 이 핸들로 모든 그리기를 할 수 있다. 윈도우 실행 주기 동안 계속 유지되는 DC이므로 사용 후에 해제할 필요도 없고 해제해서도 안된다. 윈도우가 파괴될 때 시스템이 DC를 파괴한다.

■ 윈도우 DC(Window Device Contexts)
윈도우 DC는 커먼 DC와 사용방법이 비슷하다. 차이점이라면 커먼 DC는 원점이 작업영역의 좌상단이지만 윈도우 DC는 윈도우의 좌상단이 원점이라는 점과 클리핑 영역이 작업영역에만 국한되는 것이 아니라 전체 윈도우라는 점이다. 그래서 윈도우 DC를 사용하면 작업영역뿐아니라 타이틀 바나 경계선에까지도 마음대로 출력할 수 있다. 윈도우 DC를 얻을 때는 GetWindowDC나 GetDCEx를 사용하고, 사용한 후에는 ReleaseDC로 해제한다.

■ 페어런트 DC(Parent Device Contexts)
클리핑 영역을 계산하는 시간을 최소화하기 위해 사용한다. 주로 버튼이나 에디트 등의 차일드 컨트롤에서 그리기 속도를 최대한 빠르게 하기 위해 사용되며 최상위 윈도우나 팝업 윈도우는 이 DC를 사용 할수 없다. 페어런트 DC를 사용하려면 윈도우 클래스의 스타일에 CS_PARENTDC 스타일을 지정한다. 윈도우는 페어런트 DC가 발급될 때 부모 윈도우가 사용하던 DC를 캐시에서 찾아 이미 계산되어 있는 클리핑 영역을 사용함으로써 최대한 시간을 아낀다.
API(Application Programming Interface)는 현재 프로그램 외부의 프로시저를 말한다.
이 프로시저를 VB6에서 호출하기 위해서는 다음과 같은 규칙이 필요하다.

우선 이런 현재 프로그램에서 어떤 외부 프로시저를 사용할지를 지정해 주어야 한다. 이것을 선언이라며, 각 모듈의 선두에 선언한다.
선언 형식은 다음과 같다.
Pricate Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long
호출은 일반 프로시저를 호출하는 식으로 하면 된다.

선언에서 선두의 Private의 선언한 프로시저를 적용하는 범위를 지정한다. Private이면 선언한 프로시저는 API가 선언된 모듈에서만 호출 가능하고, Public로 선언하면 API가 선언한 모듈을 포함하는 프로그램 내에서 어디서나 호출 가능하다.
Declare는 API 선언 이라는 것을 알릴 뿐이다.
Function는 API가 반환값을 갖는 프로시저인지(Function 지정), 반환값을 갖지 않는 프로시저인지(Sub 지정)를 나타낸다. 반환값이 없거나, 있다고 해도 사용하지 않는다면 Sub로 지정하면 된다.
FindExecutable는 API를 VB6에서 어떤 이름으로 호출할것인가를 나타내고, 또는 Alias를 지정하지 않은 경우 API의 외부 프로시저명이 어떤것으로 돼어 있는지를 나타낸다. DEPENDS.EXE를 사용하면 지정된 파일에 어떤 프로시저가 포함되어 있는지를 알수 있다. 여기서는 선언된 API를 VB6에서 호출할때 FindExecutabled라는 이름으로 호출하여 사용한다.
Lib "shell32.dll"는 선언한 API 즉 외부 프로시저가가 어떤 파일에 포함되었는지를 나타낸다.
Alias "FindExecutableA"는 vb6에서 호출에 사용할 이름과, 지정된 파일에 포함된 외부 프로시저명이 다를경우, 지정된 파일에 외부 프로저명을 지정한다.
다음은 vb6에서 프로시저 사용시 인수와 반환값 자료형 적는 부분은 같다.

한가지 주의할것은 vb6에서 인수로 반환값중 String을 사용하게 되는 경우 vb6에서 호출시에는 String의 값을 유니코드로 간주하고 ANSI코드로 변환하고 API를 호출하고, 반환시에는 거꾸로 String값을 ANSI코드로 간주하고 유니코드로 자동 변환한다. 이러한 자동 변환을 쓰지 않기 위해선 Byte 배열을 사용한다.












시리얼 포트는 직렬 통신을 하기 위한 포트를 말한다. 포트 번호명은 COM번호 형식으로 되어 있다.
레지스트리  HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
에는 시스템에서 사용할 수 있는 시리얼 포트 목록이 저장되어 있다.

목록을 보면 가상 시리얼 포트도 포함되어 있다.
실제 존재하는 시리얼 포트 목록만 얻고 싶다면 WMI의 Win32_SerialPort 클래스를 사용하면 실존하는 시리얼 포트만 얻을 수 있다.

RegEnumValue를 사용하여 레지스트리에 시리얼 포트 저장된 키의 값을 읽어 시스템에 설정된 시리얼 포트를 나열한다.

위 이미지는 소스의 결과이다.
RegEnumValue는 오픈된 키에 값명과 값들을 인덱스 번호 0부터 시작하여, 지정된 항목의 값명과 값을 읽어온다.

오픈된 레지스트리 키에서 지정된 번호에 해당하는 값명과 값을 읽는다. 0부터 순차적으로 호출하여 ERROR_NO_MORE_ITEMS이 발생될까지 하면 해당 키의 전체 값명,값을 얻을 수 있다.

● 선언

Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long

● 인수

hKey ━ 오픈된 레지스트리키 핸들이나,정의된 레지스트리 특정키 상수
dwIndex ━ 읽을 키의 인덱스 번호 0이 첫번째
lpValueName ━ 키 이름을 저장할 버퍼
lpcbValueName ━ lpValueName 버퍼의 크기
lpReserved ━ 0
lpType ━ 키의 타입 저장될 변수
lpData ━ 키의 값을 받을 버퍼
lpcbData ━ lpData 버퍼의 크기

● 반환
성공 ━ ERROR_SUCCESS
실패 ━ 에러 코드

다음은 소스이다.
Option Explicit

Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const ERROR_NO_MORE_ITEMS = 259
Private Const BUFFERSIZE = 255

Private Sub Form_Load()
    Dim OpenRegHwnd As Long ' 오픈된 레지스트리 키 핸들
    Dim ValueName As String ' 값명 버퍼
    Dim ValueNameSize As Long ' 값명 버퍼 사이즈, 및 버퍼에 저장된 값명 길이
    Dim Value As String ' 값 버퍼
    Dim ValueSize As Long ' 값 버퍼 사이즈, 및 버퍼에 저장된 값 길이
    Dim IndexCount As Long ' 값 인덱스 번호 카운터
   
    RegOpenKey HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP\SERIALCOMM", OpenRegHwnd ' 레지스트리 키를 오픈한다
    ValueName = String(BUFFERSIZE, " ")
    Value = String(BUFFERSIZE, " ")
    IndexCount = 0
    ValueNameSize = BUFFERSIZE
    ValueSize = BUFFERSIZE
    While Not ERROR_NO_MORE_ITEMS = RegEnumValue(OpenRegHwnd, IndexCount, ValueName, ValueNameSize, 0&, ByVal 0&, ByVal Value, ValueSize)
        List1.AddItem Left(ValueName, ValueNameSize)
        List2.AddItem Left(Value, ValueSize)
        IndexCount = IndexCount + 1
        ValueNameSize = BUFFERSIZE
        ValueSize = BUFFERSIZE
    Wend
    RegCloseKey OpenRegHwnd ' 오픈된 레지스트리 키를 닫는다.
End Sub

+ Recent posts