블로그는 귀차니즘

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" 분류의 다른 글

Script Interpreter - boost::spirit (0)2010/03/09
Gradient에 대한 정리 (2)2009/01/07
한게임 자동테트리스 Ver 0.6 (40)2008/11/15
한게임 자동테트리스 Ver 0.2 (27)2008/11/03
Read Sector From Floppy (0)2008/07/17
2008/07/10 11:58 2008/07/10 11:58
TAG Event
받은 트랙백이 없고, 댓글이 없습니다.

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

댓글을 달아 주세요

◀ 이전페이지 1 ... 26 27 28 29 30 31 32 33 34 ... 118 다음페이지 ▶

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

카테고리

  • 전체 (118)
    • Computer (3)
    • Language (14)
    • Reverse Engineering (1)
    • Algorithm (9)
    • TopCoder (3)
    • Library (2)
    • Programming (21)
    • Programming Tip (9)
    • PSP-Programming (10)
    • Program (5)
    • Small Talk (33)
    • Document (4)
    • OS Develope (4)

최근에 올라온 글

  • Script Interpreter - b....
  • VirtualHttpServer - 가.... (2)
  • 음.. 여러가지 일이 있.... (2)
  • 어후.. 드디어 인터럽트....
  • Kernel Image에 어이없....

최근에 달린 댓글

  • 헠 ㅋ 다음에도 들러주세용 ㅋㅋ. 귀차니스트 03/09
  • ㅎㅎ RSS로 첨 온 글이네.ㅋ. 당구리 02/22
  • 음.. 한글화 파일 0.5 버젼은.... 귀차니스트 02/22
  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 01/30
  • 어떤 의미이신지 잘 모르겠네.... 귀차니스트 01/23

달력

«   2010/03   »
일 월 화 수 목 금 토
  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 프로그래밍 세상.
  • runner님의 이글루.
  • 당구리의 마굿간.
  • 동우fly.
  • 류광의 번역 이야기.
  • 서광열의 프로그래밍 언....
  • 준호씨의 블로그.
  • 최익필의 이름없는 블로그.
  • 위키는 귀차니즘.

최근에 받은 트랙백

  • 한게임 테트리스 인공지.... 고니's Life 2009
  • ACM 706 (Uva ID) : LCD.... 알고리즘 트레이닝 : Oh... 2009
  • 문제 4 : LCD 디스플레.... 최익필의 이름없는 블로그 2009
  • 궁극의 예외처리. 이름없는 블로그 2008
  • Maximum sum. 티스토리 지점 2008

글 보관함

  • 2010/03 (1)
  • 2010/02 (1)
  • 2010/01 (1)
  • 2009/12 (3)
  • 2009/08 (1)

태그목록

  • Raw
  • 플러그인
  • Interpreter
  • boost::Tokenizer
  • Bootloader
  • istream_iterator
  • LGT
  • 알고리즘 트레이닝
  • Codejock
  • FTP
  • boost::array
  • 표준
  • Chaos
  • Application.Run
  • AppWizard
  • multimap
  • 부트로더
  • 공백
  • ostreambuf_iterator
  • Call By Reference
  • smart Pointer
  • Code
  • 프로그래밍
  • Rest
  • Dynamic Programming
  • 라이브러리
  • Dialog
  • interface design guide
  • PSP
  • boost::shared_ptr

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