블로그는 귀차니즘

First Sensation
  • 공지
  • 지역로그
  • 태그
  • 방명록

GDI+ 사용 시 Smart Pointer 란??

Programming Tip 2008/04/12 22:59 귀차니스트

  윈도우즈 프로그래밍을 해보셨던 분이라면 GDI라는 것은 한 번쯤 들어보셨을 겁니다. 바로 Graphics Device Interface의 준말입니다. 단어 그대로 Graphic에 관련된 루틴들이 들어있는 부분이죠. 그런데 사실 이 GDI라는 것이 속도는 무척 빠른게 맞지만, 보기보다 사용하기엔 엄청 불편합니다. 왜냐구요??

  1. HDC hdc;
  2. PAINTSTRUCT ps;
  3. HPEN MyPen, OldPen;
  4.  
  5. LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
  6. {
  7.     switch(iMessage) {
  8.     case WM_PAINT:
  9.         hdc=BeginPaint(hWnd,&ps);
  10.        
  11.         MyPen = CreatePen(PS_SOLID, 5, RGB(0,0,255));
  12.         OldPen = (HPEN)SelectObject(hdc, MyPen);
  13.         Rectangle(hdc,50,50,300,200);
  14.         SelectObject(hdc, OldPen);
  15.         DeleteObject(MyPen);
  16.        
  17.         EndPaint(hWnd,&ps);
  18.         return 0;
  19.     case WM_DESTROY:
  20.         PostQuitMessage(0);
  21.         return 0;
  22.     }
  23.     return(DefWindowProc(hWnd,iMessage,wParam,lParam));
  24. }
  25.  

  보시다시피 단순한 펜 하나를 그리려고 해도 실질적으로 불편한 점이 엄청 많습니다. 객체를 빌려오고, 반환하고, 이런 코드 치고 싶을리는 없을겁니다.
  대신 GDI+ 이러한 GDI 개체들을 Class Wrapping 하여서 엄청 편하고, 이해하기도 쉽다는 장점이 있습니다. 다만 트레이드 오프라고 대신 단점이 없을 수는 없죠. 단점은 속도가 GDI에 비해서는 속도가 약간 느립니다. 하지만 요새 컴퓨터 속도에 따라서는 감수할 수 있을 정도의 속도감소이기 때문에 괜찮다고 생각이 듭니다.

GdiPlus.cpp (Language : cpp)
  1. void OnPaint(HDC hdc)
  2. {
  3.      Graphics G(hdc);
  4.      Pen P(Color(255,0,0),5);
  5.  
  6.      G.DrawRectangle(&P,110,10,90,90);
  7. }
  8.  
  9.  

  사각형을 그리는 비슷한 역할의 코드임에도 불구하고, 무척 간단한 코드로 변하게 됩니다. 사실 보기만 해도 편하지 않나요?? 그런데 GDI+에도 한가지 보시면 불편하다? 라고 느낄 수 있는 부분이 있습니다.

FromFile.cpp (Language : cpp)
  1. void OnPaint(HDC hdc)
  2. {
  3.      Graphics G(hdc);
  4.      Image *Img;
  5.      Img=Image::FromFile(_T("Test.bmp"));
  6.  
  7.      G.DrawImage(Img,0,0);
  8.      delete Img;
  9. }
  10.  

  대표적으로 Image 클래스의 경우 FromFile같은 경우 메모리 해제를 따로 해주어야 하는 점이 존재합니다. 그래서 delete 로 개체를 삭제해야 하는 점이 존재하죠. C++ 에서 아시다시피 delete 라는 게 필요하다면 코드 실행 도중의 예외로 인한 catch 라던가 그런 부분쪽에 delete 코드를 모두 넣어 주어야한다는 점이 존재하죠. 그렇게 되면 코드가 무척 지저분해 집니다.

