Win32 API

2013.10.07 _ API 정리 자료 ( SendMessage , CallBack 함수 )

성엽이 2013. 10. 8. 14:12

_______WINAPI______________________________________________________________________________

 

 

SendMessage() , 두 개의 타이머

//iMessage : 어떤 종류의 메시지가 발생했는지..
//wParam, lParam : 메시지 종류에 따라 부수적인 정보값이 들어옴

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
   static RECT stRect = {100100400120}; //무효화 영역 테스트용
    SYSTEMTIME st;
  static TCHAR str[256]; //WM_CHAR 메시지 테스트용
  static TCHAR sTime[128]; 
  int len;

  
  switch(iMessage)
  {
    case WM_DESTROY://  창닫고 종료처리 메시지
      KillTimer(hWnd,1); // 타이머 파괴
      KillTimer(hWnd,2); // 타이머 파괴
      PostQuitMessage(0); 
      return 0;
      
       case WM_PAINT: //WM_PAINT 메시지는 출력한 문자열이 지워져도 항상 다시 복구됨
      hdc = BeginPaint(hWnd, &ps);//BeginPaint()는 DC 핸들을 반환
      TextOut(hdc,100,100,sTime,lstrlen(sTime));      
      
EndPaint(hWnd, &ps);
      return 0;
      
   
    case WM_CREATE: //WM_CREATE 메시지는 창이 생성할때 제일 처음 딱 한번 수행됨
      SetTimer(hWnd,1,1000, NULL);//타이머 셋팅(, 타이머번호ID, 시간ms,)
      SetTimer(hWnd,2,5000, NULL);
      SendMessage(hWnd,WM_TIMER,1,0);//SendMessage()는 강제로 메시지를 발생시킴
                // 인자로는 어떤창에, 어떤메시지를, 어떤 파라미터값으로 발생시킬지 적어주면됨

      return 0;

    case WM_TIMER: // setTimer()로 셋팅된 타이머가 메시지 호출    
            // win32 환경에서 만들수 있는 타이머의 개수에는 제한이 없음
            // 종료시 KillTimer()로 파괴하는것이 중요!

      switch(wParam) //WM_TIMER 메시지가 발생할때 wParam에는 타이머 ID 정보가 들어있음
      {
        case 1// 1번 ID의 타이머 메시지가 발생할때 마다 텍스트로 현재시간을 출력
          GetLocalTime(&st);//현재 시간을 얻어옴
          wsprintf(sTime, TEXT("지금 시간은 %d:%d:%d입니다"), st.wHour, st.wMinute, st.wSecond);
          InvalidateRect(hWnd, &stRect, TRUE); 
          break;
      
        
        case 2// 2번 ID의 타이머 메시지가 발생할때 마다 beep 출력
          MessageBeep(0);
          break;
      }
            
      return 0;  

    
  }
  return (DefWindowProc(hWnd, iMessage,wParam,lParam));
  //DefWindowProc : WndProc에서 처리하지 않은 나머지 메시지에 관한 처리를 함
}

 

 

 

 

 

콜백함수

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
  int iScore = 85;
  //TCHAR str[128]; //SetTextAlign 테스트용
  //RECT rt = {100, 100, 400, 300};
  SYSTEMTIME st;
  static TCHAR str[256]; //WM_CHAR 메시지 테스트용
  static TCHAR sTime[128]; 
  int len;
  int  i;

  
  switch(iMessage)
  {
    case WM_DESTROY://  창닫고 종료처리 메시지
      KillTimer(hWnd,1); // 타이머 파괴
      PostQuitMessage(0); 
      return 0;
      
    case WM_LBUTTONDOWN: //마우스 왼쪽 버튼을 눌렀을때 메시지
      
      hdc = GetDC(hWnd);
      Ellipse(hdc,LOWORD(lParam)-10,HIWORD(lParam)-10,LOWORD(lParam)+10,HIWORD(lParam)+10);

      ReleaseDC(hWnd,hdc);

      return 0;
    

      case WM_PAINT: //WM_PAINT 메시지는 출력한 문자열이 지워져도 항상 다시 복구됨
      hdc = BeginPaint(hWnd, &ps);//BeginPaint()는 DC 핸들을 반환
      TextOut(hdc,100,100,sTime,lstrlen(sTime));      
    
  EndPaint(hWnd, &ps);
      return 0;
      
  
    case WM_LBUTTONUP: // 왼쪽 마우스 버튼을 눌렀다가 뗄때
      //bNowDraw = FALSE;
      return 0;

    case WM_LBUTTONDBLCLK: // 마우스 왼쪽 버튼을 더블 클릭할때 
      //WndClass.style = CS_HREDRAW | CS_VREDRAW |CS_DBLCLKS; // 더블클릭 메시지를 사용하려면
      //창 셋팅 할때 의사 코드를 넣어야함
          
      return 0;

    case WM_CREATE: //WM_CREATE 메시지는 창이 생성할때 제일 처음 딱 한번 수행됨
      SetTimer(hWnd,1,50, TimerProc);//타이머 셋팅(, 타이머번호ID, 시간ms, TimerProc)
      //백그라운드 작업 : 프로그램이 실행되는 동안 지속적으로 수행해야 할 작업이 있을때
      //타이머를 이용하여 아주 빠른 주기머를 셋팅하고 백그라운드 작업을 하면됨
      return 0;

       
  }
  return (DefWindowProc(hWnd, iMessage,wParam,lParam));
  //DefWindowProc : WndProc에서 처리하지 않은 나머지 메시지에 관한 처리를 함
}



/*
SetTimer()의 네번째 인수는 TIMERPROC lpTimerFunc이라고 되어 있는데 이 인수는 타이머 프로시저 함수의 포인터를 가리킨다.이 인수가 NULL로 되어 있을 경우 첫번째 인수로 지정된 hWnd로 WM_TIMER 메시지가 전달되지만 이 인수에 타이머 함수가 지정되었을 경우는 매 시간마다 이 함수가 대신 호출된다.
*/

void CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
  HDC hdc;
  int i;
  hdc = GetDC(hWnd);

  for(i = 0; i < 1000; i++)
  {
    SetPixel(hdc,rand()%500, rand()%400, RGB(rand()%256, rand()%256,rand()%256));
  }


  ReleaseDC(hWnd,hdc);
}

 

 

 

 

 

 

 작업영역

 //iMessage : 어떤 종류의 메시지가 발생했는지..
//wParam, lParam : 메시지 종류에 따라 부수적인 정보값이 들어옴

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
  static RECT rt;
  
  
  switch(iMessage)
  {
    case WM_DESTROY://  창닫고 종료처리 메시지
      PostQuitMessage(0); 
      return 0;
  

    case WM_CREATE:
      GetClientRect(hWnd,&rt); //GetClientRect()는 작업 영역의 좌표를 구할수 있음
      return 0;
        
    case WM_LBUTTONDOWN:
      GetClientRect(hWnd,&rt); //GetClientRect()는 작업 영역의 좌표를 구할수 있음
      InvalidateRect(hWnd,NULL,TRUE);
      return 0;

    case WM_PAINT: 
      hdc = BeginPaint(hWnd, &ps);//BeginPaint()는 DC 핸들을 반환
      SetTextAlign(hdc, TA_CENTER);
      TextOut(hdc,rt.right/2,rt.bottom/2,TEXT("Center String"),13);      
      EndPaint(hWnd, &ps);
      return 0;
              
  }
  return (DefWindowProc(hWnd, iMessage,wParam,lParam));
  //DefWindowProc : WndProc에서 처리하지 않은 나머지 메시지에 관한 처리를 함
}




WM_SIZE

 윈도우의 크기가 변경될때 발생하는 메시지

 

 lParam의 하위 워드에는 변경된 후의 윈도우 폭이, 상위 워드에서는 높이가 전달되며 wParam에는  이 메시지가 발생한

이유를 나타내는 플래그가 전달됨.

 

WM_MOVE

 윈도우의 위치가 변경될때 발생하는 메시지

 

 lParam의 하위 워드에는 새 X좌표, 상위 워드에서는 윈도우의 새 Y좌표가 전달됨

 


- Source ------------


CallBack.c


Client.c


OnceTimer.c


20131002_DrawOut.c


GraphOut.c


RandGrp.c


TwoTimer.c

WinMain.c


resource.h


Resource_131006.c

---------------------