Skocz do zawartości

jak zmienic kolor wnetrza edit-boxa


r4dical

Recommended Posts

witam wszystkich serdecznie.

w sumie cale pytanie zawarlem juz w naglowku.
pisze sobie aplikacje, ktora bedzie obslugiwac firme z duza iloscia kontrolek, chcialbym wyroznic niektore zmieniajac im kolor wnetrza, czy jak kto woli backgroundu. jak moge to zrobic?

pozdrawiam serdecznie
Mariusz

Link do komentarza
Udostępnij na innych stronach

Witam!

Aby zmienić kolor tła kontrolki EDIT trzeba samodzielnie obsłużyć komunikat WM_CTLCOLOREDIT

To masz przykład ale w MASM ponieważ ja nie piszę w C++ i mógłbym coś pomylić w tłumaczeniu.


.data
     hBrush dd ?

.code
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

.IF uMsg==WM_CREATE
     ......
     invoke CreateSolidBrush, 000000FFh ;Na przykład czerwone tło 
     mov hBrush, eax
     .......
.ELSEIF uMsg==WM_DESTROY
     .......
     invoke DeleteObject, hBrush 
     .......
.ELSEIF uMsg==WM_CTLCOLOREDIT
     .......
     invoke SetTextColor,wParam, 0000FFFFh ;Na przykład żółty tekst
     invoke SetBkColor,wParam,000000FFh ;Na przykład czerwone tło pod tekstem
     mov eax, hBrush
     ret
.ELSEIF uMsg==WM_COMMAND
     .......
.ENDIF
     .......
   
WndProc endp

    

Mam nadzieję że ten przykład Ci pomoże. A może znajdzie sie ktoś kto Ci to przetłumaczy na C++.
Generalnie chodzi o to że przy tworzeniu okna musisz sobie utwożyć Brush o określonym kolorze i zachować jego uchwyt w zmiennej. Póżniej podczas obsługi komunikatu WM_CTLCOLOREDIT możesz zmienić kolor tekstu (SetTextColor) i kolor tła pod tekstem (SetBkColor). Aby zmienić kolor tła całego EDIT-a trzeva zwrócić uchwyt utworzonego pędzla (hBrush) . Oczywiście przy niszczeniu okna trzeba ten uchwyt zwolnić (DeleteObject)

Mam nadzieje że to co napisałem jest choć cześciowo zrozumiałe :D

Dodam jescze że może być kłopot z samodzielną obsługą komunikatu WM_PAINT przynajmniej o ile dobrze pamientam miałem z tym problemy
gdy samodzielnie obsługiwałem komunkat WM_CTLCOLORSTATIC
nie wiem na 100% jak przy editach ale ostrzegam. Sprawdź sam.

Niestety nie znam innego być może lepszego i prostrzego sposobu :(

Pozdrowienia

Link do komentarza
Udostępnij na innych stronach

w c/c++ nie ma problemu, dodajesz komunikat WM_CTLCOLOREDIT do procedurki obsługi okna (np. WndProc):

DWORD edit_color = RGB(255, 00, 00) ; //czerwony
DWORD text_color = RGB(00, 255, 00) ; //zielony
//----
   case WM_CTLCOLOREDIT:
            SetBkColor((HDC)wParam, edit_color) ;
            SetTextColor((HDC)wParam, text_color) ;
            return (LRESULT) CreateSolidBrush(edit_color) ;
//----

W wParam przekazywany jest kontekst do kontrolki edit. Dalej wykonujesz na nim operacje - zmieniasz kolor tekstu i tła.

Na stronie masz cały artykuł o kontekstach, czyli grafice w GDI, przejrzyj go a na pewno skumasz te funkcje - https://www.winapi.org/index.php?option=content&task=view&id=7&Itemid=28

Jeśli masz więcej editów i chciałbyś przypisać kolor tylko do jednego,musisz sprawdzić czy lParam jest równy uchwytowi edita, który ma zostać zmodyfikowany.

np.

//----
if((HWND)lParam == uchwyt_edita)
{
 //tu wklejasz kod
}
//----

Istnieją również odpowiedniki tego komunikatu dla listy, statica, czy okna dialogowego.
Nazwy ich są intuicyjne, czyli np. WM_CTLCOLORLISTBOX - postępujesz tak jak dla edita.

I to na tyle...

Powodzenia ;)

Link do komentarza
Udostępnij na innych stronach

Witam!

Oczywiście to co napisał codeguy oczywiście działa, tylko jedna rzecz mnie zastanawia po co za każdym wywoaniem komunikatu WM_CTLCOLOREDIT wywoływać CreateSolidBrush ? Ja proponuję to zrobić tylko przy tworzeniu okna tak jak to opisałem wyżej. Chyba że mamy zamiar zmieniać klor kontrolki w trakcie działania programu (gdy okno na którym jest kontrolka w omawianym przypadku edit jest otwarte) to wtedy troche inna bajka.

W każdym razie korzystając z tego co napisaliśmy powinieneś sobie poradzić bez problemu.

Gdyby coś było jednak niejasne to pisz na forum albo GG: 5726447 jednak tak jak pisałem nie programuje w C wiec niestety nie moge podać Ci gotowego kodu w tym języku.

Proszę o opinie na temat czy warto wywoływać CreateSolidBrush przy każdym wywołaniu funkcji WM_CTLCOLOREDIT ponieważ ja tego unikam ale nie jestem do końca przekonany czy słusznie.

Pozdrowienia

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...