Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Panel Průzkumníka byl představen v aplikaci Microsoft Internet Explorer 4.0, aby se zobrazila oblast zobrazení sousedící s podoknem prohlížeče. V podstatě se jedná o podřízené okno v okně Aplikace Windows Internet Explorer a dá se použít k zobrazení informací a interakci s uživatelem podobným způsobem. Pravé pruhy nástrojů se nejčastěji zobrazují jako svislé podokno na levé straně podokna prohlížeče. Panel Průzkumníka Windows se ale dá zobrazit také vodorovně pod podoknem prohlížeče.
Panel nástrojů Průzkumníka nabízí širokou škálu možných použití. Uživatelé můžou vybrat, kterou možnost chtějí zobrazit několika různými způsoby, včetně výběru z podnabídky Průzkumníka v nabídce zobrazení , nebo kliknutí na tlačítko panelu nástrojů. Internet Explorer nabízí několik standardních pruhů Průzkumníka, včetně oblíbených položek a hledání.
Jedním ze způsobů, jak můžete přizpůsobit Internet Explorer, je přidání vlastního panelu Průzkumníka. Po implementaci a registraci se přidá do podnabídky panelu průzkumníka v nabídce Zobrazení. Když uživatel vybere, dá se zobrazovaná oblast panelu Průzkumníka použít k zobrazení informací a k převzetí uživatelských vstupů stejným způsobem jako v normálním okně.
Chcete-li vytvořit vlastní panel Průzkumníka, musíte implementovat a zaregistrovat objekt pásu . Tyto objekty pásma byly zavedeny ve verzi 4.71 prostředí Shell a poskytují funkce podobné těm u běžných oken. Vzhledem k tomu, že se jedná o objekty modelu COM (Component Object Model) a obsažené buď Internet Explorerem nebo prostředím, jsou implementovány poněkud jinak. Jednoduché pruhové objekty se použily k vytvoření ukázkových pruhů Průzkumníka zobrazených v prvním obrázku. Implementace ukázky svislého panelu Průzkumníka bude podrobně popsána v další části.
Nástrojové pásky
Nástrojová lišta je pruhový objekt, který byl zaveden v aplikaci Microsoft Internet Explorer 5 pro podporu funkce radiového panelu nástrojů Windows. Panel nástrojů aplikace Internet Explorer je ve skutečnosti ovládací prvek typu rebar, který obsahuje několik ovládacích prvků panelu nástrojů . Vytvořením pásu nástrojů můžete do ovládacího prvku panelu přidat pruh. Podobně jako pruhy Průzkumníka je pruh nástrojů univerzálním oknem.
Uživatelé zobrazí panel nástrojů tím, že ho vyberou z podnabídky nástrojových panelů v nabídce Zobrazení, nebo z místní nabídky, která se zobrazí po kliknutí pravým tlačítkem myši na oblast nástrojové lišty.
Panelové lišty
Pásmové objekty lze také použít k vytvoření panelových pásem. I když je jejich základní implementace podobná Explorer Bars, stolní pásma nesouvisejí s Internet Explorerem. Stolní pás je v podstatě způsob, jak vytvořit dokovatelné okno na ploše. Uživatel jej vybere kliknutím pravým tlačítkem na hlavní panel a zvolením z podnabídky Panely nástrojů.
Na začátku jsou pracovní pásy ukotvené na hlavním panelu.
Uživatel pak může přetáhnout pracovní pás na plochu a zobrazí se jako normální okno.
Implementace objektů pásem
Probírají se následující témata.
Základy objektu pásma
I když se dají použít podobně jako normální okna, pruhové objekty jsou objekty MODELU COM, které existují v rámci kontejneru. Pracovní panely jsou obsaženy v Internet Exploreru a panely nástrojů jsou obsaženy prostředím Shell. I když slouží různým funkcím, jejich základní implementace je velmi podobná. Hlavním rozdílem je způsob registrace objektu pásma, který zase řídí typ objektu a jeho kontejner. Tato část popisuje aspekty implementace, které jsou společné pro všechny objekty pásma. Další podrobnosti o implementaci najdete v jednoduchém příkladu vlastního panelu Průzkumníka.
Kromě IUnknown a IClassFactory, všechny objekty pásma musí implementovat následující rozhraní.
Kromě registrace identifikátoru třídy (CLSID) musí být objekty panelu Průzkumníka a deskového pásma také registrovány pro příslušnou kategorii komponent. Registrace kategorie komponenty určuje typ objektu a jeho kontejner. Pásy nástrojů používají jiný postup registrace a nemají identifikátor kategorie (CATID). Identifikátory CATID pro tři objekty pásma, které je vyžadují, jsou:
| Typ pásma | Kategorie komponent |
|---|---|
| Svislý panel Průzkumníka | CATID_InfoBand |
| Vodorovný panel Průzkumníka | CATID_CommBand |
| Stolní kapela | CATID_DeskBand |
Podrobnosti o registraci objektů pásma naleznete v části Registrace pásma.
Pokud má objekt pásma přijímat uživatelský vstup, musí také implementovat IInputObject. Chcete-li přidat položky do kontextové nabídky pro panel průzkumníka nebo popisné pásy, musí objekt pásma exportovat IContextMenu. Pásy nástrojů nepodporují místní nabídky.
Vzhledem k tomu, že pruhové objekty implementují podřízené okno, musí také implementovat proceduru okna pro zpracování zpráv systému Windows.
Objekty pásma mohou odesílat příkazy do kontejneru prostřednictvím rozhraní IOleCommandTarget. Pokud chcete získat ukazatel rozhraní, zavolejte kontejneru IInputObjectSite::QueryInterface metodu a požádejte o IID_IOleCommandTarget. Potom odešlete příkazy do kontejneru pomocí IOleCommandTarget::Exec. Skupina příkazů je CGID_DeskBand. Pokud je volána metoda objektu pásma IDeskBand::GetBandInfo, kontejner používá parametr dwBandID k přiřazení objektu pásma identifikátor, který se používá pro tři příkazy. Podporovány jsou čtyři příkazová ID pro IOleCommandTarget::Exec.
DBID_BANDINFOCHANGED
Informace o kapele se změnily. Nastavte parametr pvaIn na identifikátor pásma přijatý v posledním volání IDeskBand::GetBandInfo. Kontejner zavolá metodu objektu pásma IDeskBand::GetBandInfo k vyžádání aktualizovaných informací.
DBID_MAXIMIZEBAND
Maximalizujte pásma. Nastavte parametr pvaIn na identifikátor pásma, který byl přijat při nejnovějším volání IDeskBand::GetBandInfo.
DBID_ZOBRAZIT_JEN
Zapněte nebo vypněte ostatní pásma v kontejneru. Nastavte parametr pvaIn na typ VT_UNKNOWN s jednou z následujících hodnot:
Hodnota Popis punk Ukazatel na rozhraní objektu pásma IUnknown. Všechny ostatní deskové kapely budou skryté. 0 Skryjte všechny deskové kapely. 1 Ukaž všechny deskové kapely. DBID_PUSHCHEVRON
verze 5. Zobrazit rozevírací nabídku Kontejner odešle RB_PUSHCHEVRON zprávu a objekt pásma obdrží RBN_CHEVRONPUSHED oznámení, které ho vyzve k zobrazení šipkové nabídky. Nastavte parametr nCmdExecOpt metody IOleCommandTarget::Exec na identifikátor pásma přijatý v posledním volání IDeskBand::GetBandInfo. Nastavte parametr pvaIn metody IOleCommandTarget::Exec na typ VT_I4 s hodnotou definovanou aplikací. Předá zpět do pruhového objektu jako lAppValue hodnotu oznámení RBN_CHEVRONPUSHED.
Registrace pásma
Objekt pásma musí být registrován jako OLE server v rámci procesu, který podporuje vícenásobné vlákno v režimu apartment. Výchozí hodnota pro server je textový řetězec menu. U panelů Průzkumníka se objeví v podnabídce Průzkumníka v nabídce Zobrazení programu Internet Explorer. Pásy nástrojů se zobrazí v podnabídce Panely nástrojů podnabídky Zobrazení aplikace Internet Explorer. U panelů na ploše se zobrazí v podnabídce panelů nástrojů v místní nabídce hlavního panelu. Stejně jako u zdrojů nabídky, umístění ampersandu (&) před písmeno povede k jeho podtržení a umožní použití klávesových zkratek. Například řetězec nabídky svislého panelu Průzkumníka zobrazený v prvním obrázku je "Ukázka &svislý panel Průzkumníka".
Aplikace Internet Explorer zpočátku načte výčet registrovaných objektů panelu Průzkumníka z registru pomocí kategorií součástí. S cílem zvýšit výkon, uloží tento seznam do mezipaměti, což následně způsobí přehlédnutí panelů Průzkumníka. Chcete-li vynutit, aby aplikace Windows Internet Explorer znovu sestavil mezipaměť a rozpoznala nový panel Průzkumníka, odstraňte během registrace nového panelu Průzkumníka následující klíče registru:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup Component Categories\\{00021493-0000-0000-C000-000000000046}\Enum
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Odhoditelné\PostSetup Komponentové kategorie\\{00021494-0000-0000-C000-000000000046}\Výčet
Poznámka
Vzhledem k tomu, že je pro každého uživatele vytvořena mezipaměť panelu Průzkumníka, může být nutné vytvořit výčet všech podregistrů registru uživatelů nebo přidat zástupný kód pro jednotlivé uživatele, který se má spustit při prvním přihlášení uživatele.
Obecně platí, že základní položka registru pro objekt pásma se zobrazí následujícím způsobem.
HKEY_CLASSES_ROOT
CLSID
{Your Band Object's CLSID GUID}
(Default) = Menu Text String
InProcServer32
(Default) = DLL Path Name
ThreadingModel = Apartment
Pásy nástrojů musí mít také CLSID objektu registrované u Internet Exploreru. Chcete-li to provést, přiřaďte hodnotu v části HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar pojmenovanou podle IDENTIFIKÁTORU GUID CLSID objektu nástrojové lišty, jak je zde ukázáno. Jeho datová hodnota je ignorována, takže typ hodnoty není důležitý.
HKEY_LOCAL_MACHINE
Software
Microsoft
Internet Explorer
Toolbar
{Your Band Object's CLSID GUID}
Existuje několik volitelných hodnot, které je možné přidat také do registru. Například následující hodnota je nutná, pokud chcete použít panel Průzkumníka k zobrazení HTML Zobrazená hodnota není příkladem, ale skutečná hodnota, která by se měla použít.
HKEY_CLASSES_ROOT
CLSID
{Your Band Object's CLSID GUID}
Instance
CLSID
(Default) = {4D5C8C2A-D075-11D0-B416-00C04FB90376}
Tato volitelná hodnota se používá ve spojení s výše uvedenou hodnotou, pokud chcete k zobrazení HTML použít panel Průzkumníka. Tato hodnota by měla být nastavena na umístění souboru, který obsahuje obsah HTML pro panel Průzkumníka.
HKEY_CLASSES_ROOT
CLSID
{Your Band Object's CLSID GUID}
Instance
InitPropertyBag
Url
Další volitelná hodnota definuje výchozí šířku nebo výšku panelu Průzkumníka v závislosti na tom, jestli je svislá nebo vodorovná.
HKEY_CURRENT_USER
Software
Microsoft
Internet Explorer
Explorer Bars
{Your Band Object's CLSID GUID}
BarSize
Hodnota BarSize by měla být nastavena na šířku nebo výšku pruhu. Hodnota vyžaduje osm bajtů a je umístěna v registru jako binární hodnota. První čtyři bajty určují velikost v pixelech v šestnáctkovém formátu počínaje levým bajtem. Poslední čtyři bajty jsou rezervované a měly by být nastaveny na nulu.
Tady jsou například zobrazeny úplné položky registru pro panel Průzkumníka podporujícího HTML s výchozí šířkou 291 (0x123).
HKEY_CLASSES_ROOT
CLSID
{Your Band Object's CLSID GUID}
(Default) = Menu Text String
InProcServer32
(Default) = DLL Path Name
ThreadingModel = Apartment
Instance
CLSID
(Default) = {4D5C8C2A-D075-11D0-B416-00C04FB90376}
InitPropertyBag
Url = Your HTML File
HKEY_CURRENT_USER
Software
Microsoft
Internet Explorer
Explorer Bars
{Your Band Object's CLSID GUID}
BarSize = 23 01 00 00 00 00 00 00
Registraci objektu pásma CATID můžete zpracovat programově. Vytvořte objekt správce kategorií komponent (CLSID_StdComponentCategoriesMgr) a požádejte ukazatel na jeho rozhraní ICatRegister. Předejte identifikátory CLSID a CATID objektu pásma ICatRegister::RegisterClassImplCategories.
Jednoduchý příklad panelu Průzkumníka upraveného na míru
Tento příklad prochází implementací ukázkového svislého panelu Explorer Bar, jak je uvedeno v úvodu.
Základní postup vytvoření vlastního panelu Průzkumníka je následující.
- Implementovat funkce potřebné knihovnou DLL.
- Implementujte požadovaná rozhraní COM.
- Implementujte všechna požadovaná volitelná rozhraní COM.
- Zaregistrujte CLSID objektu a v případě potřeby kategorii komponent.
- Vytvořte podřízené okno Internet Exploreru s velikostí odpovídající oblasti zobrazení panelu Exploreru.
- Pomocí podřízeného okna můžete zobrazit informace a pracovat s uživatelem.
Velmi jednoduchá implementace použitá v ukázce panelu Průzkumníka by mohla být skutečně použita pro buď typ panelu Průzkumníka, nebo deskového pásma, a to jednoduše tak, že ji zaregistrujete pro příslušnou kategorii komponent. Propracovanější implementace je potřeba přizpůsobit pro oblast zobrazení a kontejner jednotlivých typů objektů. Většinu tohoto přizpůsobení ale můžete provést tak, že vezmete vzorový kód a rozšíříte ho použitím známých programovacích technik Windows v podřízeném okně. Můžete například přidat ovládací prvky pro interakci uživatele nebo grafiku pro bohatší zobrazení.
Funkce knihovny DLL
Všechny tři objekty jsou zabaleny v jedné knihovně DLL, která zveřejňuje následující funkce.
První tři funkce jsou standardní implementace a nebudou zde popsány. Implementace třídy Factory je také standardní.
Požadované implementace rozhraní
Ukázka vertikálního panelu Průzkumníka implementuje čtyři požadovaná rozhraní: IUnknown, IObjectWithSite, IPersistStreama IDeskBand jako součást třídy CExplorerBar. Konstruktor, destruktor a implementace IUnknown jsou jednoduché a nebudou zde popsány. Podrobnosti najdete v ukázkovém kódu.
Podrobně jsou popsána následující rozhraní.
- IObjectWithSite
- IPersistStream
- IDeskBand
IObjectWithSite
Když uživatel vybere panel Průzkumníka, kontejner zavolá metodu IObjectWithSite::SetSite odpovídajícího objektu pásma. Parametr punkSite bude nastaven na ukazatel IUnknown webového místa.
Obecně platí, že implementace SetSite by měla provést následující kroky:
- Uvolněte libovolný ukazatel webu, který se právě uchovává.
- Pokud je ukazatel předaný na SetSite nastaven na NULL, pásmo je odebráno. SetSite může vrátit S_OK.
- Pokud ukazatel předaný SetSite neníNULL, je nastaveno nové místo.
setsite by měly provádět následující akce:
- Zavolejte QueryInterface na stránce pro jeho rozhraní IOleWindow.
- K volání funkce IOleWindow::GetWindow k získání popisovače nadřazeného okna. Uložte popisovač pro pozdější použití. Uvolněte IOleWindow, pokud už ji nepotřebujete.
- Vytvořte okno objektu pásma jako podřízené okno k oknu získanému v předchozím kroku. Nevytvádřujte ho jako viditelné okno.
- Pokud pruhový objekt implementuje IInputObject, zavolejte QueryInterface na webu pro jeho IInputObjectSite rozhraní. Uložte ukazatel na toto rozhraní pro pozdější použití.
- Pokud jsou všechny kroky úspěšné, vraťte S_OK. Pokud ne, vrátí kód chyby definovaný OLE, který označuje, co se nezdařilo.
Ukázka Explorer Bar implementuje SetSite následujícím způsobem. V následujícím kódu m_pSite je proměnná soukromého člena, která obsahuje IInputObjectSite ukazatel a m_hwndParent obsahuje popisovač nadřazeného okna. V této ukázce se také zpracovává vytváření oken. Pokud okno neexistuje, tato metoda vytvoří okno panelu Průzkumníka jako podřízené okno s odpovídající velikostí k nadřazenému oknu získanému pomocí SetSite. Popisovač dceřiného okna je uložen v m_hwnd.
STDMETHODIMP CDeskBand::SetSite(IUnknown *pUnkSite)
{
HRESULT hr = S_OK;
m_hwndParent = NULL;
if (m_pSite)
{
m_pSite->Release();
}
if (pUnkSite)
{
IOleWindow *pow;
hr = pUnkSite->QueryInterface(IID_IOleWindow, reinterpret_cast<void **>(&pow));
if (SUCCEEDED(hr))
{
hr = pow->GetWindow(&m_hwndParent);
if (SUCCEEDED(hr))
{
WNDCLASSW wc = { 0 };
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hInstance = g_hInst;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = g_szDeskBandSampleClass;
wc.hbrBackground = CreateSolidBrush(RGB(255, 255, 0));
RegisterClassW(&wc);
CreateWindowExW(0,
g_szDeskBandSampleClass,
NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
0,
0,
0,
0,
m_hwndParent,
NULL,
g_hInst,
this);
if (!m_hwnd)
{
hr = E_FAIL;
}
}
pow->Release();
}
hr = pUnkSite->QueryInterface(IID_IInputObjectSite, reinterpret_cast<void **>(&m_pSite));
}
return hr;
}
Implementace #GetSite ukázky pouze obaluje volání metody #QueryInterface stránky, pomocí ukazatele stránky uloženého #SetSite.
STDMETHODIMP CDeskBand::GetSite(REFIID riid, void **ppv)
{
HRESULT hr = E_FAIL;
if (m_pSite)
{
hr = m_pSite->QueryInterface(riid, ppv);
}
else
{
*ppv = NULL;
}
return hr;
}
IPersistStream
Internet Explorer zavolá IPersistStream rozhraní panelu Exploreru, aby mohl načíst nebo uložit trvalá data. Pokud neexistují žádná trvalá data, metody musí stále vracet kód úspěchu. Rozhraní IPersistStream dědí z IPersist, takže musí být implementováno pět metod.
- IPersist::GetClassID
- IPersistStream::IsDirty
- IPersistStream::Load
- IPersistStream::Save
- IPersistStream::GetSizeMax
Ukázka Průzkumníka nepoužívá žádná trvalá data a má pouze minimální implementaci IPersistStream. IPersist::GetClassID vrátí hodnotu CLSID objektu (CLSID_SampleExplorerBar) a zbytek vrátí S_OK, S_FALSE nebo E_NOTIMPL.
IDeskBand
Rozhraní IDeskBand je specifické pro objekty pásma. Kromě své jediné metody dědí z IDockingWindow, které zase dědí z IOleWindow.
Existují dvě metody IOleWindow: GetWindow a IOleWindow::ContextSensitiveHelp. Implementace ukázky panelu Průzkumníka GetWindow vrátí podřízený úchyt panelu Průzkumníka, m_hwnd. Kontextová nápověda není implementována, takže ContextSensitiveHelp vrátí E_NOTIMPL.
Rozhraní IDockingWindow má tři metody.
Metoda ResizeBorderDW se nepoužívá s žádným typem objektu pásma a měla by se vždy vrátit E_NOTIMPL. Metoda ShowDW zobrazí nebo skryje okno panelu Průzkumníka v závislosti na hodnotě jeho parametru.
STDMETHODIMP CDeskBand::ShowDW(BOOL fShow)
{
if (m_hwnd)
{
ShowWindow(m_hwnd, fShow ? SW_SHOW : SW_HIDE);
}
return S_OK;
}
Metoda CloseDW zničí okno panelu Průzkumníka.
STDMETHODIMP CDeskBand::CloseDW(DWORD)
{
if (m_hwnd)
{
ShowWindow(m_hwnd, SW_HIDE);
DestroyWindow(m_hwnd);
m_hwnd = NULL;
}
return S_OK;
}
Zbývající metoda, GetBandInfo, je specifické pro IDeskBand. Internet Explorer ho používá k určení identifikátoru a režimu zobrazení panelu Exploreru. Aplikace Internet Explorer může také požádat o jednu nebo více informací z panelu nástrojů vyplněním člena dwMask struktury DESKBANDINFO, která se předává jako třetí parametr. GetBandInfo by měl uložit identifikátor a režim zobrazení a vyplnit strukturu DESKBANDINFO požadovanými daty. Ukázka panelu Průzkumníka implementuje GetBandInfo, jak je znázorněno v následujícím příkladu kódu.
STDMETHODIMP CDeskBand::GetBandInfo(DWORD dwBandID, DWORD, DESKBANDINFO *pdbi)
{
HRESULT hr = E_INVALIDARG;
if (pdbi)
{
m_dwBandID = dwBandID;
if (pdbi->dwMask & DBIM_MINSIZE)
{
pdbi->ptMinSize.x = 200;
pdbi->ptMinSize.y = 30;
}
if (pdbi->dwMask & DBIM_MAXSIZE)
{
pdbi->ptMaxSize.y = -1;
}
if (pdbi->dwMask & DBIM_INTEGRAL)
{
pdbi->ptIntegral.y = 1;
}
if (pdbi->dwMask & DBIM_ACTUAL)
{
pdbi->ptActual.x = 200;
pdbi->ptActual.y = 30;
}
if (pdbi->dwMask & DBIM_TITLE)
{
// Don't show title by removing this flag.
pdbi->dwMask &= ~DBIM_TITLE;
}
if (pdbi->dwMask & DBIM_MODEFLAGS)
{
pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
}
if (pdbi->dwMask & DBIM_BKCOLOR)
{
// Use the default background color by removing this flag.
pdbi->dwMask &= ~DBIM_BKCOLOR;
}
hr = S_OK;
}
return hr;
}
Volitelné implementace rozhraní
Existují dvě rozhraní, která nejsou nutná, ale to může být užitečné k implementaci: IInputObject a IContextMenu. Ukázka panelu Průzkumník implementuje IInputObject. Informace o implementaci IContextMenunajdete v dokumentaci .
IInputObject
Rozhraní IInputObject musí být implementováno, pokud objekt pásma přijímá uživatelský vstup. Internet Explorer implementuje IInputObjectSite a používá IInputObject pro udržení správného uživatelského vstupu a fokusu, pokud má více než jedno obsažené okno. Panel Průzkumníka musí implementovat tři metody.
Aplikace Internet Explorer volá UIActivateIO, aby informovala panel Průzkumníka, že je aktivovaný nebo deaktivovaný. Po aktivaci ukázka panelu Průzkumníka volá SetFocus, aby zaměřila své okno.
Aplikace Internet Explorer volá HasFocusIO, když se pokouší určit, které okno má fokus. Pokud je okno panelu Průzkumníka nebo některého z jejích potomků v popředí, HasFocusIO by měl vrátit S_OK. Pokud ne, měla by se vrátit S_FALSE.
TranslateAcceleratorIO umožňuje objektu zpracovávat akcelerátory klávesnice. Ukázka panelu Průzkumníka neimplementuje tuto metodu, takže vrací S_FALSE.
Implementace ukázkového pruhu IInputObjectSite je následující.
STDMETHODIMP CDeskBand::UIActivateIO(BOOL fActivate, MSG *)
{
if (fActivate)
{
SetFocus(m_hwnd);
}
return S_OK;
}
STDMETHODIMP CDeskBand::HasFocusIO()
{
return m_fHasFocus ? S_OK : S_FALSE;
}
STDMETHODIMP CDeskBand::TranslateAcceleratorIO(MSG *)
{
return S_FALSE;
};
Registrace CLSID
Stejně jako u všech objektů COM musí být identifikátor CLSID panelu průzkumníka registrován. Aby objekt správně fungoval v Internet Exploreru, musí být také registrován pro příslušnou kategorii komponent (CATID_InfoBand). Relevantní část kódu pro panel Průzkumníka je znázorněna v následujícím příkladu kódu.
HRESULT RegisterServer()
{
WCHAR szCLSID[MAX_PATH];
StringFromGUID2(CLSID_DeskBandSample, szCLSID, ARRAYSIZE(szCLSID));
WCHAR szSubkey[MAX_PATH];
HKEY hKey;
HRESULT hr = StringCchPrintfW(szSubkey, ARRAYSIZE(szSubkey), L"CLSID\\%s", szCLSID);
if (SUCCEEDED(hr))
{
hr = E_FAIL;
if (ERROR_SUCCESS == RegCreateKeyExW(HKEY_CLASSES_ROOT,
szSubkey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
NULL,
&hKey,
NULL))
{
WCHAR const szName[] = L"DeskBand Sample";
if (ERROR_SUCCESS == RegSetValueExW(hKey,
NULL,
0,
REG_SZ,
(LPBYTE) szName,
sizeof(szName)))
{
hr = S_OK;
}
RegCloseKey(hKey);
}
}
if (SUCCEEDED(hr))
{
hr = StringCchPrintfW(szSubkey, ARRAYSIZE(szSubkey), L"CLSID\\%s\\InprocServer32", szCLSID);
if (SUCCEEDED(hr))
{
hr = HRESULT_FROM_WIN32(RegCreateKeyExW(HKEY_CLASSES_ROOT, szSubkey,
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL));
if (SUCCEEDED(hr))
{
WCHAR szModule[MAX_PATH];
if (GetModuleFileNameW(g_hInst, szModule, ARRAYSIZE(szModule)))
{
DWORD cch = lstrlen(szModule);
hr = HRESULT_FROM_WIN32(RegSetValueExW(hKey, NULL, 0, REG_SZ, (LPBYTE) szModule, cch * sizeof(szModule[0])));
}
if (SUCCEEDED(hr))
{
WCHAR const szModel[] = L"Apartment";
hr = HRESULT_FROM_WIN32(RegSetValueExW(hKey, L"ThreadingModel", 0, REG_SZ, (LPBYTE) szModel, sizeof(szModel)));
}
RegCloseKey(hKey);
}
}
}
return hr;
}
Registrace pruhových objektů v příkladu používá běžné postupy COM.
Kromě CLSID musí být server objektů pásma také registrován pro jednu nebo více kategorií součástí. To je ve skutečnosti hlavní rozdíl v implementaci mezi svislými a vodorovnými ukázkami pruhů Průzkumníka. Tento proces se zpracovává vytvořením objektu správce kategorií komponent (CLSID_StdComponentCategoriesMgr) a použitím metody ICatRegister::RegisterClassImplCategories metodu pro registraci serveru objektů pásma. V tomto příkladu se registrace kategorie součástí zpracovává tak, že se identifikátory CLSID a CATID vzorku panelu Průzkumníka předávají do privátní funkce –RegisterComCat– jak je uvedeno v následujícím příkladu kódu.
HRESULT RegisterComCat()
{
ICatRegister *pcr;
HRESULT hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pcr));
if (SUCCEEDED(hr))
{
CATID catid = CATID_DeskBand;
hr = pcr->RegisterClassImplCategories(CLSID_DeskBandSample, 1, &catid);
pcr->Release();
}
return hr;
}
Procedura okna
Vzhledem k tomu, že objekt pruhu používá podřízené okno pro zobrazení, musí implementovat proceduru okna pro zpracování zasílání zpráv systému Windows. Vzor pásma má minimální funkčnost, takže jeho procedura okna zpracovává pouze pět zpráv.
Postup lze snadno rozšířit tak, aby vyhovoval dalším zprávám a podporoval více funkcí.
LRESULT CALLBACK CDeskBand::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lResult = 0;
CDeskBand *pDeskBand = reinterpret_cast<CDeskBand *>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
switch (uMsg)
{
case WM_CREATE:
pDeskBand = reinterpret_cast<CDeskBand *>(reinterpret_cast<CREATESTRUCT *>(lParam)->lpCreateParams);
pDeskBand->m_hwnd = hwnd;
SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pDeskBand));
break;
case WM_SETFOCUS:
pDeskBand->OnFocus(TRUE);
break;
case WM_KILLFOCUS:
pDeskBand->OnFocus(FALSE);
break;
case WM_PAINT:
pDeskBand->OnPaint(NULL);
break;
case WM_PRINTCLIENT:
pDeskBand->OnPaint(reinterpret_cast<HDC>(wParam));
break;
case WM_ERASEBKGND:
if (pDeskBand->m_fCompositionEnabled)
{
lResult = 1;
}
break;
}
if (uMsg != WM_ERASEBKGND)
{
lResult = DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return lResult;
}
Obslužná rutina WM_COMMAND jednoduše vrátí nulu. Obslužná rutina WM_PAINT vytvoří zobrazení jednoduchého textu zobrazeného v příkladu panelu Průzkumníka v úvodu.
void CDeskBand::OnPaint(const HDC hdcIn)
{
HDC hdc = hdcIn;
PAINTSTRUCT ps;
static WCHAR szContent[] = L"DeskBand Sample";
static WCHAR szContentGlass[] = L"DeskBand Sample (Glass)";
if (!hdc)
{
hdc = BeginPaint(m_hwnd, &ps);
}
if (hdc)
{
RECT rc;
GetClientRect(m_hwnd, &rc);
SIZE size;
if (m_fCompositionEnabled)
{
HTHEME hTheme = OpenThemeData(NULL, L"BUTTON");
if (hTheme)
{
HDC hdcPaint = NULL;
HPAINTBUFFER hBufferedPaint = BeginBufferedPaint(hdc, &rc, BPBF_TOPDOWNDIB, NULL, &hdcPaint);
DrawThemeParentBackground(m_hwnd, hdcPaint, &rc);
GetTextExtentPointW(hdc, szContentGlass, ARRAYSIZE(szContentGlass), &size);
RECT rcText;
rcText.left = (RECTWIDTH(rc) - size.cx) / 2;
rcText.top = (RECTHEIGHT(rc) - size.cy) / 2;
rcText.right = rcText.left + size.cx;
rcText.bottom = rcText.top + size.cy;
DTTOPTS dttOpts = {sizeof(dttOpts)};
dttOpts.dwFlags = DTT_COMPOSITED | DTT_TEXTCOLOR | DTT_GLOWSIZE;
dttOpts.crText = RGB(255, 255, 0);
dttOpts.iGlowSize = 10;
DrawThemeTextEx(hTheme, hdcPaint, 0, 0, szContentGlass, -1, 0, &rcText, &dttOpts);
EndBufferedPaint(hBufferedPaint, TRUE);
CloseThemeData(hTheme);
}
}
else
{
SetBkColor(hdc, RGB(255, 255, 0));
GetTextExtentPointW(hdc, szContent, ARRAYSIZE(szContent), &size);
TextOutW(hdc,
(RECTWIDTH(rc) - size.cx) / 2,
(RECTHEIGHT(rc) - size.cy) / 2,
szContent,
ARRAYSIZE(szContent));
}
}
if (!hdcIn)
{
EndPaint(m_hwnd, &ps);
}
}
Obslužné rutiny WM_SETFOCUS a WM_KILLFOCUS informují místo o změně fokusu voláním metody IInputObjectSite::OnFocusChangeIS.
void CDeskBand::OnFocus(const BOOL fFocus)
{
m_fHasFocus = fFocus;
if (m_pSite)
{
m_pSite->OnFocusChangeIS(static_cast<IOleWindow*>(this), m_fHasFocus);
}
}
Pruhové objekty poskytují flexibilní a výkonný způsob, jak rozšířit možnosti Internet Exploreru vytvořením vlastních panelů Průzkumníka. Implementace stolního pásma umožňuje rozšířit možnosti normálních oken. I když se vyžaduje programování v modelu COM, nakonec slouží k poskytnutí podřízeného okna pro vaše uživatelské rozhraní. Odsud může většina implementace používat známé programovací techniky Windows. I když zde probíraný příklad má pouze omezené funkce, ilustruje všechny nezbytné funkce objektu pásma a lze jej snadno rozšířit a vytvořit jedinečné a výkonné uživatelské rozhraní.