블로그는 귀차니즘

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

Com Control에서 Event 제작하기

Programming 2008/07/10 11:58 귀차니스트
  Com개체를 이용한 프로그래밍을 하다보면 Com Control을 이용하게 될 수도 있습니다. 바로 지금 보고 계시는 IE조차도 Com으로 이루어진 Browser Com 입니다. IE라는 것이 뭐 기능적으로 추가를 시켜 실제로 보는 익스플로어가 되는 것이죠. 그래서 웹마 같은 IE기반의 웹 브라우저가 나올 수 있는 까닭이 이 때문입니다.
  그런데 Control을 보면 예를 들어서 어떠한 이벤트가 끝났을 때 해당 클라이언트에 링크된 함수를 호출시켜주는 경우가 있죠. 컨트롤이 다 그려졌을 때, 뭐 대충 이런것이라고 할까요? 이 부분을 정리해보기로 했습니다.

  일단 ATL 프로젝트를 시작하여 프로젝트를 만든 다음 Control Class 를 추가할 때 Options에서 필수적으로 Connection Points를 체크해야 합니다. 이 것을 해야 이벤트를 구현할 수 있습니다.



  Interface, Apperance, Stock Properties같은 부분에서 설정할 부분은 모두 다 설정한 뒤, "Finish" 혹은 "마침" 버튼을 눌러 해당 컨트롤을 생성하는 과정을 마칩니다. 그럼 Class View에 해당 Control에 대한 클래스와 Event에 해당하는 클래스가 생성됩니다. 그럼 이 Event에 해당하는 Interface에 메소드를 추가해야 합니다.



  겉으로는 드러나지 않고 TEventLib 안으로 한 레벨 들어가면 _ITestControlEvents 라고 있습니다. 여기서 마우스 오른쪽 버튼을 누른 뒤, Add Method를 선택하여 기존 Com Class에 Method를 추가하듯이 해당 메소를 추가합니다. 다만 여기서 하나 생각해줘야 할 점은 Event 라는 것이 해당 Com Control이 클라이언트에게 호출 하는 것이다보니 [in]파라메터로 넘기는게 좋다는 것이죠. 그럼 일단 파라메터가 없는 빈 AfterDraw이벤트를 추가해보도록 하겠습니다.
  그런 다음 CTestControl 에서 마우스 오른쪽 버튼을 눌러 Add Connection Point를 선택합니다. 그 후엔 당연히 _ITestControlEvents를 선택하시면 됩니다. 혹시 CProxy_ITestControlEvents를 더블클릭하여 해당 소스를 봤는데 아무런 차이가 나지 않고 "Fire_메소드명" 이 보이지 않는다면 한 번 빌드를 하신 뒤 다시 해보시기 바랍니다. 만약 제대로 된다면 다음과 같은 소스가 추가됩니다.

Event.cpp (Language : cpp)
  1. HRESULT Fire_AfterDraw()
  2. {
  3.     HRESULT hr = S_OK;
  4.     T * pThis = static_cast<T *>(this);
  5.     int cConnections = m_vec.GetSize();
  6.  
  7.     for (int iConnection = 0; iConnection < cConnections; iConnection++)
  8.     {
  9.         pThis->Lock();
  10.         CComPtr<IUnknown> punkConnection = m_vec.GetAt(iConnection);
  11.         pThis->Unlock();
  12.  
  13.         IDispatch * pConnection = static_cast<IDispatch *>(punkConnection.p);
  14.  
  15.         if (pConnection)
  16.         {
  17.             CComVariant varResult;
  18.  
  19.             DISPPARAMS params = { NULL, NULL, 0, 0 };
  20.             hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &params, &varResult, NULL, NULL);
  21.         }
  22.     }
  23.     return hr;
  24. }

  이렇게 생성이 된 메소드를 어떻게 호출을 하냐면 일단 목표가 Control이 다 그려지고 난 후에 호출하자고 정했으니 CTestControl 부분의 소스로 건너갑니다. 그 다음 소스를 아래로 주욱 내리시면 OnDraw라는 함수가 보이실 겁니다. 빙고@0@. 드디어 찾았습니다. 그럼 삽입을 해야 겠죠?

