- 음악과 나 -/『 짬 통 』

4월 14일. - 뿔랙데이

noon2dy 2006. 4. 14. 16:51

//-----------------------------------------------------
// 4월 14일.. 4: 39


///////////////////

//   Type define..되어있는것들.

typedef unsigned int        UINT;
typedef UINT WPARAM;

typedef long LONG
typedef LONG LPARAM;
typedef LONG LRESULT;

typedef unsigned long       DWORD;
typedef int                 BOOL;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef float               FLOAT;
typedef FLOAT               *PFLOAT;
typedef BOOL near           *PBOOL;
typedef BOOL far            *LPBOOL;
typedef BYTE near           *PBYTE;
typedef BYTE far            *LPBYTE;
typedef int near            *PINT;
typedef int far             *LPINT;
typedef WORD near           *PWORD;
typedef WORD far            *LPWORD;
typedef long far            *LPLONG;
typedef DWORD near          *PDWORD;
typedef DWORD far           *LPDWORD;
typedef void far            *LPVOID;
typedef CONST void far      *LPCVOID;

 

 

DC란?
화면에 출력하기위해 필요한 "모든" 모든모든~ 정보를 가지는 데이터 구조체..

 

RECT 구조체 : 윈도우 안의 사각영역 정의
typedef struct tagRECT
{
    LONG    left;
    LONG    top;
    LONG    right;
    LONG    bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

 

 

widows는 가려졌던 윈도우의 화면을 보관 및 복구해주는 책임을 지지않으며
전적으로 프로그램 자신이 책임져야한다.

 

DC를 얻는 방뼙
1.
HDC GetDC( HWND hWnd );
int ReleaseDC( HWND hWnd, HDC hDC );

 

ex>
HDC hdc;
hdc = GetDC( hWnd );
각종 출력문에서 hdc를 사용
ReleaseDC( hWnd, hdc );

 

2.
HDC BeginPaint( HWND hWnd, LPPAINTSTRUCT lpPaint );
BOOL EndPaint( HWND hWnd, CONST PAINTSTRUCT *lpPaint );

 

ex> WM_PAINT 메시지 처리루틴에서 사용
HDC hdc;
PAINTSTRUCT ps;
case WM_PAINT:
 hdc = BeginPaint( hWnd, &ps );
 각종 출력문에서 hdc를 사용;
 EndPaint( hWnd, &ps );

 


출력함수..
BOOL TextOut( HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString );
ex> TextOut( hdc, 100, 100, "Beautiful Girl", 14 );

int DrawText( HDC hDC, LPCTSTR lpString, int ncount, LPRECT lpRect, UINT uFormat );


문자정렬함수

UINT SetTextAlign( HDC hdc, UINT fMode );

 

선을긋자선을.
MoveToEx( hdc, A, B, NULL );
하면 CP(Current Position: 다음 그래픽이 출력될 위치 )를 ( A, B ) 좌표로 이동시킴
LineTo( hdc, C, D );
하면 ( C, D )좌표로 선을 긋는다

 

메시지박스
int MessageBox( HWND hWnd, LPCTSTR lptext, LPCTSTR lpCaption, UINT uType );
ex>
MessageBox( hWnd, "마우스 왼쪽버튼을 눌렀습니다", "메시지박스", MB_OK );

 

메시지 Beep~!

BOOL MessageBeep( UINT uType );

 

WM_CHAR메시지..
: 입력된 문자의 아스키코드를 wParam으로 전달함.
'S'입력 -> S의 아스키코드인 0x53 이 wParam으로 전달됨...
WM_CHAR메시지는 사용자에의해 발생되는 메시지가 아님..!
키보드로 부터 전달되는 메시지는 WM_KEYDOWN, WM_KEYUP밖에.엄따
GetMessage가 메시지큐에서 메시지를 꺼내온 후 TranslateMessage함수로 메시지를 넘겨주면
TranslateMessage는 들어온 메시지가 WM_KEYDOWN 인지, 문자키인지 검사해보고
맞을경우 WM_CHAR메시지를 만들어 메시지큐에 덧붙여줌.

TranslateMessage함수는 WM_CHAR을 만들어내기위해 존재함
WM_CHAR메시지를 받을필요가 없는 프로그램이라면
TranslateMessage를 삭제해도된다!!

 

lParam의 구조
31'th bit : 키가 놓아지면 1, 눌러지면 0
30'th bit : 메시지가 보내지기 전에 키가 눌러져 있었으면 1
29'th bit : Alt키가 눌러졌으면 1
28 ~ 25'th bit : 미사용.. -_-;
24'th bit : 오른쪽Alt, 오른쪽Ctrl등 101키에만 있는 확장키가 눌러졌을경우 1이됨.
23 ~ 16'th bit : 스캔코드. (-_-?)
15 ~ 0'th bit : 반복카운트.. (-_-?);;

 

이 정보중 필요한 정보가 있으면 lParam을 참조하고.
필요없으면 wParam만 사용하도록한다..

 

 

무효영역?
윈도우영역중 일부분이라도 다시 그려져야할필요가 있는 영역..?
이. 무효영역이 생기면 OS는 이 윈도우에게 WM_PAINT 메시지를 보내줘서
다시 그 영역을 그리도록 한다.
데이터의 변화가 있을때 OS측에서는 화면으로 출력해야되는지 내부적으로만 계산해야할것인지
모르기때문에 작업영역을 무효화시키지 않음.
그래서 윈도우의 모습을 변경시켰을때는 변경된 부분이 다시 그려질 수 있도록
강제로 무효화 시켜줘야된다. 이때 강제로 무효화시키기위해 사용되는함수가
InvalidateRect()함수다.

// BOOL InvalidateRect( HWND hWnd, CONST RECT *lpRect, BOOL bErase );
// hWnd -> 무효화의대상이되는윈도우( 다시 그려줘야할윈도우) 의 핸들.
// lpRect -> 무효화의 대상이되는 사각영역( NULL일경우 윈도우 전체 영역 )

SetRect() 함수로 대상영역을 지정해줌

 

BOOL SetRect(
  LPRECT lprc, // rectangle
  int xLeft,   // left side
  int yTop,    // top side
  int xRight,  // right side
  int yBottom  // bottom side
);

 

RECT구조체
typedef struct _RECT {
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
} RECT, *PRECT;