Классовая обертка для элементов управления

Классовая обертка для элементов управления

Элементы управления 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;

  …

 }

}

Далее: Естественно, что наиболее вероятным местом использования элемента управления является диалоговое окно.