Využijte možnosti školení a konzultací distanční formou s využitím online komunikace (Skype a další)
case IDC_ZOBRAZ_TEXT: GetDlgItemText(hwndDlg, IDC_EDIT1, chText, 200); SendMessage(g_hwndMain, WM_SETTEXT, 0, (LPARAM)chText); break;To je vše co musíme udělat pro přenesení textu edit-boxu do titulku hlavního okna. Jak je vidět, pro získání textu prvku na dialogu můžeme použít funkci GetDlgItemText:
UINT GetDlgItemText( HWND hDlg, // handle okna dialogu int nIDDlgItem, // identifikátor prvku LPTSTR lpString, // buffer pro text int nMaxCount // maximální počet zkopírovaných znaků );Samozřejmě bychom mohli použít již dříve uvedenou funkci GetWindowText. Pak bychom ale museli získat handle (HWND) prvku (edit-boxu). K získání handle kteréhokoli prvku na dialogu slouží funkce GetDlgItem:
HWND GetDlgItem( HWND hDlg, // handle okna dialogu int nIDDlgItem // identifikátro prvku );Řekněme si ještě o funkci, která nám vrátí číselnou hodnotu (pokud ji lze převést) obsahu prvku dialogu. U edit-boxu je možné a výhodné pro tento případ nastavit v editoru zdrojů vlastnost "Number" odpovídající stylu okna ES_NUMBER. Příslušnou funkcí je pak GetDlgItemInt:
UINT GetDlgItemInt( HWND hDlg, // handle okna dialogu int nIDDlgItem, // identifikátor prvku BOOL *lpTranslated, // indikátor úspešného převodu BOOL bSigned // zda jde o hodnotu se znaménkem );Tato funkce nám vrátí číselnou hodnotu obsahu prvku, pokud má obsah číselný smysl. Úspěšnost převodu je uložena do parametru lpTranslated. Dále si řekneme, jak zjistíme v požadovaném okamžiku stav zaškrtnutí check-boxu. Zde zjistíme, že jednou z nejčastěji používaných funkcí je SendMessage, tedy funkce která pošle zvolenému oknu zprávu, která může sloužit k "ovládání" okna, tedy například nastavení textu, přidání řádku do list-boxu a stovky podobných. Kromě toho tato funkce vrací výsledek zpracování zprávy v příslušném okně. Mnoho zpráv je totiž dotazovacích, kterými požadujeme od cílového okna nějakou informaci, například právě stav zaškrtnutí check-boxu. V dialogových oknem můžeme místo SendMessage použít funkci SendDlgItemMessage:
LRESULT SendDlgItemMessage( HWND hDlg, // handle okna dialogu int nIDDlgItem, // identifikátor prvku UINT Msg, // kód zprávy WPARAM wParam, // 1. parametr zprávy LPARAM lParam // 2. parametr );V této funkci nemusíme uvádět handle okna, ale místi toho identifikátor prvku dialogu a systém si handle zjistí sám. Je to obdobná jako u vztahu funkcí GetWindowText a GetDlgItemText. V případě zjištení stavu check-boxu použijeme zprávu BM_GETCHECK. Identifikátor zprávy začíná na "BM", což je ze slov "button message". Znamená to, že check-box je prvek třídy "BUTTON". Návratová hodnota zprávy (tedy to co nám vrátí funkce SendMessage nebo SendDlgItemMessage) pak může být jednou ze 3 hodnot:
case IDC_EDIT1: if ( HIWORD(wParam) == EN_CHANGE ) { if ( SendDlgItemMessage(hwndDlg, IDC_SLEDOVAT, BM_GETCHECK, 0,0) == BST_CHECKED ) { GetDlgItemText(hwndDlg, IDC_EDIT1, chText, 200); SetDlgItemText(hwndDlg, IDC_KOPIE, chText); } } break;Výsledek "v akci" vidíte na následujícím obrázku: Ještě si můžeme nastavit výchozí stav check-boxu na zaškrtnutý v handleru zmíněné zprávy WM_INITDIALOG:
case WM_INITDIALOG: SendDlgItemMessage(hwndDlg, IDC_SLEDOVAT, BM_SETCHECK, BST_CHECKED, 0); break;Tolik pro toto pokračování a příště se samozřejmě budeme prvkům na dialogu dále věnovat, neboť jde o základní část většiny programů, tedy uživatelské rozhraní. Doprovodný projekt (Visual C++ 6) je ke stažení zde: win_api_13.zip
Máte připomínku, dotaz nebo komentář k článku a souvisejícími tématy?
Copyright © 2021 Radek Chalupa