SoftCraft
разноликое программирование

Top.Mail.Ru

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


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

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