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

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

09.12.2013, 10:43. Показов 11108. Ответов 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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
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
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru