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

Перерисовка Edit control, смена фона на другой цвет (MFC)

09.12.2013, 10:43. Показов 10643. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые Дамы и Господа.
Задаю вам вопрос, так как сам уже перегугли и перепробывал всё что мог, чтобы победить данную проблему.

Цель, в данном окошке которое прикреплено (состоящее из 6-ти Edit control), настроить поля так, чтобы при вводе значение, которое не удоолетворяет в данный момент значения из других полей, перекрашивать его в другой цвет(например красный- цвет ошибки)
и если другие поля тоже не удолетворяет значение из этого поля перекрашивтаь и их сразуже также.

вот код как в данный момент я это реализую.
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
57
58
59
60
61
62
HBRUSH CEditNameSig_Dlg ::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 
    float UstavkUp_main,UstavUp_pr,UstavkDw_main,UstavkDw_pr,Min_value,Max_value;
    CString str;
    m_MaxValue.GetWindowText(str);          // Максимальное значение 
    Max_value=(float)_wtof(str);
    m_UstavkUp_main.GetWindowText(str);     //Аварийное максимальная
    UstavkUp_main=(float)_wtof(str);
    m_UstavUp_pr.GetWindowText(str);            //Предварительно максимальная
    UstavUp_pr=(float)_wtof(str);
    m_UstavkDw_pr.GetWindowText(str);           //Предварительно минимальное 
    UstavkDw_pr=(float)_wtof(str);
    m_UstavkDw_main.GetWindowText(str);     //Аварийно минимальное 
    UstavkDw_main=(float)_wtof(str);
    m_MinValue.GetWindowText(str);          //Минимальное значение 
    Min_value=(float)_wtof(str);
 
    UINT id = pWnd->GetDlgCtrlID();
 
    if (id == IDC_MinValue)
        if( Min_value > UstavkDw_main || Min_value > UstavkDw_pr || Min_value > UstavUp_pr || Min_value > UstavkUp_main || Min_value > Max_value)
        {
            pDC->SetBkColor(RGB(255,0,0));
            hbr = m_brush;
 
        }
    if (id == IDC_UstavkDw_main)
        if(UstavkDw_main > UstavkDw_pr || UstavkDw_main > UstavUp_pr ||  UstavkDw_main >UstavkUp_main || UstavkDw_main > Max_value || UstavkDw_main < Min_value )
        {   
            pDC->SetBkColor(RGB(255,0,0));
            hbr = m_brush;
        }
    if (id == IDC_UstavkDw_pr)
        if(UstavkDw_pr > UstavUp_pr || UstavkDw_pr > UstavkUp_main || UstavkDw_pr > Max_value || UstavkDw_pr < UstavkDw_main || UstavkDw_pr < Min_value)
        {
            pDC->SetBkColor(RGB(255,0,0));
            hbr = m_brush;
        }
    if (id == IDC_UstavkUp_pr)
        if(UstavUp_pr > UstavkUp_main || UstavUp_pr > Max_value || UstavUp_pr < UstavkDw_main || UstavUp_pr < UstavkDw_pr || UstavUp_pr < Min_value )
        {
            pDC->SetBkColor(RGB(255,0,0));  
            hbr = m_brush;
        }
    if (id == IDC_UstavkUp_main)
        if( UstavkUp_main > Max_value || UstavkUp_main < UstavUp_pr  || UstavkUp_main < UstavkDw_main || UstavkUp_main < UstavkDw_pr || UstavkUp_main < Min_value)
        {
            pDC->SetBkColor(RGB(255,0,0));
            hbr = m_brush;
        }
    if (id == IDC_MaxValue)
        if( Max_value < UstavkUp_main || Max_value < UstavUp_pr || Max_value < UstavkDw_pr || Max_value < UstavkDw_main || Max_value < Min_value)
        {   
            pDC->SetBkColor(RGB(255,0,0));
            hbr = m_brush;
        }
 
return  hbr;
   
}
Cdialog главное меню
CEditNameSig_Dlg наследуемое и как раз то меню где находятся эти поля.

То как выглядят поля показано в приложенном скрине.
Ошибка моя заключается в том что вводя значение не соответствующее условию цвет фона перекрашивается.
Но если убрать курсор с поля его фон снова становится белым.
Плюс если навести курсор на другие поля то они тоже становятся красными как и нужно по условию(если они не довольны значением из начального поля ), но после убирания курсора как и первое поля снова становятся белым.
Тоесть при убирание курсора цвет меняется на белый, а наведение становится нужным.
Моя просьба, мольба, помочь решить мою проблему, так чтобы поля светились красным всегда при условии.
Я буду вам очень признателен и благодарен за любые советы и коментарии)
Миниатюры
Перерисовка Edit control, смена фона на другой цвет (MFC)   Перерисовка Edit control, смена фона на другой цвет (MFC)   Перерисовка Edit control, смена фона на другой цвет (MFC)  

0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.12.2013, 10:43
Ответы с готовыми решениями:

Перенос введенных данных из Edit в другой Edit на другой форме (MFC)
Имеется: проект MFC в котором есть IDC_DIALOG1 и IDC_DIALOG2. Нужно: после нажатия кнопки на IDC_DIALOG1, открыть IDC_DIALOG2 и...

MFC и Edit control
У меня есть MFC проект, есть поле ввода CEdit. Как получить из него строку и переконвертировать в число? Нереальная проблема.

MFC и Edit Control
Здравствуйте. Скажите как проверить Edit Control - введено в него число или буква?

53
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
10.12.2013, 18:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rusianvodka Посмотреть сообщение
вы меня запутали..)) без каких либо оскорблений в вашу сторону но вы видимо подробно не вчитывались что я писал и скидывал в коде.
так как я сделал от эдита а вы говорите про диалог..
т.е
Цитата Сообщение от rusianvodka Посмотреть сообщение
class test1 : public CEditNameSig_Dlg
CEditNameSig_Dlg наследуется от CEdit а не от CDialog?
тогда ой
кто родитель у CEditNameSig_Dlg?
0
0 / 0 / 0
Регистрация: 20.06.2013
Сообщений: 47
11.12.2013, 08:27  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
т.е
CEditNameSig_Dlg наследуется от CEdit а не от CDialog?
тогда ой
кто родитель у CEditNameSig_Dlg?
class CEditNameSig_Dlg : public CDialog
вот так) как и говорил в начале.
а эдиты уже в CEditNameSig_Dlg
0
0 / 0 / 0
Регистрация: 20.06.2013
Сообщений: 47
11.12.2013, 09:48  [ТС]
Цитата Сообщение от Aloir Посмотреть сообщение
не знаю, у меня вроде все ок, посмотрите..

но я на вашем месте перенес эти проверки на метод onOk.
Разобрал полностью ваш пример, сделал точно также у себя, но так и не могу понять почему у вас он не меняет цвет когда проводишь мышью по траекторие пересекающей эдит, а у меня меняет...
Что я мог сделать не так?)
Миниатюры
Перерисовка Edit control, смена фона на другой цвет (MFC)   Перерисовка Edit control, смена фона на другой цвет (MFC)  
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
11.12.2013, 09:48
rusianvodka,
запутал ты меня совсем
я и повелся
но теперь разобрался
OnCtlColor нужно переопределять у Диалога, он отвечает за прорисовку своих контролов
а у контрола нужно( или не нужно) будет переопределить ownerDraw, (сам рисуешь )
но Едит вроде его не подддерживает
я прошу прошения за то, что ввел в заблуждение
0
0 / 0 / 0
Регистрация: 20.06.2013
Сообщений: 47
11.12.2013, 10:04  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
rusianvodka,
запутал ты меня совсем
я и повелся
но теперь разобрался
OnCtlColor нужно переопределять у Диалога, он отвечает за прорисовку своих контролов
а у контрола нужно( или не нужно) будет переопределить ownerDraw, (сам рисуешь )
но Едит вроде его не подддерживает
я прошу прошения за то, что ввел в заблуждение
да ничего, спасибо вам за то что уделяете мне внимание.) это довольно интересно разбиратся в том что вообще не понимаешь))
в данный момент у меня имется такое
HBRUSH CEditNameSig_Dlg ::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
где и происходят все действия с закрашиванием фона эдитов.
как я п онимаю теперь мне нужно копать и смотреть в сторону ownerDraw и customdraw
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
11.12.2013, 10:10
у меня такое ощущение, что у вас что-то перебивает отрисовку этих editов или их значение
как-будто у вас при потере фокуса все поля или обнуляются или не подтягиваются..

почему-то думаю что у вас косяк в OnCommand, вы там меняете значения переменных, а это не оч красиво.

попробуйте закоментировать весь код до тех пор пока не начнет работать так как надо.

и начните с OnCommand и PreTranslateMessage(не помню, есть ли это у вас)
0
0 / 0 / 0
Регистрация: 20.06.2013
Сообщений: 47
11.12.2013, 10:21  [ТС]
Цитата Сообщение от Aloir Посмотреть сообщение
у меня такое ощущение, что у вас что-то перебивает отрисовку этих editов или их значение
как-будто у вас при потере фокуса все поля или обнуляются или не подтягиваются..

почему-то думаю что у вас косяк в OnCommand, вы там меняете значения переменных, а это не оч красиво.

попробуйте закоментировать весь код до тех пор пока не начнет работать так как надо.

и начните с OnCommand и PreTranslateMessage(не помню, есть ли это у вас)
OnCommand и PreTranslateMessage я в первую очередь сравнивал с вашим файликом.))
PreTranslateMessage не нашёл у себя, поэтому добавил как у вас. Но что сним, что без него одинакова.
OnCommand вот он, но как я не смотрел не нашёл в нём ничего такого что могло трогать перерисовку.
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
BOOL CEditNameSig_Dlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
 
 
    switch(wParam)
    {
    case 332:                     
 
    int ps,ch;
    CString NameSig;
    float U_min,U_max,U_min_pr,U_max_pr,Min_value,Max_value;
    CString str;
    POSITION pos,pos_prev;
    CSigOb *SigA;
    BOOL CorView;
        
    badUstavky="";
    CorView=false;
 
    NameSig=m_listname.GetItemText(selItem,0);
    
    for(ps=0;ps<arrayPodsistTemp.GetSize();ps++)
    {
        if(listASigCorrect[ps]->IsEmpty()) continue;
        else
        {
          pos=listASigCorrect[ps]->GetTailPosition( );
          while(pos!=0)
            {    
                pos_prev=pos;
                SigA=(CSigOb *)listASigCorrect[ps]->GetPrev(pos);
 
                CString ViewName;
                if(CheckNameSigShow==0)
                    ViewName=SigA->NameUser;
                if(CheckNameSigShow==1)
                    ViewName=SigA->NameSigASUShort;
                if(CheckNameSigShow==2)
                    { if(SigA->NameSigTechShort!="NULL")
                         ViewName=SigA->NameSigTechShort;else   ViewName=SigA->NameSigASUShort;
                    }
                                
                if(ViewName==NameSig)
                {                   
                                 ch=m_Ust_check.GetCheck();
                                 m_UstavkUp_main.GetWindowText(str);
                                 U_max=(float)_wtof(str);
                                 m_UstavUp_pr.GetWindowText(str);
                                 U_max_pr=(float)_wtof(str);
                                 m_UstavkDw_main.GetWindowText(str);
                                 U_min=(float)_wtof(str);
                                 m_UstavkDw_pr.GetWindowText(str);
                                 U_min_pr=(float)_wtof(str);
                                 m_MaxValue.GetWindowText(str);
                                 Max_value=(float)_wtof(str);
                                 m_MinValue.GetWindowText(str);
                                 Min_value=(float)_wtof(str);
 
                        if (SigA->Ust_chk!=ch||SigA->Ust_max!=U_max||SigA->Ust_max_pr!=U_max_pr||SigA->Ust_min!=U_min || SigA->Ust_min_pr!=U_min_pr || SigA->Max_value!=Max_value ||  SigA->Min_value!=Min_value )
            IsCorrectView=TRUE;
                                SigA->Ust_chk=ch; 
                                SigA->Ust_max=U_max;
                                SigA->Ust_max_pr=U_max_pr;
                                SigA->Ust_min=U_min;
                                SigA->Ust_min_pr=U_min_pr;
                                SigA->Max_value=Max_value;
                                SigA->Min_value=Min_value;
                                         
                }
 
if( SigA->Min_value >  SigA->Ust_min || SigA->Min_value >  SigA->Ust_min_pr || SigA->Min_value > SigA->Ust_max_pr || SigA->Min_value > SigA->Ust_max || SigA->Min_value >  SigA->Max_value 
|| SigA->Ust_min > SigA->Ust_min_pr || SigA->Ust_min > SigA->Ust_max_pr ||  SigA->Ust_min > SigA->Ust_max ||SigA->Ust_min > SigA->Max_value 
|| SigA->Ust_min_pr > SigA->Ust_max_pr || SigA->Ust_min_pr > SigA->Ust_max || SigA->Ust_min_pr > SigA->Max_value 
|| SigA->Ust_max_pr > SigA->Ust_max || SigA->Ust_max_pr > SigA->Max_value
|| SigA->Ust_max > SigA->Max_value)
{
    badUstavky=badUstavky+ViewName + _T(",");
}
            } 
        }
            
    }
        
} 
 
  return CDialog::OnCommand(wParam, lParam);
    
}
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
11.12.2013, 10:23
rusianvodka,
держи проект
написан за пол-часа левой пяткой
7 эдитов переливаются цветами радуги
вопросы будут отвечу, но по моему все понятно, большую часть кода написал "волшебник"
Вложения
Тип файла: zip DialogRanbow.zip (136.4 Кб, 17 просмотров)
1
11.12.2013, 10:44

Не по теме:

delete

0
0 / 0 / 0
Регистрация: 20.06.2013
Сообщений: 47
11.12.2013, 11:39  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
rusianvodka,
держи проект
написан за пол-часа левой пяткой
7 эдитов переливаются цветами радуги
вопросы будут отвечу, но по моему все понятно, большую часть кода написал "волшебник"
Спасибо) Я уже осознал как это всё примерно работает и что мне нужно. просто в данный момент я не могу понять в чём у меня проблема и почему цвет меняется при проведение по нему курсором.
Методом проб и ошибок нашёл что это всё связанно с


return (HBRUSH)(m_pEditBkBrush->GetSafeHandle()); в каждом шаге при перекраске.
Хотя изучив пример уважаемого Aloirа я понял что у нас всё идентично)) сейчас пытаюсь понять что может ещё влиять на это.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
11.12.2013, 12:07
Цитата Сообщение от rusianvodka Посмотреть сообщение
return (HBRUSH)(m_pEditBkBrush->GetSafeHandle());
не понял а зачем её вызывать?
возвращай созданную кисть
у меня например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HBRUSH CDialogRanbowDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 
    // TODO:  Измените любые атрибуты DC
   if(pWnd==&edit1)
     return (HBRUSH) br[colors%7]; 
   if(pWnd==&edit2)
     return (HBRUSH) br[(colors+1)%7];
    if(pWnd==&edit3)
     return (HBRUSH) br[(colors+2)%7]; 
   if(pWnd==&edit4)
     return (HBRUSH) br[(colors+3)%7];
    if(pWnd==&edit5)
     return (HBRUSH) br[(colors+4)%7];
   if(pWnd==&edit6)
     return (HBRUSH) br[(colors+5)%7];
    if(pWnd==&edit7)
     return (HBRUSH) br[(colors+6)%7];
 
    return hbr;
}
можешь добавить вывод текста с прозрачным фоном и печатать будет не на белом фоне а на выбранном

