─━ IT ━─

데스크 밴드 및 Internet Explorer 바 구현

DKel 2021. 8. 16. 00:38
반응형
첫 번째로 Internet Explorer 바(IE 바)는 메인 익스플로러 창 내의 자식창이고, 책상 밴드는 데스크톱/태스크바 상의 도킹 가능 창이다.이것들을 사용하여, 유저에게 정보를 표시하거나 유저와 인터랙션을 실시하거나 할 수 있다.본고에서는 이들 밴드 오브젝트의 실장에 대해 설명한다.설계 IE바나 데스크밴드를 작성하기 위해서는 몇 개의 인터페이스와 특수한 등록 프로시저를 구현할 필요가 있다.이 수고를 경감하기 위해 COM과 Windows Shell 런타임에서 필요한 세세한 처리를 모두 캡슐화하는 CDeskBand라는 ATL 클래스를 독자적으로 개발해 보았다.게다가 COM 오브젝트의 등록과 등록 해제를 행하기 위한 CShell Module 클래스를 준비했다.BEGIN_TYPE_MAP(x) 밴드 ATL 객체의 형 맵의 시작을 나타낸다.파라미터 x에는 객체의 형태를 나타내는 _ATL_TYPEMAP_ENTRY 구조체를 저장하는 배열을 지정한다.END_TYPE_MAP()밴드 ATL 객체의 형 맵의 끝을 나타낸다.CShell Module :: Register Server가 호출되면 이 형 맵 내의 각 객체가 시스템 레지스트리에 등록된다.TYPE_ENTRY(clsid, type)형 맵에 밴드 오브젝트 형을 삽입한다.파라미터 clsid는 이 맵에 삽입하는 오브젝트의 CLSID이다.파라미터 type에는, 다음의 몇개의 값을 지정할 수 있다.DeskBand
VerticalExplorerBar
Horizontal Explorer Bar 이들 매크로의 사용법은 ATL의 표준 BEGIN_OBJECT_MAP, OBJECT_ENTRY, END_OBJECT_MAP 매크로와 거의 같다.DECLARE_MENU_MAP(x) 메뉴 맵의 사전 선언이다.파라미터 x에는 1개 또는 여러 밴드 오브젝트에 고유한 맵의 이름을 지정한다.BEGIN_MENU_MAP(x) 메뉴맵의 시작을 나타낸다.파라미터 x에는 메뉴항목을 나타내는 _ATL_MENUMAP_ENTRY 구조체를 저장하는 배열을 지정한다.이것은, 전의 매크로로 사용한 것과 같아야 한다.END_MENU_MAP() **메뉴 맵의 끝을 나타낸다.MENU_ENTRY(id, flags, item, help, verb) **메뉴 맵에 메뉴 항목을 삽입한다.파라미터 id는 맵 내에서 일관되게 할 필요가 있다.flags 파라미터에 지정하는 값에 대해서는 MSDN 문서의 Insert Menu 함수를 참조하기 바란다.item 파라미터에는 메뉴항목의 표시라벨을 지정한다.help 파라미터에는 메뉴항목의 도움말 문자열을 지정한다.verb 파라미터에는 언어에 의존하지 않는 명령어명(open, save 등)을 지정한다.MENU_ENTRY_SEPARATOR()**메뉴맵에 항목구분을 삽입한다.메뉴 맵을 작성하는 것은 밴드 오브젝트에 특수한 명령어가 필요한 경우에만 해야 한다(대표적인 사용 예는 [설정...] 명령어 등). 또한 하나의 메뉴 맵을 여러 밴드 오브젝트에 사용하는 것이 가능하다.class CShell Module : public C CCOM Module Chell Module 클래스는 Windows Shell에서 필요한 등록/등록 해제 프로시저를 확장한 COM 서버 모듈을 실장하고 있다.HRESULT Init ( _ATL_TYPEMAP_ENTRY *pdt, _ATL_OBJMAP_ENTRY *p, HINSTANCE h) 모든 데이터 멤버를 초기화한다.파라미터 pdt는 맵 배열을 가리키는 포인터이다.기타 파라미터는 CCOM Module :: Init 메서드의 파라미터와 동일하다.HRESULT Register Server( const CLSID *pCLSID = NULL) pCLSID 파라미터의 값에 따라 1개의 클래스 오브젝트 또는 오브젝트 맵 내의 모든 오브젝트를 시스템 레지스트리에 등록한다.HRESULT Unregister Server( const CLSID *pCLSID = NULL) pCLSID 파라미터의 값에 따라 1개의 클래스 오브젝트 또는 오브젝트 맵 내의 모든 오브젝트를 등록 해제한다.template < const CLSID * pclsid , const _ ATL _ MENUMAP _ ENTRY * pMenu = NULL >
class ATL _ NO _ VTABLE CDeskBand : public CComObjectRootEx < CComSingleThreadModel > ,
IObject With Site, IPersist Stream, IDeskBand, IContext MenuCDesk Band는 셸 데스크밴드 오브젝트와 IE바 오브젝트를 구현하고 있다.이 클래스에는, 프로텍트 된 5개의 가상 메서드가 포함되어 있고, 오버라이드 하는 것도 가능하다.LRESULT OnCreate ( LPCREATESTRUCT lpCreateStruct ) - WM_CREATE 메시지 핸들러
LRESULT OnDestroy() - WM_DESTROY 메시지 핸들러
LRESULT OnPaint() - WM_PAINT 메시지 핸들러
LRESULT OnCommand ( WPARA M w Param, LPARA M l Param ) - WM_COMMAND 메시지 핸들러
LRESULT OnMsg (HWND hWnd, UINT u Message, WPARA M wParam, LPARA M lParam ) - 위의 메시지를 제외한 범용 메시지 핸들러 자체 밴드 오브젝트를 작성할 때는 이 CDeskBand에서 클래스를 파생시키면 된다.다음에 예를 제시한다.DECLARE_MENU_MAP(데스크밴드 메뉴)
외부 상수 CLSID CLSID_SampleDeskBand;

클래스 CsampleDeskBand: 공용 CComCoClass csSampleDeskBand,
&CLSID_SampleDeskBand>,
공용 CDDeskBand&샘플DeskBand,DeskBand 메뉴>
{
공개:
CsampleDeskBand();
~CSampleDeskBand();

DECLARE_REGISTY_RESOURCEID(IDR_DESKBAND)
DECLARE_PROTE_FINAL_CONSTRUCT()

보호됨:
페인트 시 가상 LRESULT();

개인:
// 데이터 구성원
};
반응형