본문 바로가기
코스웨어/11년 내장형하드웨어

[내장형]김정우-10월12일 일일보고서

by 알 수 없는 사용자 2011. 10. 12.
728x90
반응형

먼저 키보드에서 입력을 받으면 화면이 깜빡이는 현상이 나타나고 있다.
이  깜빡이는 현상을  해결하기 위해 소스를 수정.
윈도우에서 화면을 다시 그리기 때문에 화면이 깜빡 거리는 것을 우리는 알고 있다(몰랐던  분? 있음??)
이 깜빡이는 것을 수정하기 위해서는 화면을 다시 그려주는 함수를 찾아야 한다.
이  함수가  
InvalidateRect(hWnd,NULL,TRUE); 이다
WM_KEYDOWN 에서 키를 입력받으면 마지막에 위의 함수가 호출이되어 화면이 다시 그려지게 되는것이다.

InvalidateRect 함수에서 어떤 인자가 화면을 다시 그리게 하는  것일까?

두번째 인수가 바로 화면을 다시 그린다. 두번째 인수를 보면  CONST RECT * 로 되어있다.  여기서 RECT는 사각형을 뜻하는데
무효화할 사각영역을 지정하는 것이다. 여기서 NULL값은 윈도우 전 영역이 다시 그려지는 것이다.
이동해서 변경되는 부분만 다시 그리면 화면 전체가 깜빡이지는 않을 것이다 그래서 이동하는 영역만 다시 그리도록 코드를 수정해 보면...
먼저 두번째 인수가 어떤형태인지 부터 살펴보면...
RECT는 구조체로 되어있는데 여기에는 좌표를 표시하는 LONG형 변수 4개가 있다.


이때  4개의 변수는 사각형의 크기를 나타낼 수  있다.


윈도우는 사각형을 표시할때 1)표시 방법을 이용한다.
이때 left = x ,  top = y ,   right = x+x1 , bottom = y+y1을 뜻한다.

이제 두번째 인수에 들어갈 좌표를 찾아보면...
먼저
 static RECT stArea;를 선언하고 여기에 현재 영역의 좌표를 기억시킨다.

  stArea.left= uiXman * 30;   // 현재 좌표에서 30을 곱하는 것은 우리가 그린 졸라맨이 30x30이기 때문에 한칸이동을 하기위해서
  stArea.top= uiYman * 30;
  stArea.right= (stArea.left)+30;
  stArea.bottom= (stArea.top)+30;

그리고 이제  다시 그릴때  는 InvalidateRect(hWnd,&stArea,TRUE);  라고 하면  이동시에 깜빡임이 없어졌다.

이 소스를 각 상황에 맞게 수정하여 상하좌우  이동을 할때와 박스를 옮길때  변화하는 구간만큼의 크기만 다시 그리면 화면의 깜빡임은 배경에서는 나타나지 않을것이다.

여기에 스테이지 이동을 위한 코드를 넣고

page up/down키로 스테이지를 이동시키게 하고 home키는 첫 스테이지로 이동을 시켜주게 코드를 작성하면

수정한 소스는 다음과 같다.



bitmapviewer
최종적으로 완성해야 하는 모습은


위와 같이 만들어 볼려면 먼저 bitmap의 구조를 이해(?) 해야  한다.
그래서  bitmap의 파일구조와  각 header의 구조를 살펴보면 아래와 같다.






이제 먼저 bitmap이 오류없이 호출이 되는지 부터 확인을  해보자.
WM_CREATE 안에 이 소스를 넣으면...


아래와 같이 뜬다.

이것은  아직 bmp파일을 화면에 뿌리지는 않았다. 하지만  BM이 보이듯이 bitmap파일이라는 것을 알수 있었다.
이제 파일을 읽어오는것이 성공했으니 화면에 뿌려보면 되겠다. 화면에 뿌리는 것은 다음주 목요일까지 완성하면 될 것이다.
728x90