9.19(수) 실습-2

from Study/API 2007/10/10 18:49 view 18673
1. 그리기 모드를 사용하여 선그리기.

more..


2. Region의 활용

more..



3. WM_PAINT(1) : 마우스 움직일때마다 사각형 그리고 계속 그려주기.

more..


4. WM_PAINT2

more..




Tag | ,

9.19(수) 실습-1

from Study/API 2007/10/10 18:28 view 18551
1. GDI Object 기본

more..



2. 지뢰찾기 기본 모양 만들어보기( Draw3dRect 함수가 핵심 )

more..


Tag | ,

9.18(화) 이론-1

from Study/API 2007/10/10 17:54 view 20831
1. Mouse, 키보드에 대한 이야기

- RIT는 항상 자기와 연결된 Thread의 ID를 보관하고 있는데 이를 Foreground Thread 라고 한다.(하나존재)
- 마우스 : WindowFromPoint , 키보드 : Foreground Thread로 전달한다.( PostThreadMessage(ID) )
- RIT는 쓰레드 ID만 보고 ID에 해당하는 메시지 Q에 전달하면 GetMessage 로 메시지를 꺼내 DispatchMessage 를 사용해서 해당 WndProc에 메시지를 보낸다. 현재 포커스에 입력되게 된다.

- Activate(활성창)은 최상위 윈도우가 관리하고, Focus는 Top-leve 윈도우단위로(스레드) 관리하게 된다.

- 키보드 => Scan Code:Hardware => 드라이버에서 가상키코드로 변환(대소문자x) => WM_KEYDOWN  => TranslateMessage 가상키코드를 분석하여 대소문자를 구분시켜준다.=> Focus에 입력

- 키보드 메시지 종류 ( wparam : 가상키코드, lparam : 스캔+a )
  1) WM_KEYDOWN
  2) WM_KEYUP
  3) WM_SYSKEYDOWN  (ALT
  4) WM_SYSKEYUP
  5) WM_SYSCHAR
- CTRL+ALT+DEL, ALT+TAB.. RIT가 시스템으로 넘겨주게 된다.

- TranslateMessage : 가져온 메시지가 키보드 메시지이고 wParam의 키가 문자키라면 WM_CHAR메세지를 Q에 넣는다.!!
- 문자키 : WM_CHAR,      기능키 : WM_KEYDOWN

- 키보드 상태조사 ( 상위 8비트 : 일반키 상태 , 하위 8비트 : 상태키 )
  1) GetKeyState( VK_SHIFT ) & 0xFF00 ) // 시프트와 왼쪽 마우스클릭조사
      : 마우스, 키보드 메시지 처리를 한다. 현재 키보드상태를 조사한다.
  2) GetAsyncKeyState( 가상키코드 )

- 캐럿은 개별 스레드자원이므로 Focus를 얻을 때 생성, 잃을 때 파괴 해줘야 한다.
   : 감추고 파괴해야 Caret 내부에 있는 문자가 깨질 우려가 없다.
- 커서는 시스템 자원이므로 관여 할 필요 없다.

2007/10/10 - [Study/API] - 9.18(화) 실습-1
Tag | ,

SetLayeredWindowAttributes

from Study/API 2007/10/10 17:08 view 17548

1. 투명윈도우 구현을 위한 함수~

   SetWindowLong(hDest, GWL_EXSTYLE, GetWindowLong(hDest, GWL_EXSTYLE) | WS_EX_LAYERED);
   SetLayeredWindowAttributes( hDest, 0, 255 * 0.5, LWA_ALPHA);

Tag |

9.18(화) 실습-2( SystemparameterInfo )

from Study/API 2007/10/10 17:06 view 19808
1. 윈도우 자석효과 내보기

more..

Tag | ,
#define _WIN32_WINNT 0x0501
 
컴파일러에게 NT시스템이란걸 알려줘야 하지 않을까~



Tag |

9.18(화) 실습-1

from Study/API 2007/10/10 16:47 view 21213
1. Caret 이동과 RegisterHotkey 등록, Animate Window 구현!!!

more..


2. DC의 생성을 클래스화 해보기

more..


3. 키상태 조사하기

more..


4. MouseMessage(WM_MOUSELEAVE를 위해선 TRACKMOUSEENVET를 설정해줘야 한다!!!)

more..



5. SendInput 으로 입력 스트림에 키보드 입력을 넣어보자.

more..


Tag | ,

9.17(월) 이론-4( 종료과정이해 )

from Study/API 2007/10/10 16:15 view 17062
1. 종료과정 이해하기


- 윈도우가 종료 하기 바로 전에 해야 할일은 주로 WM_CLOSE 메시지 에서 처리한다.!!
Tag | ,
1. 마우스 캡쳐

- 일반적으로 마우스 메시지는, 메시지가 발생할 당시 커서의 아래 있는 윈도우에게 전달된다. 하지만 SetCapture()함수를 사용하므로서 이런 행동을 변경 할 수 있다.
- 특정 윈도우가 SetCapture() 함수를 사용해서 마우스를 캡쳐할 경우, 모든 마우스 메시지는 마우스를 캡쳐한 윈도우에게로 전달된다.

2. 마우스 캡쳐하기
- 마우스 캡쳐는 아래의 3가지 경우에 해지된다.
  1) RealeaseCapture() 를 호출 한 경우
  2) 다른 윈도우가 마우스를 캡쳐한 경우
  3) 사용자가 다른 스레드가 만든 윈도우를 클릭 한 경우
- 마우스 캡쳐가 해지될 경우, 캡쳐를 잃은 윈도우에 WM_CAPTURECHANGED 메시지가 전달된다.
이 때 lParam에는 새롭게 마우스를 캡쳐 한 윈도우의 핸들이 들어 있다.

3. 마우스가 캡쳐 되어 있을 경우 WM_NCHITTEST, WM_SETCURSOR 메시지는 발생되지 않는다.
4. 예제 코드( 다른 윈도우 캡쳐하기 )

more..




1. 마우스 좌표
- 어디를  기준으로 보냐에 따라서 스크린 좌표계, 윈도우 좌표계, 클라이언트 좌표계로 나눌수 있다.

- ClinetToScreen | ScreenToClient ( 두개 외에 나머지 함수 만들기 )
void
WindowToScreen(HWND hwnd, POINT* Point)
{
      RECT Rect;
      GetWindowRect( hwnd, &Rect );
      Point->x = Point->x + Rect.left;
      Point->y = Point->y + Rect.top;
}
void ScreenToWindow(HWND hwnd, POINT* Point)
{
      RECT Rect;
      GetWindowRect( hwnd, &Rect );
      Point->x = Point->x - Rect.left;
      Point->y = Point->y - Rect.top;
}
void WindowToClient(HWND hwnd, POINT* Point)
{
      WindowToScreen( hwnd, Point );
      ScreenToClient( hwnd, Point );
}
void ClientToWindow(HWND hwnd, POINT* Point)
{
      ClientToScreen( hwnd, Point );
      ScreenToWindow( hwnd, Point );
}
Tag | ,

9.17(월) 이론-2(WM_NCHITTEST)

from Study/API 2007/10/10 15:47 view 18452
1. WM_NCHITTEST

- Cursor가 움직이거나 마우스 버튼을 누르거나 놓을 때, System은 커서 아래 있는 윈도우(마우스를 캡쳐한 경우 캡쳐한 윈도우)에게 WM_NCHITTEST 메시지를 보낸다.(sent)
- 이때 대부분 윈도우 프로시저는 이 메세지를 직접 처리 하지 않고 DefWindowProc으로 보내는데 DefWindowProc는 커서의 좌표를 조사해서 커서가 현재 윈도우의 어느 부분에 커서가 있는지 나타내는
Hit Test Code 를 리턴한다.
- WM_NCHITTEST의 결과로 얻어진 HitTestCode가 다음 메시지를 결정하는데 사용된다.

- 예제 코드( Control키를 누른 상태에서 클라이언트 영역에서 마우스의 왼쪽 버튼을 누르면 윈도우를 이동 )
    // WM_NCHITTEST 를 처리하는 방법
    case WM_NCHITTEST:
        {
            // 1. 먼저 DefWindowProc()으로 전달해서 hit test code를 얻는다.
            int code = DefWindowProc( hwnd, msg, wParam, lParam );

            // 2. code를 조작한다.
            if( code == HTCLIENT && GetKeyState( VK_CONTROL ) < 0 )
                code = HTCAPTION;

            // 3. code를 리턴한다. - 다음 메세지는 이 리턴값에 의해 결정된다.
            return code;
        }

Tag | ,