5.2.2002
V tomto článku se zaměříme na další ze standardních ovládacích prvků Windows, kterým je Trackbar Control. Aby byla aplikace používající prvek Trackbar funkční, musíme na jejím začátku - přesněji řečeno před vytvořením okna (nebo více oken) prvku Trackbar použít funkci InitCommonControlsEx podobně jako u dalších prvků obsažených v knihovně comctl32.dll. S tím také souvisí nutnost přidat pro linkování do projektu odpovídající knihovnu comctl32.lib a vložit hlavičkový soubor commctrl.h.// Běžné hlavičkové soubory #include <commctrl.h> // linkeru přidáme knihovnu přímo ve zdrojovém kódu #pragma comment (lib, "comctl32.lib")Ukázkový projekt je aplikace založená na hlavním okně dialogu. V editoru prostředků přidáme na dialog prvek Trackbar, který v okně Toolbox nalezneme pod poněkud matoucím označení Slider Control.
void NastavRozsah(HWND hWnd) { SendDlgItemMessage(hWnd, IDC_TRACKBAR, TBM_SETRANGE, TRUE, MAKELONG(0,30)); SendDlgItemMessage(hWnd, IDC_TRACKBAR, TBM_SETPOS, TRUE, 10); }Pokud povolíme zobrazování značek, máme možnost kromě automatického zobrazení zobrazit vlastní značky v libovolných místech. Systém pak automaticky zobrazí značky počátku a konce. V našem příkladě takto nastavíme dvě vlastní značky na pozice 5 a 25 pomocí funkce TBM_SETTIC.
#define DOLNI_MEZ 5 #define HORNI_MEZ 25 void NastavZnacky(HWND hWnd) { SendDlgItemMessage(hWnd, IDC_TRACKBAR, TBM_SETTIC, 0, (WPARAM)DOLNI_MEZ); SendDlgItemMessage(hWnd, IDC_TRACKBAR, TBM_SETTIC, 0, (WPARAM)HORNI_MEZ); }Mezi základní akce s Trackbarem dále patří programové zjištění aktuálně nastavené polohy a dále okamžitá detekce změny polohy. Touto změnou polohy je zde myšlena změna aktuální hodnoty logické souřadnice která většinou neodpovídá grafickému posunutí jezdce o každý pixel, ale dojde k ní v závislosti na poměru rozsahu a velikosti okna Trackbaru obvykle skokově při posunu o určitý počet pixelů. Logickou souřadnici získáme pomocí zprávy TBM_GETPOS, jak si ukážeme za chvíli v příkladu. Pokud jde o detekci změny souřadnice, musíme zachytávat zprávu WM_HSCROLL v případě horizontálního Trackbaru nebo WM_VSCROLL u svislého Trackbaru. Ukážeme si to na následujícím příkladě. Cílem bude detekovat změnu polohy a v případě že se uživatel dostane mimo rozsah dříve nastavených bodů (pozice 5 a 25) změníme ikonu na dialogu na systémovou ikonu "chyba" (IDI_ERROR). Při opětném návratu do "správných mezí" opět vrátíme ikonu na vlastní ikonu aplikace. Nastavení ikony provedeme pomocí zprávy STM_SETIMAGE prvku static, což je v editoru prostředků prvek Picture Control typu Icon. Navíc při pohybu v zakázané oblasti přehrajeme varovný zvuk - zde pro jednoduchost pomocí funkce MessageBeep. Takto bude tedy vypadat funkce realizující uvedenou kontrolu mezí a procedura dialogu, ze které jsou také volány ostatní výše uvedené funkce.
// Obsluha zprávy WM_HSCROLL void ZmenaPolohy(HWND hWnd) { LRESULT pozice = SendDlgItemMessage(hWnd, IDC_TRACKBAR, TBM_GETPOS, 0, 0); SetDlgItemInt(hWnd, IDC_POLOHA, pozice, FALSE); if ( pozice < DOLNI_MEZ || pozice > HORNI_MEZ ) { if ( g_OK ) { g_OK = FALSE; SendDlgItemMessage(hWnd, IDC_IKONA, STM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIcon(NULL, IDI_ERROR)); } MessageBeep(MB_ICONERROR); } else { if ( !g_OK ) { g_OK = TRUE; SendDlgItemMessage(hWnd, IDC_IKONA, STM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIcon(GetModuleHandle(0), MAKEINTRESOURCE(IDI_HLAVNI))); } } } ///////////////////////////////////////////////////////////////////////////// // Procedura dialogu INT_PTR CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch ( uMsg ) { case WM_COMMAND: switch ( LOWORD(wParam) ) { case IDOK: EndDialog(hWnd, IDOK); break; case IDCANCEL: EndDialog(hWnd, IDCANCEL); break; } break; case WM_INITDIALOG: NastavRozsah(hWnd); NastavZnacky(hWnd); ZmenaPolohy(hWnd); break; case WM_HSCROLL: ZmenaPolohy(hWnd); break; } return FALSE; }Doprovodný projekt je ke stažení zde: win_api_trackbar.zip
Školení
Kontakt
739 219 991
live:radekchalupa_1
Nové články