Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как сделать Edit Box - Read Only, не меняя цвет


Автор: bugmenot 2.9.2006, 21:47
Как сделать Edit Box - Read Only, не меняя его цвет на серый?

Спс

Автор: Fixin 2.9.2006, 22:01
ну... (возможно так) субклассь едит и при попытке ввода возвращай пустое значение.

Добавлено @ 22:08 
Цитата(GremlinProg @  2.9.2006,  22:01 Найти цитируемый пост)
EDIT изначально и не устанавливает его серым
Верно, это дисейбл "засеряет".

Автор: GremlinProg 2.9.2006, 22:01
EDIT изначально и не устанавливает его серым. Добавь стиль ES_READONLY при создании едита.

Автор: GremlinProg 2.9.2006, 22:31
нужно обработать WM_CTLCOLORSTATIC, только нужно проверить, для какого контрола меняем цвет:
Код

    case WM_CTLCOLORSTATIC:
        return(LRESULT)GetSysColorBrush(COLOR_WINDOW);


Автор: Fixin 2.9.2006, 23:00
Цитата(GremlinProg @  2.9.2006,  22:31 Найти цитируемый пост)
нужно обработать WM_CTLCOLORSTATIC
Зачем?

Автор: GremlinProg 2.9.2006, 23:16
это уведомление посылается родительскому окну, когда необходимо получить кисть для закраски заднего фона, либо настроить HDC перед прорисовкой контрола. Конечно, по умолчанию, EDIT не ставит цвет серый на readonly, это происходит только в диалоговых шаблонах, поэтому выход через WM_CTLCOLORSTATIC:
Цитата

Read-only or disabled edit controls do not send the WM_CTLCOLOREDIT message; instead, they send the WM_CTLCOLORSTATIC message.

Автор: Fixin 3.9.2006, 18:20
Цитата(GremlinProg @  2.9.2006,  23:16 Найти цитируемый пост)
 в диалоговых шаблонах
не учел.

Автор: bugmenot 3.9.2006, 18:50
Цитата(GremlinProg @ 2.9.2006,  22:31)
нужно обработать WM_CTLCOLORSTATIC, только нужно проверить, для какого контрола меняем цвет:
Код

    case WM_CTLCOLORSTATIC:
        return(LRESULT)GetSysColorBrush(COLOR_WINDOW);

Не помогло
Может я чето не так делаю...

Я создаю окно с DialogBoxParamA, в ресурсах Edit Box уже Read Only, и код у меня выглядит гдето так:
Код

LRESULT CALLBACK MainDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_COMMAND:
            if(LOWORD(wParam)==IDC_EDITBOX && HIWORD(wParam)==WM_CTLCOLORSTATIC)
                return (LRESULT)GetSysColorBrush(COLOR_WINDOW);
            break;

        default:
            return false;
    }
    return 0;
}

Автор: GremlinProg 3.9.2006, 19:53
Ну, почти так )
Код

LRESULT CALLBACK MainDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {

        case WM_CTLCOLORSTATIC:
            if(GetDlgCtrlID((HWND)lParam)==IDC_EDITBOX)
                return (LRESULT)GetSysColorBrush(COLOR_WINDOW);
            break;

        default:
            return false;
    }
    return 0;
}

Автор: bugmenot 3.9.2006, 19:59
Работает! =)

Большое спасибо, GremlinProg

Автор: Rickert 4.9.2006, 18:06
Можно ловить OnKeyDown и оставить его пустым.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)