'winapi'에 해당되는 글 33건

  1. 2010.07.22 WinApi 그래픽 [투명 오브젝트]
  2. 2010.07.21 WinApi 그래픽 [변수를 두개 두는 이유]
posted by nsakura 2010. 7. 22. 00:21

오늘 마지막 포스트가 될것 같은데 마지막 포스팅을 장식할 내용은

NULL_BRUSH와 NULL_PEN 이다.

투명이라고 되어있지만 아무것도 그리지 않는다 라고 읽는것이 맞을 것이다.

그럼 바로. 코드로 확인을 해보자!

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){
 HDC hdc;
 PAINTSTRUCT ps;
 int ncnt;
 HBRUSH hBrush,saveBrush;
 HPEN hPen,savePen;

 switch(iMessage){
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  
  for(ncnt=0; ncnt<250; ncnt+=5){    //화면에 각격 5마다 선을 그린다.
   MoveToEx(hdc,0,ncnt,NULL);
   LineTo(hdc,600,ncnt);
  }
  
  hBrush=CreateSolidBrush(RGB(0,255,0)); //그린 브러쉬
  saveBrush=(HBRUSH)SelectObject(hdc,hBrush);
  
  hPen=CreatePen(PS_SOLID,1,RGB(255,0,0)); //레드 팬
  savePen=(HPEN)SelectObject(hdc,hPen);

  Ellipse(hdc,20,20,150,150);

  //NULL_BRUSH 설정.
  SelectObject(hdc,GetStockObject(NULL_BRUSH));
  Ellipse(hdc,220,20,350,150);

  //NULL_PEN 설정
  SelectObject(hdc,hBrush);
  SelectObject(hdc,GetStockObject(NULL_PEN));
  Ellipse(hdc,420,20,550,150);

  DeleteObject(SelectObject(hdc,savePen));
  DeleteObject(SelectObject(hdc,saveBrush));


  EndPaint(hWnd,&ps);
  return 0;
 }

 return (DefWindowProc(hWnd,iMessage,wParam,lParam));

}



첫번째 원은 붉은색 테두리의 초록색으로 채운다.

두번째 원은 테두리는 붉은팬이지만 내부는 색이 없는 브러쉬 즉 채색이 없다(NULL_BURSH)

세번째는 테두리가 NULL_PEN임으로 테두리가 없는 것이다.

없기 때문에 투명처럼 보이는것이다. 간단한 설명으로.

알이 없는 안경이나 테두리가 없는 안경

쯤으로 생각하면 된다.

투명과 없는거랑은 개념이 약간 틀리다고 난 생각한다.

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

WinApi RopMode2 [확장]  (0) 2010.07.22
WinApi 그래픽 [DrawMode]  (1) 2010.07.22
WinApi 그래픽 [변수를 두개 두는 이유]  (0) 2010.07.21
WinApi 그래픽 [색상][펜][브러쉬]  (0) 2010.07.21
WinApi 그래픽 [GetStockObject]  (0) 2010.07.21
posted by nsakura 2010. 7. 21. 18:29

언급은 잠깐했었지만 솔직히

실습하면서 굉장히 귀찮지 않았나?

메모리 할당받고. 그냥 반납을 하면 되는데. 왜 굳

귀찮게. 어째서 다른 팬으로 바꾸고 기존의 팬을 지우는가?

너무 귀찮지 않았나?

이유는 간단하다.

예를 하나 들겠다. A라는 게임이 실행중이다.

그런데 실행중에 A라는 게임을 지워보자 지워지는가?

이런 메세지가 뜨지 않는가?

"실행중인 프로그램이니까 삭제 못해"

라고 말이다.

마찬가지이다 펜이나 브러쉬를 선택한순간 "이건 사용중임"

되는겁니다. 사용중인데 빼앗으면 어떻게 될까요? 현실세계를 생각해보죠.

싸우지 않겠나요? 즉 pc도 마찬가지다. 그러므로 나름 안전 장치가 있는것이다.

그것이 선택중일때는 삭제를 못한다. 라는 것이다.

즉 사용중일때는 삭제를 못한다 와 같은거다.

책에는 코드를 몇개나 예를들어서 설명되어있지만 간단하게 추려 보았다.

한번 테스트를 해볼까 한다.

[PS : 이 코드는 상당히 안좋은 코드다 다른작업하고있었다면 작업을 끝내거나

저장하거나 만일의 사태를 준비하고 실습에 임하기 바란다. 만일 이에 대한 문제는

나에게는 책임이 없다! 정말 없다! 책임 안질거다.

솔직히 문제라고 해봤자 다운밖에 더 되겠냐만은..]


#include <windows.h>

HINSTANCE nsakuragfp;
LPCTSTR wndname=TEXT("GDI ERROR");
HWND hWndMain;

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
void TestResource(BOOL,BOOL,int);


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 nsakuragfp=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);

 hWndMain=hWnd;

 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;
 
 TCHAR *information=TEXT("1:정상적인 경우 2:선택없이 삭제만 3:삭제 하지 않음");

 switch(iMessage){
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  TextOut(hdc,10,10,information,lstrlen(information));
  EndPaint(hWnd,&ps);
  return 0;
 case WM_KEYDOWN:
  switch(wParam){
  case '1':
   TestResource(TRUE,TRUE,10000);
   break;
  case '2':
   TestResource(FALSE,TRUE,10000);
   break;
  case '3':
   TestResource(FALSE,FALSE,10000);
   break;
  }
  return 0;
 }

 return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}

void TestResource(BOOL select, BOOL deleteOB, int ncnt){
 HDC hdc;
 HPEN hPen,savePen;
 int i;
 TCHAR str[256];

 hdc=GetDC(hWndMain);
 for(i=0; i<ncnt; i++){
  hPen=CreatePen(PS_SOLID,1,RGB(0,0,0));
  savePen=(HPEN)SelectObject(hdc,hPen);
  MoveToEx(hdc,rand()%300,rand()%200,NULL);
  LineTo(hdc,rand()%300,rand()%200+40);
  if(select){
   SelectObject(hdc,savePen);
  }
  if(deleteOB){
   DeleteObject(hPen);
  }

  wsprintf(str,TEXT("%d"),i);
  SetWindowText(hWndMain,str);
 }
 ReleaseDC(hWndMain,hdc);


}
 
참고로 메모리 누수가 생기거나 심하신분은 리붓을 하길 바란다.

함수의 인자에 따라 삭제만 할수도

팬만 바꿀수도

아니면 둘다 안할수도 있습니다.

참고로 NT계열 어느정도 이런 개발자의 실수를 백업을 해준다고 한다.

그래서 그런지  본인은 그렇게 문제가 생기지 않았다.

그러나! 절대 이런 실수는 하지말것.

메모리를 쓰면 돌려줘야한다.

독식하면 주빵을 맞는것이 세상의 진리이다.





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

WinApi 그래픽 [DrawMode]  (1) 2010.07.22
WinApi 그래픽 [투명 오브젝트]  (0) 2010.07.22
WinApi 그래픽 [색상][펜][브러쉬]  (0) 2010.07.21
WinApi 그래픽 [GetStockObject]  (0) 2010.07.21
WinApi 리소스 [String Table]  (0) 2010.07.21