Boost.cpp (Language : cpp)
  1. #include <boost/shared_ptr.hpp>
  2.  
  3. void OnPaint(HDC hdc)
  4. {
  5.      Graphics G(hdc);
  6.      boost::shared_ptr< Image > Img( Image::FromFile(L"Test.bmp"));
  7.  
  8.      G.DrawImage(&*Img,0,0);
  9. }

  만약 boost 에 존재하고, C++ 새 표준에 추가된 TR1의 smart pointer를 사용해보면 어떨까요? 리소스를 어차피 객체화 할거면 이름 그대로의 영리한 Pointer를 사용하여 삭제가 될 수 있으니 코드도 지저분해지지 않는 일석이조의 효과를 누릴 수 있겠죠.
  물론 거의 기본 클래스로 알고 시작하는 smart pointer다 보니 대부분 알고 계실것 같지만, 아닌 분도 있고 그냥 기록 해두는 의미도 있고 해서 올렸는데. 나쁘지는 않겠죠^^? 그럼 오늘도 즐거운 하루 되세요~

참조 사이트 : http://www.winapi.co.kr
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Programming Tip" 분류의 다른 글

OpenMP 라고 아십니까?? (0)2008/07/27
심심해서 구현해본 그래픽 요소 (0)2008/07/03
Child Window Mouse Message 문제. (0)2008/07/01
버퍼 오버플로우, 오버런이란?? (0)2008/04/27
Com Library in C++ Builder - C++ 빌더에서 Com 라이브러리, .Net라이브러... (0)2008/03/29
2008/04/12 22:59 2008/04/12 22:59
TAG boost::shared_ptr, C++, GDI
받은 트랙백이 없고, 댓글이 없습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/49

댓글을 달아 주세요

◀ 이전페이지 1 ... 59 60 61 62 63 64 65 66 67 ... 110 다음페이지 ▶

블로그 이미지
First Sensation 귀차니스트
rss
  • 관리자
  • 글쓰기

카테고리

  • 전체 (110)
    • Computer (3)
    • Language (14)
    • Reverse Engineering (1)
    • Algorithm (9)
    • TopCoder (3)
    • Library (2)
    • Programming (19)
    • Programming Tip (9)
    • PSP-Programming (10)
    • Program (5)
    • Small Talk (31)
    • Document (4)

최근에 올라온 글

  • Gradient 작성중에 있습.... (3)
  • 게임&인터랙티브 애플리....
  • 한게임 자동테트리스 Ve.... (24)
  • Intel 64 And IA32 Arch.... (2)
  • 한게임 자동테트리스 Ve.... (24)

최근에 달린 댓글

  • 다운어덯게 받아요. difl 2008
  • 멋있네요 ㅎㅎ. 준호씨 2008
  • ^^; 그러셨군요.. 사실 동영.... 귀차니스트 2008
  • ㅋㅋ 속도 튜닝의 무서움 ㅜ.... 귀차니스트 2008
  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 2008

달력

«   2009/01   »
일 월 화 수 목 금 토
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

링크

  • kkamagui 프로그래밍 세상.
  • 류광의 번역 이야기.
  • 서광열의 프로그래밍 언....
  • 준호씨의 블로그.
  • 최익필의 이름없는 블로그.
  • 위키는 귀차니즘.

최근에 받은 트랙백

  • 궁극의 예외처리. 이름없는 블로그 2008
  • Maximum sum. 티스토리 지점 2008

글 보관함

  • 2008/12 (1)
  • 2008/11 (4)
  • 2008/10 (2)
  • 2008/09 (3)
  • 2008/08 (5)

태그목록

  • TopCoder
  • std::auto_ptr
  • TShell
  • 부트로더
  • Reflection
  • Newline
  • 보안
  • Return
  • XML
  • 반복자
  • Call By Value
  • HTML 파서
  • Shell
  • Chaos
  • Image Processing
  • LGT
  • QT4
  • 개발일지
  • PSP
  • ICPC
  • RCW
  • Ribbon UI
  • HTML Parser
  • boost::array
  • Codejock
  • 플러그인
  • ATL
  • TTF
  • 공백
  • 이미지 프로세싱

지역로그 : 태그 : 방명록 : 관리자 : 글쓰기
귀차니스트’s Blog is powered by Textcube 1.7.5 : Risoluto / Designed by DesignNia.net