2011년8월30일_winAPI_마우스메시지복습, 더블클릭(CS_DBLCLKS플래그), 타이머, myTimer예제의 문제점, SendMessage()




● 복습

(생략)




● 4-2-나. 더블클릭

더블클릭 메시지를 받고자 하면 윈도우 클래스 스타일에,
”이 윈도우는 더블클릭메시지를 원한다”는 의사표시를 해야함.

   WndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;       //더블클릭플래그를 추가

CS_DBLCLKS플래그를 추가하면 이 윈도우는 더블클릭을 지원한다.

더블클릭 메시지를 디폴트로 지원하지 않고 꼭 CS_DBLCLKS플래그를 지정하도록 되어 있는 이유는...
더블클릭을 검출하는데 그만큼 실행시간의 감소가 요구되며 어떤 프로그램은 더블클릭보다,
WM_LBUTTONDOWN을 두 번 받기를 원할 수 있기 때문.
1번클릭을 같은 영역에서 두 번 받으면 2번 클릭이고,
                              세 번 받으면 3번 클릭이 된다.  

한 마디로 다양한 응용을 할 수 있도록 배려한 것이다.





참조(Reference)


DSCN4059 DSCN4060 DSCN4061 DSCN4062 DSCN4063





   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:     SYSTEMTIME st;
  74:     static TCHAR sTime[128];
  75:     static RECT rt = {100, 100, 300, 120};
  76:  
  77:     switch(iMessage) {
  78:     case WM_CREATE:
  79:         SetTimer(hWnd, 1, 1000, NULL);            //타이머 ID = 1, 1000ms후에 WM_TIMER 메시지발생.
  80:         SendMessage(hWnd, WM_TIMER, 1, 0);        //WM_TIMER이벤트 강제발생.
  81:         return 0;
  82:  
  83:     case WM_TIMER:
  84:         GetLocalTime(&st);
  85:         wsprintf(sTime, TEXT("지금 시간은 %d:%d:%d입니다."),
  86:             st.wHour, st.wMinute, st.wSecond);
  87:         InvalidateRect(hWnd, &rt, TRUE);
  88:         return 0;
  89:  
  90:     case WM_PAINT:
  91:         hdc = BeginPaint(hWnd, &ps);
  92:         MyTextOut(hdc, 100, 100, sTime);
  93:         EndPaint(hWnd, &ps);
  94:         return 0;
  95:  
  96:     case WM_DESTROY:
  97:         KillTimer(hWnd, 1);
  98:         PostQuitMessage(0);
  99:         return 0;
 100:     }
 101:     
 102:     return(DefWindowProc(hWnd, iMessage, wParam, lParam));
 103: }
 104:  
 105: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text)
 106: {
 107:     TextOut(hdc, x, y, Text, strlen(Text));
 108: }




image  악 집에 갈 시간