'programing'에 해당되는 글 29건

  1. 2010.07.19 WinApi 타이머 [백그라운드 작업]
  2. 2010.07.18 WinApi 두개의 타이머
posted by nsakura 2010. 7. 19. 13:45

 쌩뚱 맞게 바로 시작하겠다.

 게임을 한번 생각해보자. 게임의 배경이 바뀐다던가 음악이 바뀐다. 하는건 게임이라면 어느 게임이든 다 있다.

심지어 8비트 게임에서도 조차에서도 배경은 바뀌고 음악은 바뀐다.

예를 게임에 든것이고 실재로 많은 프로그램에서도 백그라운드 작업은 한다.

오늘은 백그라운드 작업에 대해 알아보자.

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE g_Inst;

LPCTSTR wndName=TEXT("BACKGROUND");

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevINSTANCE,LPSTR lpCmdLine,int nShowCmd){
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_Inst=hInstance;

 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=wndName;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(wndName,wndName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);
 
 ShowWindow(hWnd,nShowCmd);
 
 while(GetMessage(&Message,NULL,0,0)){
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }

 return (int)Message.wParam;

}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage, WPARAM wParam,LPARAM lParam){
 HDC hdc;
 int cnt;

 switch(iMessage){
 case WM_CREATE:
  SetTimer(hWnd,1,50,NULL);
  return 0;
 case WM_TIMER:
  hdc=GetDC(hWnd);
  for(cnt=0; cnt<1000; cnt++){
   SetPixel(hdc,rand()%500,rand()%500,RGB(rand()%256,rand()%256,rand()%256));
  }
  ReleaseDC(hWnd,hdc);
  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_DESTROY:
  KillTimer(hWnd,1);
  PostQuitMessage(0);
  return 0;
 }
 return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}


간단한 프로그램이다 .

settimer에 설정된 시간이 되면 점을 반목문의 조건만큼 만든다.

그리고 마우스 왼쪽 버튼을 누르면 그 지점에 원을 그린다.

그런데 왜 반복문에 조건식이있는가 백그라운드 작업이면 무한루프를 돌려도 되지 않는가?

그건 아니다. 쓰래드를 돌린것이 아니기 때문에 어느정도 갭을 줘야한다.

무한루프를 돌려버리면 반복문에서 빠져나올수가 없는 것 이다.

궁금하면

무한루프 돌려보길 바란다..

원을 찍긴 커녕 프로그램이 바보가 될것이다.

'Computer > Win API' 카테고리의 다른 글

WinApi 타이머 확장  (1) 2010.07.19
WinApi 타이머 콜백함수  (0) 2010.07.19
WinApi 두개의 타이머  (0) 2010.07.18
WinApi 타이머 확장 문제.  (0) 2010.07.18
WinApi 타이머2 [SendMessage]  (0) 2010.07.18
posted by nsakura 2010. 7. 18. 20:31

잠깐 언급을 했던것 같은데. 타이머를 여러개 설치가 가능하다.고 언급을 했었다.

타이머의 ID를 각기 다르게 주면어서 생성하면 되는데 그렇다 하더라도

WM_TIMER는 하나이다.

타이머의 구분은  wParam으로 전달되는 타이머 아이디로 구분한다.

그럼 소스를 보도록 하자.

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE g_Inst;

LPCTSTR wndname=TEXT("GFP TWO TIMER");

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_Inst=hInstance;

 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=wndname;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(wndname,wndname,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);

 ShowWindow(hWnd,nShowCmd);

 while(GetMessage(&Message,NULL,0,0)){
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 
 return (int)Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){
 HDC hdc;
 PAINTSTRUCT ps;
 SYSTEMTIME st;
 static TCHAR sTime[128];
 static RECT rt={100,100,500,120};

 switch(iMessage){
 case WM_DESTROY:
  KillTimer(hWnd,1);
  KillTimer(hWnd,2);
  PostQuitMessage(0);
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  TextOut(hdc,100,100,sTime,lstrlen(sTime));
  EndPaint(hWnd,&ps);
  return 0;
 case WM_TIMER:
  switch(wParam){
  case 1:
   GetLocalTime(&st);
   wsprintf(sTime,TEXT("%d : %d : %d : %d"),st.wHour,st.wMinute,st.wSecond,st.wMilliseconds);
   InvalidateRect(hWnd,&rt,true);
   break;
  case 2:
   MessageBox(hWnd,sTime,sTime,MB_OK);
   break;
  }
  return 0;
 case WM_CREATE:
  SetTimer(hWnd,1,1000,NULL);
  SetTimer(hWnd,2,5000,NULL);

  SendMessage(hWnd,WM_TIMER,1,0);
  return 0;
 }
 return (DefWindowProc(hWnd,iMessage,wParam,lParam));

}

프로그램 분석은 굳이 필요 없을듯 하다. 단순히 타이머 하나는 시간을 출력 또하나는 5초마다 메세지 박스가 나오게 하는 그런 예제이다

단순히 타이머를 여러개를 사용 할 수 있다.

는걸 보여주기 위함이다.


'Computer > Win API' 카테고리의 다른 글

WinApi 타이머 콜백함수  (0) 2010.07.19
WinApi 타이머 [백그라운드 작업]  (0) 2010.07.19
WinApi 타이머 확장 문제.  (0) 2010.07.18
WinApi 타이머2 [SendMessage]  (0) 2010.07.18
WinApi 타이머  (0) 2010.07.18