Membuat Bilah Penjelajah Kustom, Pita Alat, dan Band Meja
Bilah Penjelajah diperkenalkan dengan Microsoft Internet Explorer 4.0 untuk menyediakan area tampilan yang berdekatan dengan panel browser. Ini pada dasarnya adalah jendela anak dalam jendela Windows Internet Explorer, dan dapat digunakan untuk menampilkan informasi dan berinteraksi dengan pengguna dengan cara yang sama. Bilah Penjelajah paling umum ditampilkan sebagai panel vertikal di sisi kiri panel browser. Namun, Bilah Penjelajah juga dapat ditampilkan secara horizontal, di bawah panel browser.
Ada berbagai kemungkinan penggunaan untuk Bilah Penjelajah. Pengguna dapat memilih opsi mana yang ingin mereka lihat dengan beberapa cara berbeda, termasuk memilihnya dari submenu Bilah Penjelajah dari menu Tampilan , atau mengklik tombol toolbar. Internet Explorer menyediakan beberapa Bilah Penjelajah standar, termasuk Favorit dan Pencarian.
Salah satu cara Anda dapat menyesuaikan Internet Explorer adalah dengan menambahkan Bilah Penjelajah kustom. Saat diimplementasikan dan didaftarkan, itu akan ditambahkan ke submenu Bilah Penjelajah dari menu Tampilan . Saat dipilih oleh pengguna, area tampilan Bilah Penjelajah kemudian dapat digunakan untuk menampilkan informasi dan mengambil input pengguna dengan cara yang sama seperti jendela normal.
Untuk membuat Bilah Penjelajah kustom, Anda harus menerapkan dan mendaftarkan objek band. Objek pita diperkenalkan dengan Shell versi 4.71 dan menyediakan kemampuan yang mirip dengan jendela normal. Namun, karena merupakan objek Model Objek Komponen (COM) dan dimuat oleh Internet Explorer atau Shell, objek tersebut diimplementasikan agak berbeda. Objek pita sederhana digunakan untuk membuat sampel Bilah Penjelajah yang ditampilkan di grafik pertama. Implementasi sampel Bilah Penjelajah vertikal akan dibahas secara rinci di bagian selanjutnya.
Pita Alat
Pita alat adalah objek pita yang diperkenalkan dengan Microsoft Internet Explorer 5 untuk mendukung fitur toolbar radio Windows. Bilah alat Internet Explorer sebenarnya adalah kontrol bilah-ulang yang berisi beberapa kontrol bilah alat. Dengan membuat pita alat, Anda dapat menambahkan band ke kontrol rebar tersebut. Namun, seperti Explorer Bars, pita alat adalah jendela tujuan umum.
Pengguna menampilkan toolbar dengan memilihnya dari submenu Toolbar menu Tampilan atau dari menu pintasan yang ditampilkan dengan mengklik kanan area toolbar.
Pita Meja
Objek pita juga dapat digunakan untuk membuat pita meja. Meskipun implementasi dasarnya mirip dengan Bilah Penjelajah, band meja tidak terkait dengan Internet Explorer. Pita meja pada dasarnya adalah cara untuk membuat jendela yang dapat dilabuhkan di desktop. Pengguna memilihnya dengan mengklik kanan bilah tugas dan memilihnya dari submenu Toolbar .
Awalnya, pita meja ditambatkan di taskbar.
Pengguna kemudian dapat menyeret pita meja ke desktop, dan itu akan muncul sebagai jendela normal.
Menerapkan Objek Pita
Topik berikut dibahas.
Dasar-Dasar Objek Pita
Meskipun dapat digunakan seperti jendela normal, objek pita adalah objek COM yang ada dalam kontainer. Bilah Penjelajah dimuat oleh Internet Explorer, dan pita meja dimuat oleh Shell. Meskipun melayani fungsi yang berbeda, implementasi dasarnya sangat mirip. Perbedaan utama adalah bagaimana objek pita terdaftar, yang pada gilirannya mengontrol jenis objek dan kontainernya. Bagian ini membahas aspek implementasi yang umum untuk semua objek pita. Lihat Contoh Sederhana Bilah Penjelajah Kustom untuk detail implementasi tambahan.
Selain IUnknown dan IClassFactory, semua objek band harus mengimplementasikan antarmuka berikut.
Selain mendaftarkan pengidentifikasi kelas mereka (CLSID), objek Bilah Penjelajah dan pita meja juga harus didaftarkan untuk kategori komponen yang sesuai. Mendaftarkan kategori komponen menentukan jenis objek dan kontainernya. Pita alat menggunakan prosedur pendaftaran yang berbeda dan tidak memiliki pengidentifikasi kategori (CATID). CATID untuk tiga objek pita yang memerlukannya adalah:
Tipe Pita | Kategori Komponen |
---|---|
Bilah Penjelajah Vertikal | CATID_InfoBand |
Bilah Penjelajah Horizontal | CATID_CommBand |
Pita Meja | CATID_DeskBand |
Lihat Pendaftaran Band untuk diskusi lebih lanjut tentang cara mendaftarkan objek band.
Jika objek band menerima input pengguna, objek tersebut juga harus mengimplementasikan IInputObject. Untuk menambahkan item ke menu pintasan untuk Bilah Penjelajah atau pita meja, objek pita harus mengekspor IContextMenu. Pita alat tidak mendukung menu pintasan.
Karena objek pita menerapkan jendela anak, objek tersebut juga harus menerapkan prosedur jendela untuk menangani pesan Windows.
Objek band dapat mengirim perintah ke kontainer mereka melalui antarmuka IOleCommandTarget kontainer. Untuk mendapatkan penunjuk antarmuka, panggil metode IInputObjectSite::QueryInterface kontainer dan minta IID_IOleCommandTarget. Anda kemudian mengirim perintah ke kontainer dengan IOleCommandTarget::Exec. Grup perintah CGID_DeskBand. Ketika metode IDeskBand::GetBandInfo objek pita dipanggil, kontainer menggunakan parameter dwBandID untuk menetapkan objek band pengidentifikasi yang digunakan untuk tiga perintah. Empat ID perintah IOleCommandTarget::Exec didukung.
DBID_BANDINFOCHANGED
Informasi band telah berubah. Atur parameter pvaIn ke pengidentifikasi band yang diterima dalam panggilan terbaru ke IDeskBand::GetBandInfo. Kontainer akan memanggil metode IDeskBand::GetBandInfo objek band untuk meminta informasi yang diperbarui.
DBID_MAXIMIZEBAND
Maksimalkan band. Atur parameter pvaIn ke pengidentifikasi band yang diterima dalam panggilan terbaru ke IDeskBand::GetBandInfo.
DBID_SHOWONLY
Aktifkan atau nonaktifkan pita lain dalam kontainer. Atur parameter pvaIn ke jenis VT_UNKNOWN dengan salah satu nilai berikut:
Nilai Deskripsi Punk Penunjuk ke antarmuka IUnknown objek pita. Semua pita meja lainnya akan disembunyikan. 0 Sembunyikan semua pita meja. 1 Tampilkan semua pita meja. DBID_PUSHCHEVRON
Versi 5. Tampilkan menu chevron. Kontainer mengirim pesan RB_PUSHCHEVRON , dan objek pita menerima pemberitahuan RBN_CHEVRONPUSHED yang memintanya untuk menampilkan menu chevron. Atur parameter nCmdExecOpt metode IOleCommandTarget::Exec ke pengidentifikasi band yang diterima dalam panggilan terbaru ke IDeskBand::GetBandInfo. Atur parameter pvaIn metode IOleCommandTarget::Exec ke jenis VT_I4 dengan nilai yang ditentukan aplikasi. Ini meneruskan kembali ke objek band sebagai nilai lAppValue dari pemberitahuan RBN_CHEVRONPUSHED.
Pendaftaran Band
Objek pita harus didaftarkan sebagai server OLE dalam proses yang mendukung utas apartemen. Nilai default untuk server adalah string teks menu. Untuk Bilah Penjelajah, itu akan muncul di submenu Bilah Penjelajah dari menu Tampilan Internet Explorer. Untuk pita alat, itu akan muncul di submenu Toolbar dari menu Tampilan Internet Explorer. Untuk band meja, itu akan muncul di submenu Toolbar dari menu pintasan taskbar. Seperti halnya sumber daya menu, menempatkan ampersand (&) di depan huruf akan menyebabkannya digaris bawahi dan mengaktifkan pintasan keyboard. Misalnya, string menu untuk Bilah Penjelajah vertikal yang ditampilkan dalam grafik pertama adalah "Sampel &Bilah Penjelajah Vertikal".
Awalnya, Internet Explorer mengambil enumerasi objek Bilah Penjelajah terdaftar dari registri menggunakan kategori komponen. Untuk meningkatkan performa, kemudian cache enumerasi ini, menyebabkan bilah Explorer yang kemudian ditambahkan diabaikan. Untuk memaksa Windows Internet Explorer membangun kembali cache dan mengenali Bilah Penjelajah baru, hapus kunci registri berikut selama pendaftaran Bilah Penjelajah baru:
HKEY_CURRENT_USER Perangkat Lunak\Microsoft\Windows\CurrentVersion\Explorer\Kategori\ Komponen PostSetup\yang Dapat Dibuang\{00021493-0000-0000-C000-00000000046}\Enum\
HKEY_CURRENT_USER Perangkat Lunak\Microsoft\Windows\CurrentVersion\Explorer\Kategori\ Komponen PostSetup\yang Dapat Dibuang\{00021494-0000-0000-C000-00000000046}\Enum\
Catatan
Karena cache Bilah Penjelajah dibuat untuk setiap pengguna, aplikasi penyiapan Anda mungkin perlu menghitung semua sarang registri pengguna atau menambahkan stub per pengguna untuk dijalankan saat pengguna pertama kali masuk.
Secara umum, entri registri dasar untuk objek pita akan muncul sebagai berikut.
HKEY_CLASSES_ROOT
CLSID
{Your Band Object's CLSID GUID}
(Default) = Menu Text String
InProcServer32
(Default) = DLL Path Name
ThreadingModel = Apartment
Pita alat juga harus memiliki CLSID objek mereka yang terdaftar di Internet Explorer. Untuk melakukan ini, tetapkan nilai di bawah HKEY_LOCAL_MACHINE\Toolbar Microsoft\Internet Explorer\Perangkat Lunak\bernama dengan GUID CLSID objek pita alat seperti yang ditunjukkan di sini. Nilai datanya diabaikan, sehingga jenis nilainya tidak penting.
HKEY_LOCAL_MACHINE
Software
Microsoft
Internet Explorer
Toolbar
{Your Band Object's CLSID GUID}
Ada beberapa nilai opsional yang juga dapat ditambahkan ke registri. Misalnya, nilai berikut diperlukan jika Anda ingin menggunakan Bilah Penjelajah untuk menampilkan HTML Nilai yang ditampilkan bukan contoh, tetapi nilai aktual yang harus digunakan.
HKEY_CLASSES_ROOT
CLSID
{Your Band Object's CLSID GUID}
Instance
CLSID
(Default) = {4D5C8C2A-D075-11D0-B416-00C04FB90376}
Digunakan bersama dengan nilai yang ditunjukkan di atas, nilai opsional berikut juga diperlukan jika Anda ingin menggunakan Bilah Penjelajah untuk menampilkan HTML. Nilai ini harus diatur ke lokasi file yang berisi konten HTML untuk Bilah Penjelajah.
HKEY_CLASSES_ROOT
CLSID
{Your Band Object's CLSID GUID}
Instance
InitPropertyBag
Url
Nilai opsional lainnya menentukan lebar atau tinggi default Bilah Penjelajah, tergantung pada apakah itu vertikal atau horizontal, masing-masing.
HKEY_CURRENT_USER
Software
Microsoft
Internet Explorer
Explorer Bars
{Your Band Object's CLSID GUID}
BarSize
Nilai BarSize harus diatur ke lebar atau tinggi bilah. Nilai memerlukan delapan byte dan ditempatkan dalam registri sebagai nilai biner. Empat byte pertama menentukan ukuran dalam piksel, dalam format heksadesimal, mulai dari byte paling kiri. Empat byte terakhir dicadangkan dan harus diatur ke nol.
Sebagai contoh, entri registri lengkap untuk Bilah Penjelajah berkemampuan HTML dengan lebar default 291 (0x123) piksel ditampilkan di sini.
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
Anda dapat menangani pendaftaran CATID objek pita secara terprogram. Buat objek pengelola kategori komponen (CLSID_StdComponentCategoriesMgr) dan minta penunjuk ke antarmuka ICatRegister-nya. Teruskan CLSID dan CATID objek band ke ICatRegister::RegisterClassImplCategories.
Contoh Sederhana Bilah Penjelajah Kustom
Contoh ini melewati implementasi sampel Bilah Penjelajah vertikal yang ditunjukkan dalam pengenalan.
Prosedur dasar untuk membuat Bilah Penjelajah kustom adalah sebagai berikut.
- Terapkan fungsi yang diperlukan oleh DLL.
- Terapkan antarmuka COM yang diperlukan.
- Terapkan antarmuka COM opsional yang diinginkan.
- Daftarkan CLSID objek dan, jika diperlukan, kategori komponen.
- Buat jendela anak Internet Explorer, berukuran agar pas dengan wilayah tampilan Bilah Penjelajah.
- Gunakan jendela anak untuk menampilkan informasi dan berinteraksi dengan pengguna.
Implementasi yang sangat sederhana yang digunakan dalam sampel Explorer Bar sebenarnya dapat digunakan untuk jenis Explorer Bar, atau band meja, hanya dengan mendaftarkannya untuk kategori komponen yang sesuai. Implementasi yang lebih canggih perlu disesuaikan untuk setiap wilayah tampilan dan kontainer jenis objek. Namun, sebagian besar penyesuaian ini dapat dicapai dengan mengambil kode sampel dan memperluasnya dengan menerapkan teknik pemrograman Windows yang sudah dikenal ke jendela anak. Misalnya, Anda dapat menambahkan kontrol untuk interaksi pengguna, atau grafik untuk tampilan yang lebih kaya.
Fungsi DLL
Ketiga objek dipaketkan dalam satu DLL, yang mengekspos fungsi berikut.
Tiga fungsi pertama adalah implementasi standar dan tidak akan dibahas di sini. Implementasi Class Factory juga standar.
Implementasi Antarmuka yang Diperlukan
Sampel Bilah Penjelajah vertikal mengimplementasikan empat antarmuka yang diperlukan: IUnknown, IObjectWithSite, IPersistStream, dan IDeskBand sebagai bagian dari kelas CExplorerBar. Implementasi konstruktor, destruktor, dan IUnknown sangat mudah, dan tidak akan dibahas di sini. Lihat kode sampel untuk detailnya.
Antarmuka berikut dibahas secara rinci.
IObjectWithSite
Saat pengguna memilih Bilah Penjelajah, kontainer memanggil metode IObjectWithSite::SetSite objek band yang sesuai. Parameter punkSite akan diatur ke pointer IUnknown situs.
Secara umum, implementasi SetSite harus melakukan langkah-langkah berikut:
- Lepaskan penunjuk situs apa pun yang saat ini sedang ditahan.
- Jika pointer yang diteruskan ke SetSite diatur ke NULL, pita sedang dihapus. SetSite dapat mengembalikan S_OK.
- Jika pointer yang diteruskan ke SetSite bukan NULL, situs baru sedang diatur. SetSite harus melakukan hal berikut:
- Panggil QueryInterface di situs untuk antarmuka IOleWindow-nya.
- Hubungi IOleWindow::GetWindow untuk mendapatkan handel jendela induk. Simpan handel untuk digunakan nanti. Rilis IOleWindow jika tidak lagi diperlukan.
- Buat jendela objek pita sebagai anak dari jendela yang diperoleh di langkah sebelumnya. Jangan membuatnya sebagai jendela yang terlihat.
- Jika objek band mengimplementasikan IInputObject, panggil QueryInterface di situs untuk antarmuka IInputObjectSite-nya. Simpan penunjuk ke antarmuka ini untuk digunakan nanti.
- Jika semua langkah berhasil, kembalikan S_OK. Jika tidak, kembalikan kode kesalahan yang ditentukan OLE yang menunjukkan apa yang gagal.
Sampel Bilah Penjelajah mengimplementasikan SetSite dengan cara berikut. Dalam kode berikut m_pSite adalah variabel anggota privat yang memegang pointer IInputObjectSite dan m_hwndParent memegang handel jendela induk. Dalam sampel ini, pembuatan jendela juga ditangani. Jika jendela tidak ada, metode ini membuat jendela Bilah Penjelajah sebagai anak berukuran tepat dari jendela induk yang diperoleh oleh SetSite. Handel jendela anak disimpan di 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;
}
Implementasi GetSite sampel hanya membungkus panggilan ke metode QueryInterface situs, menggunakan pointer situs yang disimpan oleh 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 akan memanggil antarmuka IPersistStream Bilah Penjelajah untuk memungkinkan Bilah Penjelajah memuat atau menyimpan data persisten. Jika tidak ada data persisten, metode masih harus mengembalikan kode keberhasilan. Antarmuka IPersistStream mewarisi dari IPersist, sehingga lima metode harus diimplementasikan.
- IPersist::GetClassID
- IPersistStream::IsDirty
- IPersistStream::Load
- IPersistStream::Simpan
- IPersistStream::GetSizeMax
Sampel Bilah Penjelajah tidak menggunakan data persisten apa pun dan hanya memiliki implementasi minimal IPersistStream. IPersist::GetClassID mengembalikan CLSID (CLSID_SampleExplorerBar) objek, dan sisanya mengembalikan S_OK, S_FALSE, atau E_NOTIMPL.
IDeskBand
Antarmuka IDeskBand khusus untuk objek pita. Selain satu metodenya, ia mewarisi dari IDockingWindow, yang pada gilirannya mewarisi dari IOleWindow.
Ada dua metode IOleWindow: GetWindow dan IOleWindow::ContextSensitiveHelp. Implementasi sampel Bilah Penjelajah GetWindow mengembalikan handel jendela anak Bilah Penjelajah, m_hwnd. Bantuan peka konteks tidak diimplementasikan, sehingga ContextSensitiveHelp mengembalikan E_NOTIMPL.
Antarmuka IDockingWindow memiliki tiga metode.
Metode ResizeBorderDW tidak digunakan dengan semua jenis objek pita dan harus selalu mengembalikan E_NOTIMPL. Metode ShowDW menampilkan atau menyembunyikan jendela Bilah Penjelajah, tergantung pada nilai parameternya.
STDMETHODIMP CDeskBand::ShowDW(BOOL fShow)
{
if (m_hwnd)
{
ShowWindow(m_hwnd, fShow ? SW_SHOW : SW_HIDE);
}
return S_OK;
}
Metode CloseDW menghancurkan jendela Bilah Penjelajah.
STDMETHODIMP CDeskBand::CloseDW(DWORD)
{
if (m_hwnd)
{
ShowWindow(m_hwnd, SW_HIDE);
DestroyWindow(m_hwnd);
m_hwnd = NULL;
}
return S_OK;
}
Metode yang tersisa, GetBandInfo, khusus untuk IDeskBand. Internet Explorer menggunakannya untuk menentukan pengidentifikasi dan mode tampilan Bilah Penjelajah. Internet Explorer juga dapat meminta satu atau beberapa informasi dari Bilah Penjelajah dengan mengisi anggota dwMask dari struktur DESKBANDINFO yang diteruskan sebagai parameter ketiga. GetBandInfo harus menyimpan pengidentifikasi dan mode tampilan dan mengisi struktur DESKBANDINFO dengan data yang diminta. Sampel Bilah Penjelajah mengimplementasikan GetBandInfo seperti yang ditunjukkan dalam contoh kode berikut.
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;
}
Implementasi Antarmuka Opsional
Ada dua antarmuka yang tidak diperlukan, tetapi mungkin berguna untuk diimplementasikan: IInputObject dan IContextMenu. Sampel Bilah Penjelajah mengimplementasikan IInputObject. Lihat dokumentasi untuk informasi tentang cara menerapkan IContextMenu.
IInputObject
Antarmuka IInputObject harus diimplementasikan jika objek band menerima input pengguna. Internet Explorer mengimplementasikan IInputObjectSite dan menggunakan IInputObject untuk mempertahankan fokus input pengguna yang tepat ketika memiliki lebih dari satu jendela yang terkandung. Ada tiga metode yang perlu diimplementasikan oleh Bilah Penjelajah.
Internet Explorer memanggil UIActivateIO untuk menginformasikan bilah Explorer bahwa UIActivateIO diaktifkan atau dinonaktifkan. Saat diaktifkan, sampel Bilah Penjelajah memanggil SetFocus untuk mengatur fokus ke jendelanya.
Internet Explorer memanggil HasFocusIO ketika mencoba menentukan jendela mana yang memiliki fokus. Jika jendela Bilah Penjelajah atau salah satu keturunannya memiliki fokus, HasFocusIO harus mengembalikan S_OK. Jika tidak, itu harus mengembalikan S_FALSE.
TranslateAcceleratorIO memungkinkan objek memproses akselerator keyboard. Sampel Bilah Penjelajah tidak menerapkan metode ini, sehingga mengembalikan S_FALSE.
Implementasi bilah sampel IInputObjectSite adalah sebagai berikut.
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;
};
Pendaftaran CLSID
Seperti semua objek COM, CLSID Bilah Penjelajah harus didaftarkan. Agar objek berfungsi dengan baik dengan Internet Explorer, objek juga harus didaftarkan untuk kategori komponen yang sesuai (CATID_InfoBand). Bagian kode yang relevan untuk Bilah Penjelajah diperlihatkan dalam contoh kode berikut.
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;
}
Pendaftaran objek pita dalam sampel menggunakan prosedur COM normal.
Selain CLSID, server objek pita juga harus didaftarkan untuk satu atau beberapa kategori komponen. Ini sebenarnya adalah perbedaan utama dalam implementasi antara sampel Bilah Penjelajah vertikal dan horizontal. Proses ini ditangani dengan membuat objek manajer kategori komponen (CLSID_StdComponentCategoriesMgr) dan menggunakan metode ICatRegister::RegisterClassImplCategories untuk mendaftarkan server objek band. Dalam contoh ini, pendaftaran kategori komponen ditangani dengan meneruskan CLSID dan CATID sampel Bilah Penjelajah ke fungsi privat—RegisterComCat—seperti yang ditunjukkan dalam contoh kode berikut.
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;
}
Prosedur Jendela
Karena objek pita menggunakan jendela anak untuk tampilannya, objek harus menerapkan prosedur jendela untuk menangani olahpesan Windows. Sampel pita memiliki fungsionalitas minimal, sehingga prosedur jendelanya hanya menangani lima pesan:
Prosedur ini dapat dengan mudah diperluas untuk mengakomodasi pesan tambahan untuk mendukung lebih banyak fitur.
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;
}
Handler WM_COMMAND hanya mengembalikan nol. Handler WM_PAINT membuat tampilan teks sederhana yang ditampilkan dalam contoh Bilah Penjelajah dalam pengenalan.
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);
}
}
Handler WM_SETFOCUS dan WM_KILLFOCUS menginformasikan situs perubahan fokus dengan memanggil metode IInputObjectSite::OnFocusChangeIS situs.
void CDeskBand::OnFocus(const BOOL fFocus)
{
m_fHasFocus = fFocus;
if (m_pSite)
{
m_pSite->OnFocusChangeIS(static_cast<IOleWindow*>(this), m_fHasFocus);
}
}
Objek pita menyediakan cara yang fleksibel dan kuat untuk memperluas kemampuan Internet Explorer dengan membuat Bilah Penjelajah kustom. Menerapkan pita meja memungkinkan Anda memperluas kemampuan jendela normal. Meskipun beberapa pemrograman COM diperlukan, pada akhirnya berfungsi untuk menyediakan jendela anak untuk antarmuka pengguna Anda. Dari sana, sebagian besar implementasi dapat menggunakan teknik pemrograman Windows yang sudah dikenal. Meskipun contoh yang dibahas di sini hanya memiliki fungsionalitas terbatas, ini menggambarkan semua fitur yang diperlukan dari objek pita dan dapat dengan mudah diperluas untuk membuat antarmuka pengguna yang unik dan kuat.