мой код в таком случае
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
HBRUSH CDialogRanbowDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 
    // TODO:  Измените любые атрибуты DC
   if(pWnd==&edit1)
   {
    pDC->SetBkMode(TRANSPARENT);
    return (HBRUSH) br[colors%7]; 
   }
   if(pWnd==&edit2)
       {
    pDC->SetBkMode(TRANSPARENT);
     return (HBRUSH) br[(colors+1)%7];
   }
    if(pWnd==&edit3)
    {
    pDC->SetBkMode(TRANSPARENT);
    return (HBRUSH) br[(colors+2)%7];
    }
   if(pWnd==&edit4)
     {
    pDC->SetBkMode(TRANSPARENT);
    return (HBRUSH) br[(colors+3)%7];
   }
   if(pWnd==&edit5)
    {
    pDC->SetBkMode(TRANSPARENT);
    return (HBRUSH) br[(colors+4)%7];
   }  
  if(pWnd==&edit6)
  {
    pDC->SetBkMode(TRANSPARENT);
     return (HBRUSH) br[(colors+5)%7];
  }
    if(pWnd==&edit7)
     {
    pDC->SetBkMode(TRANSPARENT);
    return (HBRUSH) br[(colors+6)%7];
    }
   
   
   
   return hbr;
}
1
0 / 0 / 0
Регистрация: 20.06.2013
Сообщений: 47
11.12.2013, 12:22  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
не понял а зачем её вызывать?
возвращай созданную кисть
у меня например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HBRUSH CDialogRanbowDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 
    // TODO:  Измените любые атрибуты DC
   if(pWnd==&edit1)
     return (HBRUSH) br[colors%7]; 
   if(pWnd==&edit2)
     return (HBRUSH) br[(colors+1)%7];
    if(pWnd==&edit3)
     return (HBRUSH) br[(colors+2)%7]; 
   if(pWnd==&edit4)
     return (HBRUSH) br[(colors+3)%7];
    if(pWnd==&edit5)
     return (HBRUSH) br[(colors+4)%7];
   if(pWnd==&edit6)
     return (HBRUSH) br[(colors+5)%7];
    if(pWnd==&edit7)
     return (HBRUSH) br[(colors+6)%7];
 
    return hbr;
}
можешь добавить вывод текста с прозрачным фоном и печатать будет не на белом фоне а на выбранном

мой код в таком случае
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
HBRUSH CDialogRanbowDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 
    // TODO:  Измените любые атрибуты DC
   if(pWnd==&edit1)
   {
    pDC->SetBkMode(TRANSPARENT);
    return (HBRUSH) br[colors%7]; 
   }
   if(pWnd==&edit2)
       {
    pDC->SetBkMode(TRANSPARENT);
     return (HBRUSH) br[(colors+1)%7];
   }
    if(pWnd==&edit3)
    {
    pDC->SetBkMode(TRANSPARENT);
    return (HBRUSH) br[(colors+2)%7];
    }
   if(pWnd==&edit4)
     {
    pDC->SetBkMode(TRANSPARENT);
    return (HBRUSH) br[(colors+3)%7];
   }
   if(pWnd==&edit5)
    {
    pDC->SetBkMode(TRANSPARENT);
    return (HBRUSH) br[(colors+4)%7];
   }  
  if(pWnd==&edit6)
  {
    pDC->SetBkMode(TRANSPARENT);
     return (HBRUSH) br[(colors+5)%7];
  }
    if(pWnd==&edit7)
     {
    pDC->SetBkMode(TRANSPARENT);
    return (HBRUSH) br[(colors+6)%7];
    }
   
   
   
   return hbr;
}
m_pEditBkBrush и есть созданная кисть, GetSafeHandle() помогает сохранить цвет едита фона если курсор там не активный.
Так как без неё, когда курсор не в эдите, цвет пропадает.
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
11.12.2013, 12:36
имхо: начинайте коментить код, до минимума. должен вылезти косяк.

можно посмотреть еще с помощью SPY++, что там приходит.. но тут будет посложнее думаю чем закоментить
1
0 / 0 / 0
Регистрация: 20.06.2013
Сообщений: 47
11.12.2013, 12:56  [ТС]
Цитата Сообщение от Aloir Посмотреть сообщение
имхо: начинайте коментить код, до минимума. должен вылезти косяк.

