2011년8월29일_winAPI_WM_KEYDOWN메시지와 가상키코드, TranslateMessage(), 마우스메시지, 마우스포인터좌표, 형변환매크로, 마우스로 그림그리기예제 Mouse




아ㅣ런이ㅏ런ㅇ린어린어ㅏㅣ러ㅏㅣㄴ엏;ㅗ뮤ㅘ궆;ㅑㅕㅑ;ㅍ므;ㅕㄹㄷ

ㄹㄴㄴㅇ러ㅏㅁ촤ㅣㅇㅊ런알추나섶



참조(Reference)



DSCN4039 DSCN4040 DSCN4041
DSCN4042 DSCN4043


   1: // winAPI정복 page.58 예제: TextOut
   2: // 2011년 8월 23일 작성 
   3:  
   4: /* 윈도우즈 프로그래밍 순서 WinMain()
   5: 
   6:     WndClass정의
   7: 
   8:     클래스를 등록
   9: 
  10:     메모리상에 윈도우 생성
  11: 
  12:     윈도우를 화면에 출력
  13: 
  14:     메시지 루프 (반복)    여기서 텍스트 출력할 것.
  15: */
  16:  
  17: #include <windows.h>        // 모든 API함수들의 원형과 사용하는 상수들이 정의되어 있음.
  18:  
  19: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);    //메시지처리함수
  20: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text);
  21:  
  22: HINSTANCE g_hlnst;    //핸들 인스턴스
  23: LPCTSTR lpszClass = TEXT("Key");        //윈도우 제목으로 사용되는 const char * (문자열)
  24:  
  25: /***************************************************************************************************************************
  26: WinMain은 엔트리 포인트(시작함수)
  27: APIENTRY는 윈도우즈 표준호출규약 _stdcall(없어도 무방함)
  28: 
  29: WinMain의 인자들...
  30: ① hInstance: 프로그램의 인스턴스 핸들
  31: ② hPrevInstance: 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들로 16비트와 호환성위한 것이니 무시하자. Win32는 NULL이다.
  32: ③ lpszCmdParam: 명령행으로 입력된 프로그램의 인수 (콘솔app에서 argv), 보통 실행직후에 열 파일의 경로가 전달됨.
  33: ④ nCmdShow: 프로그램이 실행될 형태이며 최소화, 보통 모양 등이 전달된다.
  34: ***************************************************************************************************************************/
  35: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
  36: {
  37:     HWND hWnd;
  38:     MSG Message;
  39:     WNDCLASS WndClass;
  40:     g_hlnst = hInstance;
  41:  
  42:     WndClass.cbClsExtra = 0;
  43:     WndClass.cbWndExtra = 0;
  44:     WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  45:     WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  46:     WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  47:     WndClass.hInstance = hInstance;
  48:     WndClass.lpfnWndProc = WndProc;
  49:     WndClass.lpszClassName = lpszClass;
  50:     WndClass.lpszMenuName = NULL;
  51:     WndClass.style = CS_HREDRAW | CS_VREDRAW;
  52:     RegisterClass(&WndClass);
  53:  
  54:     
  55:     hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
  56:         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  57:         NULL, (HMENU)NULL, hInstance, NULL);
  58:     
  59:     ShowWindow(hWnd, nCmdShow);
  60:  
  61:     while(GetMessage(&Message, NULL, 0, 0)) {
  62:         TranslateMessage(&Message);
  63:         DispatchMessage(&Message);
  64:     }
  65:  
  66:     return (int)Message.wParam;
  67: }
  68:  
  69: LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
  70: {
  71:     HDC hdc;
  72:     PAINTSTRUCT ps;
  73:     static int x;
  74:     static int y;
  75:     static BOOL bNowDraw = FALSE;
  76:     
  77:     switch(iMessage) {
  78:     case WM_LBUTTONDOWN:
  79:         x = LOWORD(lParam);
  80:         y = HIWORD(lParam);
  81:         bNowDraw = TRUE;
  82:         return 0;
  83:  
  84:     case WM_MOUSEMOVE:
  85:         if(TRUE == bNowDraw)
  86:         {
  87:             hdc = GetDC(hWnd);
  88:             MoveToEx(hdc, x, y, NULL);
  89:             x = LOWORD(lParam);
  90:             y = HIWORD(lParam);
  91:             LineTo(hdc, x, y);
  92:             ReleaseDC(hWnd, hdc);
  93:         }
  94:         return 0;
  95:  
  96:     case WM_LBUTTONUP:
  97:         bNowDraw = FALSE;
  98:         return 0;
  99:  
 100:     case WM_DESTROY:
 101:         PostQuitMessage(0);
 102:         return 0;
 103:     }
 104:     
 105:     return(DefWindowProc(hWnd, iMessage, wParam, lParam));
 106: }
 107:  
 108: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text)
 109: {
 110:     TextOut(hdc, x, y, Text, strlen(Text));
 111: }




image