Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A Legtöbb Windows-alapú alkalmazás eszköztár-vezérlőkkel biztosítja a felhasználóknak a programfunkciókhoz való kényelmes hozzáférést. A statikus eszköztáraknak azonban vannak hiányosságai – például túl kevés hely az összes rendelkezésre álló eszköz hatékony megjelenítéséhez. A probléma megoldásának célja, hogy az alkalmazás eszköztárai testre szabhatók legyenek. Ezután a felhasználók dönthetnek úgy, hogy csak a szükséges eszközöket jelenítik meg, és a személyes munkastílusuknak megfelelő módon rendszerezhetik őket.
Jegyzet
A párbeszédpanelek eszköztárai nem szabhatók testre.
A testreszabás engedélyezéséhez vegye fel a CCS_ADJUSTABLE általános vezérlőstílus-jelzőt az eszköztár vezérlőelem létrehozásakor. A testreszabásnak két alapvető megközelítése van:
- A testreszabás párbeszédpanel. Ez a rendszer által biztosított párbeszédpanel a legegyszerűbb módszer. Grafikus felhasználói felületet biztosít a felhasználóknak, amely lehetővé teszi az ikonok hozzáadását, törlését vagy áthelyezését.
- Eszközök húzása és ejtése. A húzási funkció implementálásával a felhasználók az eszköztár egy másik helyére helyezhetik át az eszközöket, vagy törölhetik őket az eszköztárról való húzással. Segítségével a felhasználók gyorsan és egyszerűen rendszerezhetik eszköztárukat, de nem teszik lehetővé az eszközök hozzáadását.
Az alkalmazás igényeitől függően bármelyik megközelítést vagy mindkettőt implementálhatja. A testreszabás ezen két módszere közül egyik sem biztosít beépített mechanizmust, például a Mégse vagy a Visszavonás gombot az eszköztár korábbi állapotba való visszaállításához. Az eszköztár precustomizációs állapotának tárolásához explicit módon az eszköztár-vezérlési API-t kell használnia. Ha szükséges, később a tárolt adatok használatával visszaállíthatja az eszköztárat az eredeti állapotára.
Amit tudnia kell
Technológiák
Előfeltételek
- C/C++
- Windows felhasználói felület programozása
Előírás
Testreszabás párbeszédpanel
A testreszabási párbeszédpanelt az eszköztár-vezérlő biztosítja, így a felhasználók egyszerűen adhatnak hozzá, helyezhetnek át vagy törölhet eszközöket. A felhasználók az eszköztárra duplán kattintva indíthatják el. Az alkalmazások programozott módon indíthatják el a testreszabási párbeszédpanelt az eszköztár vezérlőjének TB_CUSTOMIZE üzenet elküldésével.
Az alábbi ábrán egy példa látható az eszköztár testreszabási párbeszédpanelére.
A jobb oldali listamezőben található eszközök jelenleg az eszköztáron találhatók. Kezdetben ez a lista tartalmazza az eszköztár létrehozásakor megadott eszközöket. A bal oldali listamező tartalmazza az eszköztárhoz hozzáadni kívánt eszközöket. Az alkalmazás feladata a lista feltöltése (az automatikusan megjelenő Elválasztó kivételével).
Az eszköztár-vezérlő értesíti az alkalmazást arról, hogy egy testreszabási párbeszédpanelt indít el, úgy hogy a szülőablakának elküld egy TBN_BEGINADJUST értesítési kódot, majd egy TBN_INITCUSTOMIZE értesítési kódot. A legtöbb esetben az alkalmazásnak nem kell válaszolnia ezekre az értesítési kódokra. Ha azonban nem szeretné, hogy az Eszköztár testreszabása párbeszédpanel súgógombot jelenítsen meg, kezelje a TBN_INITCUSTOMIZE eseményt a TBNRF_HIDEHELP visszaadásával.
Az eszköztár vezérlőelem ezután három értesítési kód elküldésével gyűjti össze a párbeszédpanel inicializálásához szükséges információkat az alábbi sorrendben:
- Egy TBN_QUERYINSERT értesítési kód az eszköztár minden egyes gombjához annak meghatározásához, hogy hol lehet beszúrni a gombokat. Adja vissza HAMIS értéket, hogy megelőzze az értesítési üzenetben megadott gombtól balra eső gomb beillesztését. Ha az összes TBN_QUERYINSERT értesítési kódhoz HAMIS értéket ad vissza, akkor a párbeszédablak nem fog megjelenni.
- Egy TBN_QUERYDELETE értesítési kód minden olyan eszközhöz, amely jelenleg az eszköztáron található. Térjen vissza IGAZ, ha egy eszköz törölhető, különben HAMIS.
- Az elérhető gombok listájának feltöltéséhez TBN_GETBUTTONINFO értesítési kódok sorozata. Ha gombot szeretne hozzáadni a listához, töltse ki az értesítési kóddal átadott NMTOOLBAR struktúrát, és adja vissza TRUE. Ha nincs több eszköz a hozzáadáshoz, adja vissza HAMIS. Vegye figyelembe, hogy a már az eszköztáron lévő gombok adatait is visszaadhatja; ezek a gombok nem lesznek hozzáadva a listához.
Ekkor megjelenik a párbeszédpanel, és a felhasználó elkezdheti testre szabni az eszköztárat.
Amikor meg van nyitva a párbeszédpanel, az alkalmazás a felhasználó műveleteitől függően különböző értesítési kódokat kaphat:
- TBN_QUERYINSERT. A felhasználó módosította az eszköz helyét az eszköztáron, vagy hozzáadott egy eszközt. Adja vissza HAMIS, hogy az eszköz ne legyen beszúrva az adott helyre.
- TBN_DELETINGBUTTON. A felhasználó el szeretne távolítani egy eszközt az eszköztárból.
- TBN_CUSTHELP. A felhasználó a Súgó gombra kattintott.
- TBN_TOOLBARCHANGE. A felhasználó hozzáadott, áthelyezett vagy törölt egy eszközt.
- TBN_RESET. A felhasználó az Alaphelyzetbe állítás gombra kattintott.
A párbeszédpanel megsemmisítése után az alkalmazás egy TBN_ENDADJUST értesítési kódot kap.
Az alábbi példakód az eszköztár testreszabásának egyik módját mutatja be.
// The buttons are stored in an array of TBBUTTON structures.
//
// Constants such as STD_FILENEW are identifiers for the
// built-in bitmaps that have already been assigned as the toolbar's
// image list.
//
// Constants such as IDM_NEW are application-defined command identifiers.
TBBUTTON allButtons[] =
{
{ MAKELONG(STD_FILENEW, ImageListID), IDM_NEW, TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"New" },
{ MAKELONG(STD_FILEOPEN, ImageListID), IDM_OPEN, TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Open"},
{ MAKELONG(STD_FILESAVE, ImageListID), IDM_SAVE, TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Save"},
{ MAKELONG(STD_CUT, ImageListID), IDM_CUT, TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Cut" },
{ MAKELONG(STD_COPY, ImageListID), IDM_COPY, TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Copy"},
{ MAKELONG(STD_PASTE, ImageListID), IDM_PASTE, TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Paste"}
};
// The following appears in the window's message handler.
case WM_NOTIFY:
{
switch (((LPNMHDR)lParam)->code)
{
case TBN_GETBUTTONINFO:
{
LPTBNOTIFY lpTbNotify = (LPTBNOTIFY)lParam;
// Pass the next button from the array. There is no need to filter out buttons
// that are already used—they will be ignored.
int buttonCount = sizeof(allButtons) / sizeof(TBBUTTON);
if (lpTbNotify->iItem < buttonCount)
{
lpTbNotify->tbButton = allButtons[lpTbNotify->iItem];
return TRUE;
}
else
{
return FALSE; // No more buttons.
}
}
break;
case TBN_QUERYINSERT:
case TBN_QUERYDELETE:
return TRUE;
}
}
Eszközök húzása és eldobása
A felhasználók a SHIFT billentyű lenyomásával és a gomb másik helyre húzásával átrendezhetik az eszköztár gombjait. A húzási folyamatot az eszköztár vezérlőelem automatikusan kezeli. A gomb húzása során megjelenik egy szellemkép, és miután elengedik, átrendezi az eszköztárat. A felhasználók így nem adhatnak hozzá gombokat, de törölhetnek egy gombot az eszköztárról való ledobással.
Bár az eszköztár-vezérlő általában automatikusan elvégzi ezt a műveletet, két értesítési kódot is küld az alkalmazásnak: TBN_QUERYDELETE és TBN_QUERYINSERT. A húzási folyamat szabályozásához az alábbi értesítési kódokat kell kezelnie:
- A TBN_QUERYDELETE értesítési kód azonnal el lesz küldve, amint a felhasználó megpróbálja áthelyezni a gombot, mielőtt megjelenik a szellem gomb. A gomb áthelyezésének megakadályozása érdekében adja vissza FALSE. Ha visszaadja TRUE, akkor a felhasználó áthelyezheti vagy törölheti az eszközt az eszköztárról. Ha egy eszköz áthelyezhető, törölhető. Ha azonban a felhasználó töröl egy eszközt, az eszköztár-vezérlő egy TBN_DELETINGBUTTON értesítési kódot küld az alkalmazásnak, ekkor dönthet úgy, hogy visszaállítja a gombot az eredeti helyén, ezzel megszakítva a törlést.
- A TBN_QUERYINSERT értesítési kód akkor lesz elküldve, amikor a felhasználó megpróbálja eldobni a gombot az eszköztáron. Ha meg szeretné akadályozni, hogy az áthelyezett gomb az értesítésben megadott gombtól balra legyen, adja vissza HAMIS. Ez az értesítési kód nem lesz elküldve, ha a felhasználó ledobja az eszközt az eszköztárról.
Ha a felhasználó a SHIFT billentyű lenyomása nélkül próbál húzni egy gombot, az eszköztár-vezérlő nem fogja kezelni a húzási műveletet. Azonban egy TBN_BEGINDRAG értesítési kódot küld az alkalmazásnak, amely jelzi a húzási művelet kezdetét, valamint egy TBN_ENDDRAG értesítési kódot a befejezés jelzéséhez. Ha engedélyezni szeretné ezt a húzási formát, az alkalmazásnak kezelnie kell ezeket az értesítési kódokat, meg kell adnia a szükséges felhasználói felületet, és módosítania kell az eszköztárat a módosításoknak megfelelően.
Eszköztárak mentése és visszaállítása
Az eszköztár testreszabása során előfordulhat, hogy az alkalmazásnak adatokat kell mentenie, hogy visszaállíthassa az eszköztárat az eredeti állapotára. Az eszköztár állapotának mentéséhez vagy visszaállításához küldjön egy TB_SAVERESTORE üzenetet az eszköztár vezérlőelemnek, amelyben a wParam értéke IGAZ. Az üzenet wParam értéke határozza meg, hogy mentési vagy visszaállítási műveletet kér-e. Az üzenet elküldése után kétféleképpen kezelheti a mentési/visszaállítási műveletet:
- A gyakori vezérlők 4.72-es és korábbi verziójú, TBN_GETBUTTONINFO kezelőt kell implementálnia. Az eszköztár-vezérlő elküldi ezt az értesítési kódot, hogy információkat kérjen az egyes gombokról a visszaállításkor.
- Az 5.80-es verzió tartalmaz egy mentési/visszaállítási lehetőséget. A folyamat elején, és az egyes gombok mentésekor vagy visszaállításakor az alkalmazás egy TBN_SAVE vagy TBN_RESTORE értesítési kódot kap. A beállítás használatához értesítéskezelőket kell implementálnia az eszköztár állapotának sikeres mentéséhez vagy visszaállításához szükséges bitkép- és állapotinformációk megadásához.
Az eszköztárállapotok olyan adatfolyamba vannak mentve, amely a Shell által definiált adatok blokkokból áll, amelyek az alkalmazás által meghatározott adatok blokkjainak váltakozásával váltakoznak. Minden egyes gombhoz egy adatblokkot tárol a rendszer, valamint egy választható globális adatblokkot, amelyet az alkalmazások a stream elején helyezhetnek el. A mentési folyamat során a TBN_SAVE kezelője hozzáadja az alkalmazás által definiált blokkokat az adatfolyamhoz. A visszaállítási folyamat során a TBN_RESTORE kezelő felolvassa az egyes blokkokat, és megadja a Shellnek az eszköztár rekonstruálásához szükséges információkat.
TBN_SAVE értesítés kezelése
A rendszer a mentési folyamat elején elküldi az első TBN_SAVE értesítési kódot. A gombok mentése előtt a NMTBSAVE struktúrájának tagjai az alábbi táblázatban látható módon vannak beállítva.
| Tag | Beállítás |
|---|---|
| iItem | –1 |
| cbData | A Shell által definiált adatokhoz szükséges memória mennyisége. |
| cButtons | A gombok száma. |
| pData | Az alkalmazás által definiált adatokhoz szükséges memória számított mennyisége. Általában néhány globális adatot, valamint az egyes gombok adatait is belefoglalja. Adja hozzá ezt az értéket a cbData-hez, és foglaljon le elegendő memóriát a pData számára, hogy mindent el tudjon tárolni. |
| pJelenlegi | Az adatfolyam első fel nem használt bájtja. Ha nincs szüksége globális eszköztáradatokra, állítsa be pCurrent = pData, hogy az az adatfolyam kezdetére mutatjon. Ha globális eszköztáradatokra van szüksége, a pDatatárolja, majd visszatérés előtt állítsa pCurrent az adatfolyam nem használt részének elejére. |
Ha globális eszköztáradatokat szeretne hozzáadni, tegye az adatfolyam elejére. Mozgasd előre pCurrent a globális adatok végére úgy, hogy a fel nem használt adatfolyam elejére mutasson, majd térj vissza.
Miután visszatért, a Rendszerhéj megkezdi a gombinformációk mentését. Hozzáadja a Shell által definiált adatokat az első gombhoz pCurrent, majd előrelép pCurrent a fel nem használt rész elejére.
Az egyes gombok mentése után a rendszer egy TBN_SAVE értesítési kódot küld, és NMTBSAVE a következő tagokkal adja vissza.
| Tag | Beállítás |
|---|---|
| iItem | A gombszám nulla alapú indexe. |
| jelenlegi | Az adatfolyam első fel nem használt bájtjának mutatója. Ha további információkat szeretne tárolni a gombról, tárolja azt a pCurrent által kijelölt helyen, és frissítse pCurrent, hogy az adatfolyam első fel nem használt részére mutasson utána. |
| TBBUTTON | Egy TBBUTTON szerkezet, amely leírja a mentett gombot. |
Amikor megkapja az értesítési kódot, ki kell nyernie minden szükséges, a gombhoz kapcsolódó információt TBBUTTON. Ne feledje, hogy gomb hozzáadásakor a TBBUTTONdwData tagját használhatja az alkalmazásspecifikus adatok tárolásához. Töltsd be az adatokat az adatfolyamba pCurrent. Vidd előre a(z) pCurrent a tartalom végéhez úgy, hogy ismét a stream fel nem használt részének elejére mutasson, majd térjen vissza.
A Rendszerhéj ezután a következő gombra lép, hozzáadja az adatait a pData-hez, előrehalad a pCurrent-ra, betölti a TBBUTTON-ot, és újabb TBN_SAVE értesítési kódot küld. Ez a folyamat az összes gomb mentéséig folytatódik.
Mentett eszköztárak visszaállítása
A visszaállítási folyamat alapvetően megfordítja a mentési folyamatot. A kezdetekkor az alkalmazás egy TBN_RESTORE értesítési kódot kap, ahol a NMTBRESTORE struktúra iItem tagja –1-re van állítva. A cbData tag a pDataméretére van beállítva, míg a cButtons a gombok számára van beállítva.
Az értesítéskezelőnek ki kell nyernie a mentés során a pData elején elhelyezett globális információkat, és a pCurrent-t a Shell által definiált adatok első blokkjának kezdetére kell helyeznie. Állítsa cBytesPerRecord a gombadatok mentéséhez használt adatblokkok méretére. Állítsa be a gombok számát a cButtons értékre, majd térjen vissza.
Az NMTBRESTORE a következő az első gombhoz. A pCurrent tag a gombadatok első blokkjának elejére mutat, iItem pedig a gombindexre van állítva. Kinyerje az adatokat, és lépjen tovább pCurrent. Töltse be az adatokat a TBBUTTON-ba, majd térjen vissza. Ha el szeretne kihagyni egy gombot a visszaállított eszköztárból, állítsa az idCommandTBBUTTON tagját nullára. A Rendszerhéj megismétli a fennmaradó gombok folyamatát. Az NMTBSAVEés NMTBRESTORE üzenetekmellett az eszköztárak mentéséhez és visszaállításához is használhat olyan üzeneteket, mint a TBN_RESET.
Az alábbi példakód egy eszköztárat ment a testreszabás előtt, és visszaállítja, ha az alkalmazás TBN_RESET üzenetet kap.
int i;
LPNMHDR lpnmhdr;
static int nResetCount;
static LPTBBUTTON lpSaveButtons;
LPARAM lParam;
switch( lpnmhdr->code)
{
case TBN_BEGINADJUST: // Begin customizing the toolbar.
{
LPTBNOTIFY lpTB = (LPTBNOTIFY)lparam;
// Allocate memory for the button information.
nResetCount = SendMessage(lpTB->hdr.hwndFrom, TB_BUTTONCOUNT, 0, 0);
lpSaveButtons = (LPTBBUTTON)GlobalAlloc(GPTR, sizeof(TBBUTTON) * nResetCount);
// In case the user presses reset, save the current configuration
// so the original toolbar can be restored.
for(i = 0; i < nResetCount; i++)
{
SendMessage(lpTB->hdr.hwndFrom,
TB_GETBUTTON, i,
(LPARAM)(lpSaveButtons + i));
}
}
return TRUE;
case TBN_RESET:
{
LPTBNOTIFY lpTB = (LPTBNOTIFY)lparam;
int nCount, i;
// Remove all of the existing buttons, starting with the last one.
nCount = SendMessage(lpTB->hdr.hwndFrom, TB_BUTTONCOUNT, 0, 0);
for(i = nCount - 1; i >= 0; i--)
{
SendMessage(lpTB->hdr.hwndFrom, TB_DELETEBUTTON, i, 0);
}
SendMessage(lpTB->hdr.hwndFrom, // Restore the saved buttons.
TB_ADDBUTTONS,
(WPARAM)nResetCount,
(LPARAM)lpSaveButtons);
}
return TRUE;
case TBN_ENDADJUST: // Free up the memory you allocated.
GlobalFree((HGLOBAL)lpSaveButtons);
return TRUE;
}
Kapcsolódó témakörök