Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с Editом, Проблемы со сменой фона 
:(
    Опции темы
MikeMN
Дата 12.11.2014, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 12.11.2014

Репутация: нет
Всего: нет



Здравствуйте, уважаемые знатоки!
Создаю класс для Editа , однако как не измываюсь, не выходит задать фон не отрисовывающимся.
С WTL работаю впервые и код пишу методом проб и ошибок, так что подскажите, может я сообщения неправильно обрабатываю или как-то иначе нужно задавать фон? Есть мысль положить битмап со скрином происходящего под едитом, но непонятно тогда как это соотнести с WM_CTLCOLORSTATIC, там ведь у функции обработчика возвращаемое значение HBRUSH.
Вот сам класс:
Код

class SSEdit : public CWindowImpl<SSEdit, CEdit>
{
public:
    SSEdit()
    {
        m_cannotReceiveFocus = FALSE;
        m_textColor = GetSysColor(COLOR_WINDOWTEXT);
        m_selection = 0;
    }

    BEGIN_MSG_MAP(CColoredReadOnlyEdit)
        MSG_WM_KEYDOWN(PressedKey)
        MSG_WM_CTLCOLOREDIT(OnCtlColor)
        MSG_WM_CTLCOLORSTATIC(OnCtlColor)
        MSG_WM_SETFOCUS(OnSetFocus)
        MSG_WM_KILLFOCUS(Locking)
        MSG_WM_LBUTTONDOWN(OnLeftButton)
        MSG_WM_LBUTTONDBLCLK(OnLeftButton)
        MSG_WM_ERASEBKGND(Erase)
        DEFAULT_REFLECTION_HANDLER()
    END_MSG_MAP()

    HBRUSH OnCtlColor(CDCHandle dc, CEdit edit)
    {
        SetBkMode(dc, TRANSPARENT);
        SetTextColor(dc, RGB(165, 150, 150));
        return ::GetSysColorBrush(NULL_BRUSH);
        /*dc.SetTextColor(m_textColor);
        int backColorIndex = IsReadOnly() ? TRANSPARENT : TRANSPARENT;
        dc.SetBkColor(::GetSysColor(backColorIndex));
        return ::GetSysColorBrush(backColorIndex);*/
    }
    BOOL Erase(HDC dc)
    {
        return true;
    }
    void Locking(CWindow wndfunc)
    {
        SetCannotReceiveFocus(true);
        SetReadOnly(true);
        //ShowWindow(SW_HIDE);
    }
    LRESULT PressedKey(UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (wParam)
        {
        case VK_ESCAPE:
            ShowWindow(SW_HIDE);
            return 0;
            break;
        default:
            //return CallWindowProc(DefEditProc, hwap, message, wParam, lParam);
            break;
        }
        return false;
    }

    void OnSetFocus(HWND hwndOldFocus)
    {
        if (m_cannotReceiveFocus)
        {
            CWindow parent = GetParent();
            CWindow nextDlgTabItem = parent.GetNextDlgTabItem(m_hWnd);
            if (nextDlgTabItem != hwndOldFocus)
                nextDlgTabItem.SetFocus();
            else
                parent.GetNextDlgTabItem(m_hWnd, TRUE).SetFocus();
            return;
        }
        SetMsgHandled(FALSE);
    }

    // prevent receiving focus when control is (double)clicked with mouse
    void OnLeftButton(UINT nFlags, CPoint point)
    {
        if (!m_cannotReceiveFocus)
            SetMsgHandled(FALSE);
    }
    void SetReadOnly(BOOL readOnly = TRUE)
    {
        if (readOnly == IsReadOnly())
            return;
        if (readOnly == FALSE)
            SetCannotReceiveFocus(FALSE);
        CEdit::SetReadOnly(readOnly);
    }
    BOOL IsReadOnly() const
    {
        return (GetWindowLong(GWL_STYLE) & ES_READONLY) == ES_READONLY;
    }
    void SetCannotReceiveFocus(BOOL cannotReceiveFocus = TRUE)
    {
        if (cannotReceiveFocus == m_cannotReceiveFocus)
            return;
        if (cannotReceiveFocus)
        {
            // control that cannot be focused must be read-only
            SetReadOnly();
            // save and hide selection for the case ES_NOHIDESEL flag is set
            m_selection = GetSel();
            if (GetNoHideSelection())
                SetSelNone(TRUE);
        }
        // restore selection for the case ES_NOHIDESEL flag is set
        else if (GetNoHideSelection())
            SetSel(m_selection, TRUE);
        m_cannotReceiveFocus = cannotReceiveFocus;
    }

    BOOL GetCannotReceiveFocus() const
    {
        return m_cannotReceiveFocus;
    }

private:
    COLORREF m_textColor;
    BOOL m_cannotReceiveFocus;
    DWORD m_selection;
    bool m_contextMenuShownFirstTime;

    BOOL GetNoHideSelection() const
    {
        return GetWindowLong(GWL_STYLE) & ES_NOHIDESEL;
    }
};


Само создание элемента происходит по нажатию клика
Код

editbox.Create(NULL, text, L"", WS_VISIBLE | ES_MULTILINE | WS_POPUP | WS_SIZEBOX);


Кстати по поводу создания. Сайзбокс стоит не просто так, так я смотрел что под ним, а под ним как оказалось создается ровно такой же editbox, в связи с чем это происходит?  Я, кончено, непроходимо глуп, но,кажется это не нормально, что создается 2 экземпляра..

Может я просто мало сплю? Помогите, пожалуйста

Это сообщение отредактировал(а) MikeMN - 12.11.2014, 11:26
PM MAIL   Вверх
MikeMN
Дата 14.11.2014, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 12.11.2014

Репутация: нет
Всего: нет



Удалось сделать фон прозрачным, пустой обработкой WM_PAINTа, где он как я понял запрашивает  ERASE и делает фон прозрачным, однако теперь проблема поменялась, когда текст печатается, буква отрисовывается в editе в черном квадратике, то есть у буквы как бы остался фон. Как бороться с подобным явлениям, подскажите пожалуйста?
PM MAIL   Вверх
Dem_max
Дата 17.11.2014, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 1
Всего: 39



Полностью рисовать EDIT, простыми способами не получится


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
MikeMN
Дата 19.11.2014, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 12.11.2014

Репутация: нет
Всего: нет



Цитата(Dem_max @ 17.11.2014,  16:32)
Полностью рисовать EDIT, простыми способами не получится

А как его можно рисовать? Попросту нет идей, как убрать появляющийся фон у каждой буквы.. Может можно как-то на печати задавать какой-нибудь NULL_BRUSH?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1190 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.