|
Windows API (dříve Win32 API) skrývá mnoho funkcí, které přesto, že jsou více či
méně zdokumentované v SDK, nejsou programátory z různých důvodů používány.
Jedním z důvodů může být složité používání nebo jejich neexistence v dřívějších
verzích Windows. Přesto po překonání počáteční nedůvěry je jejich použití často
efektivnější a rychlejší než vymýšlení vlastních řešení. V následujícím textu si
představíme několik funkcí (přesněji řečeno dvě funkce a jedno rozhraní), které
rozšiřují množinu standardních dialogových oken.
PickIconDlg
|
Tato funkce se v dokumentaci objevila poté, co Microsoft prohrál soudní spor,
který proti němu vedla vláda Spojených států. V této podobě ji můžeme používat
od Windows 2000, přestože se nachází i v dřívějších verzích. Projekt na
konci článku obsahuje kód, který umožní použít tuto funkci i na Windows
95/98/Me. Funkce zobrazí
dialog pro výběr ikony, tak jak jej můžeme vidět např. při změně ikony zástupce. |
Zobrazit deklaraci v C |
Funkce je přeložena v knihovně shell32.dll,
knihovna pro import je shell32.lib a deklarace se nachází v hlavičkovém
souboru shlobj.h:
BOOL WINAPI PickIconDlg(HWND hwnd, LPWSTR pszIconPath, UINT cchIconPath,
int *piIconIndex);
|
Zobrazit deklaraci pro Delphi |
Deklarace pro Delphi, jak je uvedena v unit SecretDlgs.pas
(k stáhnutí na konci článku):
function PickIconDlg(hwnd: THandle; pszIconPath: PWideChar;
cchIconPath: Cardinal; var piIconIndex: Integer): LongBool;
stdcall; external 'shell32.dll';
|
hwnd
Handle rodičovského okna.
pszIconPath
Buffer Unicode znaků. Řetězec na začátku obsahuje cestu k předvolenému souboru
s ikonami. Pokud uživatel vybere jiný soubor je po skončení funkce v bufferu
uložena cesta k němu. cchIconPath Velikost bufferu. piIconIndex
Na začátku obsahuje index předvolené ikony, po skončení funkce je zde index nově
vybrané ikony.
Návratová hodnota je 0 /False , pokud uživatel stiskl tlačítko Storno.
IProgressDialog
|
Trendem moderního programování je objektový přístup, proto i ve Windows
nalezneme většinu funkcí už jen ve formě různých objektů a rozhraní. Rozhraní
pro zobrazení průběhu zdlouhavé operace IProgressDialog bylo představeno ve
Windows 2000 a Windows Me. Umožňuje použití vlastní animace reprezentující
probíhající akci a odhadnout čas do konce operace. |
Zobrazit deklaraci v C |
Seznam metod rozhraní IProgressDialog. Deklarace je v hlavičkovém souboru
shlobj.h.
HRESULT IProgressDialog::StartProgressDialog(HWND hwndParent,
IUnknown *punkEnableModless, DWORD dwFlags, LPCVOID pvReserved);
HRESULT IProgressDialog::StopProgressDialog(VOID);
HRESULT IProgressDialog::SetTitle(LPCWSTR pwzTitle);
HRESULT IProgressDialog::SetAnimation(HINSTANCE hInstAnimation,
UINT idAnimation);
BOOL IProgressDialog::HasUserCancelled(VOID);
HRESULT IProgressDialog::SetProgress(DWORD dwCompleted,
DWORD dwTotal);
HRESULT IProgressDialog::SetProgress64(ULONGLONG ullCompleted,
ULONGLONG ullTotal);
HRESULT IProgressDialog::SetLine(DWORD dwLineNum, LPCWSTR pwzString,
BOOL fCompactPath, LPCVOID pvReserved);
HRESULT IProgressDialog::SetCancelMsg(LPCWSTR pwzCancelMsg,
LPCVOID pvReserved);
HRESULT IProgressDialog::Timer(DWORD dwTimerAction,
LPCVOID pvReserved);
|
Zobrazit deklaraci pro Delphi |
Deklarace rozhraní IProgressDialog
z unit SecretDlgs.pas:IProgressDialog = interface(IUnknown)
function StartProgressDialog(hwndParent: THandle;
punkEnableModless: IUnknown; dwFlags: Cardinal;
pvReserved: Pointer): HResult; stdcall;
function StopProgressDialog: HResult; stdcall;
function SetTitle(pwzTitle: PWideChar): HResult;
stdcall;
function SetAnimation(hInstAnimation: THandle;
idAnimation: Cardinal): HResult; stdcall;
function HasUserCancelled: LongBool; stdcall;
function SetProgress(dwCompleted,
dwTotal: Cardinal): HResult; stdcall;
function SetProgress64(ullCompleted,
ullTotal: Int64): HResult; stdcall;
function SetLine(dwLine: Cardinal; pwzString: PWideChar;
fCompactPath: LongBool; pvReserved: Pointer): HResult;
stdcall;
function SetCancelMsg(pwzCancelMsg: PWideChar;
pvReserved: Pointer): HResult; stdcall;
function Timer(dwTimerAction: Cardinal;
pvReserved: Pointer): HResult; stdcall;
end;
|
Před samotným zobrazením je
třeba nejdříve nastavit titulek (metoda SetTitle ) a animaci -
SetAnimation :
hInstAnimationHandle modulu, který obsahuje žádanou animaci jako resource.
idAnimationIdentifikátor videoklipu ve formátu AVI. Animace by neměla být větší
než 272×60 pixelů, nesmí obsahovat zvuky a musí být nekomprimovaná nebo
komprimovaná metodou RLE8.Nejzajímavější metodou je StartProgressDialog , která
zobrazí dialogový box: hwndParentHandle rodičovského okna.punkEnableModless,
pvReservedParametry, které nejsou zmíněny a všechna tajemná "rezervovaná" pole
musí být nastavena na 0 nebo
NULL /nil .
dwFlagsKombinace následujích hodnot:
PROGDLG_MODAL |
Dialog bude modální vůči oknu specifikovanému
parametrem hwndParent . |
PROGDLG_AUTOTIME |
Automaticky odhadne čas do konce operace. V tomto
případě nelze použít třetí informační řádek (viz metoda SetLine ). |
PROGDLG_NOTIME |
Třetí informační řádek nebude zobrazen. |
PROGDLG_NOMINIMIZE |
Dialog bez tlačítka minimalizace. |
PROGDLG_NOPROGRESSBAR |
Bez indikátoru průběhu. |
Poté můžeme nastavit texty informačních řádků metodou SetLine :
dwLineČíslo
informačního řádku, jehož text chceme nastavit - 1, 2 nebo 3. Pokud je nastaven
příznak PROGDLG_AUTOTIME , lze použít jen řádky 1 a 2, protože na třetím řádku se
odpočítává čas do konce akce (pokud nebyl současně nastaven příznak
PROGDLG_NOTIME ).pwzStringText řádku.fCompactPathPokud je text řádku delší
než šířka dialogu, bude zkrácen a doplněn výpustkou jestliže nastavíte tuto
hodnotu na TRUE .V průběhu operace je třeba opakovaně volat metodu
SetProgress
(případně 64-bitovou variantu SetProgress64 ) aby došlo k aktualizaci indikátoru
průběhu. Pokud je nastaven příznak PROGDLG_AUTOTIME , je navíc na základě
časového intervalu mezi StartProgressDialog a prvním voláním
SetProgress
vypočítán čas do konce operace. Metoda má dva parametry - první udává kolik již
bylo provedeno a druhý udává z kolika. Při každém kroku je vhodné zkontrolovat,
zda uživatel mezitím nestiskl tlačítko Storno. Jestliže metoda
HasUserCancelled
vrátí TRUE , stiskl uživatel tlačítko a operace by měla být co nejrychleji
ukončena. Metodou SetCancelMsg můžeme nastavit zprávu, která se zobrazí na třetím řádku mezitím
co dokončujeme akci poté, co byla uživatelem přerušena. Ať už byla operace
dokončena úspěšně či přerušena uživatelem je vždy nutné zavřít dialogové okno
metodou StopProgressDialog . Poslední metodou, o které nebyla zmínka, je metoda
Timer . Voláním s parametrem PDTIMER_RESET vynuluje časovač a výpočet zbývajícího
času bude proveden od začátku.
RunFileDlg
|
Na konec jsem si nechal funkci,
která není popsána v žádné oficiální dokumentaci a tedy jejíž použití je bez
záruky v dalších verzích Windows. Jejím použitím můžeme vyvolat dialog pro
spuštění aplikace stejný jako po klepnutí na tlačítko Start-Spustit? Funkce
umožňuje změnit ikonu zobrazenou v boxu a nastavit některé další parametry. Po
stisknutí tlačítka OK můžeme v reakci na zaslanou zprávu zrušit spuštění
programu. Funkce je přeložena v knihovně shell32.dll pod ordinálním číslem 61.
Na Windows 9x/Me se nachází v Ansi verzi a ve Windows NT/2000/XP najdeme její
Unicode variantu. Funkce nemá žádnou návratovou hodnotu. V unit SecretDlgs.pas je
přidána návratová hodnota, která je nulová, pokud se nepodaří zjistit vstupní
bod této funkce. |
Zobrazit deklaraci v C |
VOID WINAPI RunFileDlg(HWND hwnd, HICON hIcon, LPCTSTR lpszDirectory,
LPCTSTR lpszTitle, LPCTSTR lpszDescription, DWORD dwFlags);
|
Zobrazit deklaraci pro Delphi |
Deklarace pro Delphi, jak je uvedena v unit SecretDlgs.pas
(k stáhnutí na konci článku):
function RunFileDialog(hwnd: HWND; hIcon: HICON;
Directory, Title, Description: string; dwFlags: Cardinal): Boolean;
|
hwndHandle rodičovského
okna.hIconHandle ikony, která se zobrazí v dialogovém okně. Pokud je
NULL /0
použije se standardní ikona.(lpsz)DirectoryAdresář, který se nabídne jako
první pro výběr po stisknutí tlačítka Procházet.(lpsz)TitleTitulek okna.
(lpsz)DescriptionPopis, který se zobrazí vedle ikony. Neměl by být delší než
128 znaků (2 řádky), jinak bude oříznut.dwFlagsKombinace následujících hodnot:
RFF_CALCDIRECTORY |
Pracovní adresář aplikace se určí
na základě cesty k souboru. |
RFF_NOBROWSE |
Nezobrazí tlačítko Procházet. |
RFF_NODEFAULT |
Po zobrazení dialogu nebude
vybrána naposled spuštěná aplikace. |
RFF_NOLABEL |
Nezobrazí text Otevřít: vedle
edit boxu. |
Poté, co uživatel stiskne tlačítko OK, můžeme v reakci na
zprávu WM_NOTIFY s kódem
RFN_VALIDATE ovlivnit další chování
dialogového okna.
Zobrazit deklaraci v C |
typedef struct tagNMRUNFILEDLG {
NMHDR hdr;
LPCTSTR lpszFile;
LPCTSTR lpszDirectory;
int nShow;
} NMRUNFILEDLG, *LPNMRUNFILEDLG;
|
Zobrazit deklaraci pro Delphi |
Deklarace pro Delphi, jak je uvedena v unit SecretDlgs.pas
(k stáhnutí na konci článku):
TNMRunFileDlg = packed record
hdr: TNMHdr;
lpszFile: PChar;
lpszDirectory: PChar;
nShow: Integer;
end;
PNMRunFileDlg = ^TNMRunFileDlg;
|
Parametr lParam zprávy jako ukazatel na Ansi verzi ve Windows 9x/Me nebo
Unicode verzi struktury NMRUNFILEDLG / TNMRunFileDlg ve Windows NT/2000/XP
ukazuje na datovou skrukturu obsahující informace o vybrané aplikaci.
Nejdůležitější je položka lpszFile , která obsahuje text z editačního pole.
Návratová hodnota zprávy může být některá z následujících hodnot:
RF_OK |
Aplikace bude spuštěna. |
RF_CANCEL |
Zavře dialog bez spuštění programu. |
RF_RETRY |
Aplikace nebude spuštěna, ale dialogové okno zůstane zobrazeno. |
Download
Stáhnout projekt pro Delphi 5 (19 KB)
Stáhnout ukázkovou aplikaci (189 KB)
Odkazy
Undocumented Windows 95: Shell Common Dialogs
The RunFileDlg - Documented and Undocumented Way
|