можно посмотреть еще с помощью SPY++, что там приходит.. но тут будет посложнее думаю чем закоментить
я этим сейчас и занимаюсь))) банальный изменения и убирания) и Говорю что пришёл к тому что как мне кажется проблема в строчке
return (HBRUSH)(m_pEditBkBrush->GetSafeHandle());
точнее в GetSafeHandle() так как если возвращать только m_pEditBkBrush то фон при переводе курсора становится снова белым, а если делать окно активным то становится нужного цвета.
Но если добавить GetSafeHandle, то всё работает как надо только при проведение курсором по эдиту не делая его активным он меняет цвет.
в вашем примере я заметил примерно тоже только там цвет не всего фона меняется, а появляются иногда полоски красного, на фоне эдита толщиной один пиксель и длиной в всю ширину.

Добавлено через 8 минут
я скидывал скрины своего меню. может быть дело в нём?
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
11.12.2013, 13:27
Цитата Сообщение от rusianvodka Посмотреть сообщение
m_pEditBkBrush и есть созданная кисть, GetSafeHandle() помогает сохранить цвет едита фона если курсор там не активный.
не надо этого
просто верни кисть
и увидишь что произойдет
запусти мой проект и увидишь там нет никакого моргания, хотя цвет меняется 5 раз в секунду
а если изменишь листинг с
Цитата Сообщение от ValeryS Посмотреть сообщение
pDC->SetBkMode(TRANSPARENT);
то и печатать будешь на том же фоне
1
0 / 0 / 0
Регистрация: 20.06.2013
Сообщений: 47
11.12.2013, 14:40  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
не надо этого
просто верни кисть
и увидишь что произойдет
запусти мой проект и увидишь там нет никакого моргания, хотя цвет меняется 5 раз в секунду
а если изменишь листинг с
то и печатать будешь на том же фоне
яж уже объеснял что присходит если возвращать кисть... вы не читали(
а если изменить листинг то фон становится не прозрачным а чёрным.
мне непонятно почему в том примере который мне скинули у человека (m_pEditBkBrush->GetSafeHandle()); работает нормально а у меня нет...(
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
11.12.2013, 14:46
Цитата Сообщение от rusianvodka Посмотреть сообщение
яж уже объеснял что присходит если возвращать кисть..
вот это что ли?
Цитата Сообщение от rusianvodka Посмотреть сообщение
return (HBRUSH)(m_pEditBkBrush->GetSafeHandle());
ты знаешь что делает GetSafeHandle()
http://msdn.microsoft.com/en-u... 5tbwa.aspx
обрати внимание
A HANDLE to the attached Windows GDI object; otherwise NULL if no object is attached.
а у тебя кисть приатачена
еще раз повторю выброси GetSafeHandle()
0
0 / 0 / 0
Регистрация: 20.06.2013
Сообщений: 47
11.12.2013, 15:11  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
вот это что ли?

ты знаешь что делает GetSafeHandle()
http://msdn.microsoft.com/en-u... 5tbwa.aspx
обрати внимание

а у тебя кисть приатачена
еще раз повторю выброси GetSafeHandle()
если я делаю так то сам фон становится чёрным.
pDC->SetBkColor(TRANSPARENT);


а если так то цвет фона меняется как только окно становится не активным на белое при том что должно быть постоянно красным.
return (HBRUSH)(m_pEditBkBrush);
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
11.12.2013, 17:41
rusianvodka,
покажи свой OnCtlColor как он сейчас выглядит

Добавлено через 1 минуту
Цитата Сообщение от rusianvodka Посмотреть сообщение
так то цвет фона меняется как только окно становится не активным
окно это что?
диалог? или CEdit?
0
0 / 0 / 0
Регистрация: 20.06.2013
Сообщений: 47
12.12.2013, 09:20  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
rusianvodka,
покажи свой OnCtlColor как он сейчас выглядит

Добавлено через 1 минуту

окно это что?
диалог? или CEdit?

OnCtlColor
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
57
58
59
60
HBRUSH CEditNameSig_Dlg ::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    float UstavkUp_main,UstavUp_pr,UstavkDw_main,UstavkDw_pr,Min_value,Max_value;
    CString str;
    m_MaxValue.GetWindowText(str);          // Максимальное значение 
    Max_value=(float)_wtof(str);
    m_UstavkUp_main.GetWindowText(str);     //Аварийное максимальная
    UstavkUp_main=(float)_wtof(str);
    m_UstavUp_pr.GetWindowText(str);            //Предварительно максимальная
    UstavUp_pr=(float)_wtof(str);
    m_UstavkDw_pr.GetWindowText(str);           //Предварительно минимальное 
    UstavkDw_pr=(float)_wtof(str);
    m_UstavkDw_main.GetWindowText(str);     //Аварийно минимальное 
    UstavkDw_main=(float)_wtof(str);
    m_MinValue.GetWindowText(str);          //Минимальное значение 
    Min_value=(float)_wtof(str);
    UINT id = pWnd->GetDlgCtrlID();
UpdateData();
 
if (id == IDC_MinValue)
if( Min_value > UstavkDw_main || Min_value > UstavkDw_pr || Min_value > UstavUp_pr || Min_value > UstavkUp_main || Min_value > Max_value)
{
pDC->SetBkColor(TRANSPARENT);
 
return (HBRUSH)(m_pEditBkBrush);
}
if (id == IDC_UstavkDw_main)
if(UstavkDw_main > UstavkDw_pr || UstavkDw_main > UstavUp_pr ||  UstavkDw_main >UstavkUp_main || UstavkDw_main > Max_value || UstavkDw_main < Min_value )
{   
pDC->SetBkColor(TRANSPARENT);
return (HBRUSH)(m_pEditBkBrush);
}
if (id == IDC_UstavkDw_pr)
if(UstavkDw_pr > UstavUp_pr || UstavkDw_pr > UstavkUp_main || UstavkDw_pr > Max_value || UstavkDw_pr < UstavkDw_main || UstavkDw_pr < Min_value)
{
pDC->SetBkColor(TRANSPARENT);
return (HBRUSH)(m_pEditBkBrush;
}
if (id == IDC_UstavkUp_pr)
if(UstavUp_pr > UstavkUp_main || UstavUp_pr > Max_value || UstavUp_pr < UstavkDw_main || UstavUp_pr < UstavkDw_pr || UstavUp_pr < Min_value )
{
pDC->SetBkColor(TRANSPARENT);
return (HBRUSH)(m_pEditBkBrush);
}
if (id == IDC_UstavkUp_main)
if( UstavkUp_main > Max_value || UstavkUp_main < UstavUp_pr  || UstavkUp_main < UstavkDw_main || UstavkUp_main < UstavkDw_pr || UstavkUp_main < Min_value)
{
pDC->SetBkColor(TRANSPARENT);
return (HBRUSH)(m_pEditBkBrush);
}
if (id == IDC_MaxValue)
if( Max_value < UstavkUp_main || Max_value < UstavUp_pr || Max_value < UstavkDw_pr || Max_value < UstavkDw_main || Max_value < Min_value)
{   
pDC->SetBkColor(TRANSPARENT);
return (HBRUSH)(m_pEditBkBrush);
}
return  hbr;
 
}
под окном я подразумевал диалог).

Добавлено через 8 минут
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.12.2013, 09:20
Помогаю со студенческими работами здесь

MFC и Edit control
Я уже спрашивал как получить строку из CEdit и перевести в число. Умный человек ответил. А из числа в строку, чтобы можно было в...

Цвет фона, цвет текста в определённом EDIT и шрифт
Сначала опишу чего добиваюсь: Для всех(кроме 1го, заблокированного от ввода) сделать текст текста серым. У заблокированного EDIT'а...

Edit Control в MFC (VS2005)
Подскажите, как разрешить вводить только определенные символы в Edit. Например что бы можно было вводить только единицы и нули.

MFC Edit Control - переменные
Как осуществить простейшую запись из Edit Control в переменную, а потом обратно переменную вывести в Edit Control? Ничего не понимаю,...

Как использовать Edit Control в MFC?
Пишу калькулятор на МФЦ. Нужна помощь! Не знаю ничего об мфц, что и как. Делать нужно срочно, нужны бы советы от знающих товарищей! Особые...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru