Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 39

vc++ Цвет эдитов

30.01.2013, 02:14. Показов 1401. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, коллеги!
Скажу сразу, в теме только начал разбираться, потому если вопрос дилетантский, простите, не со зла.
Стоит задача: создать несколько эдитов, задать им некий цвет, причем эдит, активный в данный момент (тот, на котором фокус?) должен быть выделен другим цветом.
Что было сделано.
1. Прописал в дефайнах все IDC_MYEDIT...
2. Сделал сабклассинг от CEdit, переопределил в нем карту сообщений (нужна реакция на tab)
3. В CMainWnd прописал Message_Map, в нем - OnCtlColor, где по GetDlgCtrlID "раскрасил" все мои эдиты
В итоге все работает, но... При выборе любого эдита он послушно перекрашивается с желтого на красный, но эдит, который ПЕРЕСТАЛ быть активным тоже остается красным... А должен был бы вернуться в желтое...
Голову сломал (рекомендации "гуглите" или "MSDN`те от лукавого, потому как это уже было сделано!).
Понимаю, что ответ где-то на поверхности, но найти не смог.
Буду благодарен за помощь!
P.S. Если важно, студия 2010 EN SP1, Win8 x64
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.01.2013, 02:14
Ответы с готовыми решениями:

Суммирование чисел из эдитов...
я имею два едита и кнопку , после того как я ввожу в первый едит два числа , у меня прибавляются цифры . А мне надо что бы я вводил...

StringGrid и имена эдитов
Есть форма1 на ней несколько эдитов, у обоих эдитов в OnCLICK прописано открытие формы2. На форме2 StringGrid с записями. При двойном клике...

проверка эдитов на пустоту
здраствуйте подскажите пожалуйста,как произвести проверку по всем эдитам на форме.заранее спасибо

16
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
30.01.2013, 07:42
Цитата Сообщение от SwanSONG Посмотреть сообщение
Прописал в дефайнах все IDC_MYEDIT...
они должны быть разными
Цитата Сообщение от SwanSONG Посмотреть сообщение
Сделал сабклассинг от CEdit, переопределил в нем карту сообщений (нужна реакция на tab)
тебе нужны два сообщения
делаешь красным
WM_SETFOCUS
http://vsokovikov.narod.ru/New... tfocus.htm
делаешь желтым
WM_KILLFOCUS
http://vsokovikov.narod.ru/New... lfocus.htm

Добавлено через 1 минуту
Цитата Сообщение от SwanSONG Посмотреть сообщение
Сделал сабклассинг от CEdit,
введи в нем переменную цвет окна

Добавлено через 59 минут
на тебе класс
ValEdit.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#pragma once
 
 
// CValEdit
 
class CValEdit : public CEdit
{
    DECLARE_DYNAMIC(CValEdit)
 
public:
    CValEdit();
    virtual ~CValEdit();
 
protected:
    DECLARE_MESSAGE_MAP()
 
protected:
    COLORREF colorBk;
    CBrush brBk;
 
public:
    
    afx_msg void OnSetFocus(CWnd* pOldWnd);
    afx_msg void OnKillFocus(CWnd* pNewWnd);
    afx_msg HBRUSH CtlColor(CDC* pDC, UINT /*nCtlColor*/);
};


ValEdit.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// ValEdit.cpp: файл реализации
//
 
#include "stdafx.h"
#include "MyClassMFC.h"
#include "ValEdit.h"
 
 
// ValEdit
 
IMPLEMENT_DYNAMIC(CValEdit, CEdit)
 
CValEdit::CValEdit()
{
  colorBk=RGB(255,255,0);
}
 
CValEdit::~CValEdit()
{
}
 
 
BEGIN_MESSAGE_MAP(CValEdit, CEdit)
    ON_WM_SETFOCUS()
    ON_WM_KILLFOCUS()
    ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()
 
 
 
// обработчики сообщений ValEdit
 
 
 
void CValEdit::OnSetFocus(CWnd* pOldWnd)
{
    CEdit::OnSetFocus(pOldWnd);
    colorBk=RGB(255,0,0);
    // TODO: добавьте свой код обработчика сообщений
}
 
void CValEdit::OnKillFocus(CWnd* pNewWnd)
{
    CEdit::OnKillFocus(pNewWnd);
     colorBk=RGB(255,255,0);
    // TODO: добавьте свой код обработчика сообщений
}
 
 
HBRUSH CValEdit::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
{
    pDC->SetBkMode(TRANSPARENT);
    brBk.DeleteObject();
    brBk.CreateSolidBrush(colorBk);
    return(HBRUSH)brBk;
 }
2
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 39
30.01.2013, 18:04  [ТС]
Спасибо за участие.
Видать, туповат стал на старости лет - что-то не получается именно желаемое. При выборе одного из контролов мышкой он становится красным (т.е. WM_SET_FOCUS отрабатывает), но тот, с которого был перенесен фокус, тоже остается красным. Причем событие отлавливается (если ставлю в KILL_FOCUS afx_message, оно выскакивает дважды), но цвет не меняется. Что я не так делаю?

CMyEdit.h
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
#include "afxwin.h"
 
class CMyEdit:public CEdit
{
    DECLARE_DYNAMIC(CMyEdit)
 
public:
    CMyEdit();
    virtual ~CMyEdit();
 
    afx_msg void OnSetFocus(CWnd *pOldWnd);
    afx_msg void OnKillFocus(CWnd *pNewWnd);
    afx_msg HBRUSH CtlColor(CDC *pDC, UINT nCtlColor);
 
    CBrush MyBrush0;
 
protected:
    COLORREF colorBk;
    CBrush brBk;
 
    DECLARE_MESSAGE_MAP()
};


CMyEdit.cpp
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "afxwin.h"
 
#include "CMyEdit.h"
#include "CMainWnd.h"
 
IMPLEMENT_DYNAMIC(CMyEdit, CEdit)
 
CMyEdit::CMyEdit()
{
    colorBk=RGB(247,242,156);
}
 
CMyEdit::~CMyEdit()
{}
 
BEGIN_MESSAGE_MAP(CMyEdit,CEdit)
    ON_WM_SETFOCUS()
    ON_WM_KILLFOCUS()
    ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()
 
void CMyEdit::OnSetFocus(CWnd *pNewWnd)
{
    CEdit::OnSetFocus(pNewWnd);
    colorBk=RGB(232,156,166);
}
 
void CMyEdit::OnKillFocus(CWnd *pOldWnd)
{
    CEdit::OnKillFocus(pOldWnd);
    colorBk=RGB(247,242,156);
}
 
HBRUSH CMyEdit::CtlColor(CDC *pDC, UINT nCtlColor)
{
    pDC->SetTextColor(RGB(0,0,0));
    pDC->SetBkMode(TRANSPARENT);
    brBk.DeleteObject();
    brBk.CreateSolidBrush(colorBk);
    return(HBRUSH)brBk;
}


Если нужно, ссылка на все *.h и *.cpp проекта:
http://rghost.ru/43421922
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
30.01.2013, 19:08
С классом CMyEdit все в порядке
но мне не нравится твой CMainWnd
во первых выделяешь память а не удаляешь
во вторых в конструкторе нельзя создавать окна
конструктор не возвращает значения и если ты не удачно создал окно то не сможешь сообщить программе о неудаче

не зря в MFC разделен конструктор и Create

в третьих не зарегистрирован класс окна

Create(NULL,_T("Детерминант матрицы"),....
начни все заново
создай проект при помощи волшебника создай одноконный без поддержки документ/вид
а лучше вообще диалог

Добавлено через 2 минуты
Цитата Сообщение от SwanSONG Посмотреть сообщение
При выборе одного из контролов мышкой он становится красным (т.е. WM_SET_FOCUS отрабатывает), но тот, с которого был перенесен фокус, тоже остается красным.
если свернуть развернуть окно будет желтым?
0
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 39
30.01.2013, 19:40  [ТС]
Красным выделены несколько ячеек. Курсор (и фокус) в одной из них.
Когда сворачиваю и разворачиваю окно, фокус исчезает и все ячейки - желтые.
Спасибо за замечания, но я только начинаю грызть гранит науки, и подозреваю, не все так кошерно, как хотелось бы. Костяк брался с сайта firststep.ru
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
30.01.2013, 20:10
Цитата Сообщение от SwanSONG Посмотреть сообщение
Когда сворачиваю и разворачиваю окно, фокус исчезает и все ячейки - желтые.
все правильно фокус теряется
тебе не приходит ON_WM_CTLCOLOR_REFLECT()
что то не ладно с майном
еще раз попробуй создать волшебником(wizard) и посмотри как он сгенерирует файлы

Добавлено через 2 минуты
самое тупое что могу предложить это добавить в конец OnKillFocus
Invalidate();
0
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 39
30.01.2013, 20:16  [ТС]
Заметил вот что.
Когда для проверки в KillFocus ставлю afx_message, то сообщение выскакивает дважды.
Я боюсь, что на визард у меня таланта не хватит.
И еще - в мэйне стоял раньше OnCtlColor, а в CMyEdit - перехватчик нажатия таба, и там было SetFocus
Я закоментил, но мало ли....
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
30.01.2013, 20:50
Цитата Сообщение от SwanSONG Посмотреть сообщение
Я боюсь, что на визард у меня таланта не хватит.
Не так страшен черт, как его малютка
меню файл
создать проект
выбрать MFC проект
в появившемся окне нажать далее
выбрать тип проекта
выбираешь SDI галочку на поддержка документ/вид снять
можешь нажать готово
все проект готов
нажимаешь на запустить и любуешься окном
когда налюбовался закрываешь и начинаешь в МайнФрейм запихивать что тебе надо
0
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 39
31.01.2013, 16:33  [ТС]
Я человек старый и ленивый :-)))))
А если серьезно, понять, почему не работает то, что должно работать
В любом случае, спасибо за помощь - пинок в нужном направлении Вашими молитвами сделан.
Через полчасика попробую с Invalidate
О результатах отпишусь

Добавлено через 1 минуту
Странно, что SetFocus отлавливается замечательно, а вот Kill - нет :-((((

Добавлено через 10 минут
И нельзя ли Kill_Focus и Set_Focus вызывать из MainWnd?

Добавлено через 26 минут
УРРРРРРРЯ!!!
Invalidate() в конце KILL_FOCUS спас, все работает как часы!!!
Огромное спасибо и искрений поклон!

Добавлено через 18 часов 58 минут
Последнее, не подскажите, можно ли как-то таким методом покрасить не все эдиты? К примеру, эдит с ID 10 чтоб был другим цветом?
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
31.01.2013, 18:10
Цитата Сообщение от SwanSONG Посмотреть сообщение
К примеру, эдит с ID 10 чтоб был другим цветом?
сделай для него другой класс

Добавлено через 4 минуты
Цитата Сообщение от SwanSONG Посмотреть сообщение
class CMyEdit:
в классе добавь две переменные
C++
1
2
COLORREF ColorFocus;
COLORREF ColorNoFOcus;
сделай их публичными
и при создании контрола задавай цвет
а потом сделай так
C++
1
2
3
4
5
6
7
8
9
10
11
void CMyEdit::OnSetFocus(CWnd *pNewWnd)
{
CEdit::OnSetFocus(pNewWnd);
colorBk=ColorFocus;
}
 
void CMyEdit::OnKillFocus(CWnd *pOldWnd)
{
CEdit::OnKillFocus(pOldWnd);
colorBk=RGB(247,242,156);
}
0
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 39
31.01.2013, 22:15  [ТС]
О другом классе и подумал изначально.
Сначала взыграла жадность (зачем плодить классы), а потом вспомнил, что нам говорили на курсах (препод - умница) - все, что можно выделить в отдельный класс - выделяйте. Работает!
Искреннее спасибо, Вы РЕАЛЬНО помогаете людям
Я Ваш должник!
P.S. Тему можно считать закрытой, дальше буду плыть сам.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
31.01.2013, 22:53
Цитата Сообщение от SwanSONG Посмотреть сообщение
О другом классе и подумал изначально.
я пошутил (смайлик видел)
читай что я добавил
поправь свой класс
добавь две переменные цвет фокуса и цвет нет фокуса
и при создании контролов присвой им значения
тогда хоть сто едитов будут иметь свой цвет( и все один класс)

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
void CMyEdit::OnKillFocus(CWnd *pOldWnd)
{
CEdit::OnKillFocus(pOldWnd);
colorBk=RGB(247,242,156);
}
извини не заметил старый код привел
вот так правильно
C++
1
2
3
4
5
6
7
8
9
10
11
void CMyEdit::OnSetFocus(CWnd *pNewWnd)
{
CEdit::OnSetFocus(pNewWnd);
colorBk=ColorFocus;
}
 
void CMyEdit::OnKillFocus(CWnd *pOldWnd)
{
CEdit::OnKillFocus(pOldWnd);
colorBk=ColorNoFOcus;
}
0
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 39
31.01.2013, 23:01  [ТС]
"при создании контролов присвой им значения"

Имеется ввиду, что-то типа:
c11=new CMyEdit(247,242,156)?

А в конструкторе CMyEdit прописать:
CMyEdit::CMyEdit(int t1,int t2,int t3)
{
colorBk=RGB(t1,t2,t3);
}
Так?
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
31.01.2013, 23:06
Цитата Сообщение от SwanSONG Посмотреть сообщение
Так?
нет
примерно так
C++
1
2
3
c11=new CMyEdit;
c11->ColorFocus=RGB(100,100,255);
c11->ColorNoFOcusRGB(100,255,100);
0
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 39
01.02.2013, 00:48  [ТС]
Да, Ваша схема много проще моей
Я еще не до конца "проникся" философией C++
Но еще не все потеряно, урок понял

Добавлено через 1 час 39 минут
Получилось, но есть тонкость.
Сделал, как Вы посоветовали, но при создании c11 берется один цвет, который указывается в конструкторе. И что делать, если одни эдиты ИЗНАЧАЛЬНО должны быть желтыми, а другие - красными (когда события с фокусом еще не наступили) - неясно.
Может быть передавать в конструктор индекс
c11=new CMyEdit(1)
а потом в конструкторе анализировать? Но тогда ведь можно и ColorFocus/ColorNoFocus можно присваивать там же...
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
01.02.2013, 00:56
можно и через конструктор
C++
1
2
3
4
5
6
CMyEdit::CMyEdit(COLORREF col1,COLORREF col2)
{
  ColorFocus=col1;
  ColorNoFOcus=col2;
  colorBk=ColorNoFOcus;
}
создавать так
C++
1
c11=new CMyEdit(RGB(127,127,255),RGB(127,255,127));
но я бы создал отдельную функцию установки цвета
тогда цвета можешь по ходу программы менять
C++
1
2
3
4
5
6
CMyEdit::SetColor(COLORREF col1,COLORREF col2)
{
  ColorFocus=col1;
  ColorNoFOcus=col2;
  colorBk=ColorNoFOcus;
}
создавать так
C++
1
2
c11=new CMyEdit;
c11->SetColor(RGB(127,127,255),RGB(127,255,127))
0
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 39
01.02.2013, 02:23  [ТС]
Теперь все работает.
Прописал в хедэре CMainWnd:
COLORREF z1,z2;
в конструкторе его же
z1=RGB(232,156,166);z2=RGB(247,242,156);
и при создании эдита просто пишу
cTitul=new CMyEdit(z1,z1);

Единственное, что осталось чуть-чуть недоделанное, это реакция при нажатии на tab.
Вот код:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void CMyEdit::OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags) 
{
    if(nChar==VK_TAB)
    {
        int id_source,id_x,id_y,id_size;
        
        CMainWnd *pDlg = (CMainWnd*) GetParent();
 
        id_source = GetDlgCtrlID();
        id_size=pDlg->nSize;
        id_x=(id_source-100)/7+1;   //строка
        id_y=(id_source-100)%7+1;   //столбец
                
        if(id_y<id_size)
            id_y++;
        else
        {
            if((id_x==id_size)&&(id_y==id_size))
            {
                id_x=1;
                id_y=1;
            }
            if(id_y==id_size)
            {
                id_x++;
                id_y=1;
            }
        }
 
        id_source=(id_x-1)*7+id_y+99;
        pDlg->GetDlgItem(id_source)->SetFocus();
        return;
    }
    CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}


Фокус переходит с ячейки на ячейку, но подсветки красным нет, она появляется при нажатии на любую кнопку. Если это поправимо без потери крови, буду рад совету. Нет - ну и Бог с ним, так тоже можно оставить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.02.2013, 02:23
Помогаю со студенческими работами здесь

Заполнить DBNavigator из эдитов
Есть такая штука как DBNavigator1. Мне нужно загнать информацию в таблицу и сделать это красиво. Есть 6 столбиков и соответственно 6 Edit....

Динамический вывод эдитов
var MyEdits: array of TEdit; procedure TForm1.Button1Click(Sender: TObject); var i,j,k,m: Integer; begin ...

Работа с Динамическим массивом эдитов
Доброго времени суток! Подскажите в таком вопросе: На форме есть memo и buton, в memo мы вводим число нажимаем на buton и создаются...

как посчитать сумму из эдитов
здравствуйте! я в этом деле нуб, но срочно нужно решить задачку...Есть 6 эдитов, в них пишутся только цифры, кнопка &quot;посчитать&quot;,...

Бесконечное кол-во скролящихся эдитов :)
Так и не смог разобраться с таблицами :) Но пришла другая мыслю запихать на форму 4 эдита и кнопку добавить строку в результате которой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru