Элементы управления Windows
Перевод А. И. Легалова
Англоязычный оригинал находится на сервере компании
Reliable Software
Элементы управления могут быть
добавлены к основному окну или к
любому диалоговому окну вашей
программы. Их лучше всего выбрать и
позиционировать, используя
графический редактор ресурсов.
Такой редактор позволяет задавать
символические имена, которые можно
использовать для идентификации
элементов управления.
Большинство средств управления
можно инкапсулировать в объектах,
которые внедрены или в
соответствующий "Контроллер" (Вы
можете иметь отдельные объекты
Controller для каждого диалогового окна
программы), или, для статических
элементов управления, в "Виде".
Объекты - "Контроллеры"
создаются при обработке сообщения
WM_CREATE или, в случае диалоговых окон,
сообщением WM_INITDIALOG. При этом
выполняются конструкторы
элементов управления, внедренных в
эти "Контроллеры".
Базовым классом для большинства
элементов управления является
SimpleControl. Он получает и сохраняет
дескриптор окна специфического
элемента управления. Чтобы
получить этот дескриптор,
необходимо иметь дескриптор
родительского окна и идентификатор
элемента управления.
class SimpleControl
{
public:
SimpleControl (HWND hwndParent, int id)
: _hWnd (GetDlgItem (hwndParent, id))
{}
void SetFocus ()
{
::SetFocus (_hWnd);
}
HWND Hwnd () const { return _hWnd; }
protected:
HWND _hWnd;
};
Ниже представлен пример элемента
управления редактированием.
class Edit: public SimpleControl
{
public:
Edit (HWND hwndParent, int id)
: SimpleControl (hwndParent, id)
{}
void SetString (char* buf)
{
SendMessage (Hwnd (), WM_SETTEXT, 0, (LPARAM) buf);
}
// code is the HIWORD (wParam)
static BOOL IsChanged (int code)
{
return code == EN_CHANGE;
}
int GetLen ()
{
return SendMessage (Hwnd (), WM_GETTEXTLENGTH, 0, 0);
}
void GetString (char* buf, int len)
{
SendMessage (Hwnd (), WM_GETTEXT,
(WPARAM) len, (LPARAM) buf);
}
void Select ()
{
SendMessage (Hwnd (), EM_SETSEL, 0, -1);
}
};
Здесь показано, как элемент
управления редактированим может
использоваться:
class Controller
{
public:
Controller(HWND hwnd);
...
private:
Edit _edit;
char _string [maxLen];
};
Controller::Controller (HWND hwnd)
: _edit (hwnd, IDC_EDIT)
{
_edit.SetFocus ();
...
}
void Controller::Command (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
switch (LOWORD(wParam))
{
case IDC_EDIT:
if (_edit.IsChanged(HIWORD (wParam)))
{
_edit.GetString (_string, maxLen);
}
break;
...
}
}
Далее: Естественно, что
наиболее вероятным местом
использования элемента управления
является диалоговое окно.
|