OnDraw.cpp (Language : cpp)
  1. HRESULT OnDraw(ATL_DRAWINFO& di)
  2. {
  3.     RECT& rc = *(RECT*)di.prcBounds;
  4.     // Set Clip region to the rectangle specified by di.prcBounds
  5.     HRGN hRgnOld = NULL;
  6.     if (GetClipRgn(di.hdcDraw, hRgnOld) != 1)
  7.         hRgnOld = NULL;
  8.     bool bSelectOldRgn = false;
  9.  
  10.     HRGN hRgnNew = CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom);
  11.  
  12.     if (hRgnNew != NULL)
  13.     {
  14.         bSelectOldRgn = (SelectClipRgn(di.hdcDraw, hRgnNew) != ERROR);
  15.     }
  16.  
  17.     Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
  18.     SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
  19.     LPCTSTR pszText = _T("ATL 8.0 : TestControl");
  20. #ifndef _WIN32_WCE
  21.     TextOut(di.hdcDraw,
  22.         (rc.left + rc.right) / 2,
  23.         (rc.top + rc.bottom) / 2,
  24.         pszText,
  25.         lstrlen(pszText));
  26. #else
  27.     ExtTextOut(di.hdcDraw,
  28.         (rc.left + rc.right) / 2,
  29.         (rc.top + rc.bottom) / 2,
  30.         ETO_OPAQUE,
  31.         NULL,
  32.         pszText,
  33.         ATL::lstrlen(pszText),
  34.         NULL);
  35. #endif
  36.  
  37.     if (bSelectOldRgn)
  38.         SelectClipRgn(di.hdcDraw, hRgnOld);
  39.  
  40.     Fire_AfterDraw();
  41.  
  42.     return S_OK;
  43. }

  단 한 줄 이지만 무지 중요합니다 ㅠㅠ. 이 것을 추가하지 않는다면 제대로 작동하지 않죠~. 추가도 되었으니 이제 소스를 빌드하고 regsvr32 로 등록을 합니다. 그런 다음 C#에서 이제 테스트를 해보는 겁니다. @0@ 컨트롤을 추가하니 AfterDraw 이벤트가 보이는군요!! 당장 추가하고 메시지 박스를 띄워봅니다.



Message.cs (Language : csharp)
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace WindowsFormsApplication6
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.         public Form1()
  15.         {
  16.             InitializeComponent();
  17.         }
  18.  
  19.         private void axTestControl1_AfterDraw(object sender, EventArgs e)
  20.         {
  21.             MessageBox.Show("다 그렸어!!");
  22.         }
  23.     }
  24. }
  25.  

  실행을 하면 메시지 박스가 하나 띄워집니다. 그리고 컨트롤을 살짝 가렸다가 다시 보여주니 메시지 박스가 띄워지는 군요^^. 이벤트 방식으로 컨트롤이나 소스를 처리하는 방식도 있는데, 이를 이용하면 아주 유용하게 사용할 수 있을듯 합니다. 한 번 시도해보시는건 어떨까요??



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

"Programming" 분류의 다른 글

한게임 자동테트리스 Ver 0.6 (22)2008/11/15
한게임 자동테트리스 Ver 0.2 (22)2008/11/03
Read Sector From Floppy (0)2008/07/17
어제 무작정 맹글어봤던 것입니다.. (2)2008/07/16
Com 개체를 Retun in Com Programming (2)2008/07/08
2008/07/10 11:58 2008/07/10 11:58
TAG Event
받은 트랙백이 없고, 댓글이 없습니다.

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

댓글을 달아 주세요

◀ 이전페이지 1 ... 18 19 20 21 22 23 24 25 26 ... 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)

태그목록

  • 십자매
  • Code
  • Mine Sweeper
  • RCW
  • 뻘글
  • 라이브러리
  • Hexrays
  • Xtream Toolkit Pro
  • IPangYa
  • 개발일지
  • Reference
  • 개발
  • boost
  • 오보에
  • 테트리스
  • 6GB
  • 해로
  • 디아블로3
  • Freetype2
  • Array
  • HTML 파서
  • 예외
  • 이미지 프로세싱
  • Pangya
  • iterator_traits
  • TopCoder
  • DP
  • XML
  • AppWizard
  • Image

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