eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС
выпущен 4 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: SecurAdmin (+5 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Программирование —› Как обновить цвет STATIC'а
Посл.ответ Сообщение

Ранг: 6.0 (гость)
Статус: Участник

Создано: 20 декабря 2015 14:29 · Поправил: 20 декабря 2015 14:29 Andrello_88 New!
Цитата · Личное сообщение · #1

Делаю так:

Code:
  1. .const
  2. label1ID         equ 1
  3.  
  4.  
  5. .elseif uMsg==WM_INITDIALOG 
  6. szText statClas,'STATIC'
  7. invoke CreateWindowEx,WS_EX_LEFT,
  8.           ADDR statClas,ADDR Infos,
  9.           WS_CHILD or WS_VISIBLE or SS_LEFT,
  10.           20,20,100,20,hWnd1,label1ID,
  11.           hInstance,NULL
  12. mov hndle, eax
  13. invoke SendMessage,hndle,WM_SETFONT,hFont, 0
  14. mov eax, hndle
  15.  
  16.  
  17. .elseif uMsg == WM_CTLCOLORSTATIC
  18. invoke GetDlgCtrlID,lParam1                 
  19. .if eax == label1ID
  20. .if flag == 0
  21. RGB 255,255,255
  22. invoke SetTextColor,wParam1,0FFA07Ah
  23. invoke SetBkMode,wParam1,TRANSPARENT
  24. invoke GetStockObject,NULL_BRUSH
  25. ret
  26. .else
  27. RGB 255,255,255
  28. invoke SetTextColor,wParam1,0000000h
  29. invoke SetBkMode,wParam1,TRANSPARENT
  30. invoke GetStockObject,NULL_BRUSH
  31. ret       
  32. .endif
  33. .endif


Все работает, но цвет текста меняется только при перезапуске дочернего окна! Как менять его не закрывая окно?

Ранг: 409.2 (мудрец)
Статус: Участник

Создано: 20 декабря 2015 14:48 · Поправил: 20 декабря 2015 14:48 dosprog New!
Цитата · Личное сообщение · #2

Это тебе надо на какой-нибудь хороший форум по программированию.
А тут ты только засоряешь ленту новостей, сорри.


Ранг: 488.4 (мудрец)
Статус: Участник

Создано: 20 декабря 2015 15:41 · Поправил: 20 декабря 2015 15:42 VodoleY New!
Цитата · Личное сообщение · #3

Andrello_88 а откуда твое окно.. знает что ты ему цвет поменял? намекаю на Update(Repaint) и тебе правильно подметили.. тут как бы не кодят. Возьми любую книжку по программированию. почитай про контролы.. в гугле масса готового кода


Ранг: 312.4 (мудрец)
Статус: Участник

Создано: 20 декабря 2015 15:58 · Поправил: 20 декабря 2015 16:07 DenCoder New!
Цитата · Личное сообщение · #4

Из старого
Code:
  1. {
  2.          WINDOWINFO wi;
  3.          HBRUSH hbr;
  4.          HWND hWndCur;
  5.          Subroutines* pSub;
  6.          WND_PARS* pWndPars;
  7.          bool bSecondWnd;
  8.          bool bLeaf;
  9.          bool bRecursive;
  10.          RECT rect;
  11.  
  12.          hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  13.  
  14.          if(bAnalysisComplete)
  15.          {
  16.                  hWndCur = pWnd->m_hWnd;
  17.  
  18.                  wi.cbSize = sizeof(WINDOWINFO);
  19.                  ::GetWindowInfo(hWndCur, &wi);
  20.  
  21.                  if(wi.atomWindowType == atom)
  22.                  {
  23.                         pSub = (Subroutines*)::GetWindowLong(hWndCur, GWL_USERDATA);
  24.  
  25.                         if(!pSub)return hbr;
  26.  
  27.                         bSecondWnd = false;
  28.                         bLeaf = pSub->GetFirstCall() == NULL;
  29.                         bRecursive = pSub->IsRecursive();
  30.  
  31.                         pWndPars = pSub->FindWnd(pSub->GetHWND());
  32.                         while(pWndPars)
  33.                         {
  34.                               COLORREF cr = RGB(0, 0, 0);
  35.                               COLORREF br = RGB(0xFF, 0xFF, 0xFF);
  36.                               
  37.                               if(bSecondWnd)
  38.                                    cr = RGB(0, 0xFF, 0);
  39.                               else
  40.                                    bSecondWnd = true;
  41.  
  42.                               if(pWndPars->hWnd == hWndCur)
  43.                               {
  44.                                    if(bLeaf)
  45.                                        cr = RGB(0, 0, 0xFF);
  46.  
  47.                                    if(bRecursive)
  48.                                        cr = RGB(0xFF, 0, 0);
  49.  
  50.                                    //Можно и так
  51.                                    ::SetTextColor(pDC->m_hDC, cr);
  52.                                    ::SetBkColor(pDC->m_hDC, br);
  53.                                    //pDC->SetTextColor(cr);
  54.                                    break;
  55.                               }
  56.                               pWndPars = pWndPars->pNext;
  57.                         }
  58.                  }
  59.          }
  60.  
  61.          return hbr;
  62. }


Грамотно переведите на выбраный вами асм, замените WM_CTLCOLOR у меня на WM_CTLCOLORSTATIC и буит Вам щасье

Как очень возможная причина, почему у Вас не работает - нет возврата HBRUSH.
If an application processes this message, the return value is a handle to a brush that the system uses to paint the background of the static control.
--> Link <--

| Сообщение посчитали полезным: Rainbow, Andrello_88



Ранг: 50.4 (постоянный)
Статус: Участник

Создано: 21 декабря 2015 07:26 · Поправил: 21 декабря 2015 08:39 UniSoft New!
Цитата · Личное сообщение · #5

Andrello_88 пишет:
Как менять его не закрывая окно?

перерисовывать/обновлять окно нужно...
что-нибудь типа:
Code:
  1. .elseif uMsg==WM_LBUTTONDOWN
  2.     inc    flag
  3.     and   flag, 1
  4.     invoke InvalidateRect,hndle,NULL,FALSE
  5. .endif

| Сообщение посчитали полезным: Andrello_88


Ранг: 6.0 (гость)
Статус: Участник

Создано: 22 декабря 2015 17:47 New!
Цитата · Личное сообщение · #6

Всем спасибо, разобрался!
 eXeL@B —› Программирование —› Как обновить цвет STATIC'а
Эта тема закрыта. Ответы больше не принимаются.

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS