r4dical Napisano Lipiec 3, 2019 Autor Zgłoś Udostępnij Napisano Lipiec 3, 2019 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 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Burn Napisano Lipiec 4, 2019 Zgłoś Udostępnij Napisano Lipiec 4, 2019 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 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Surprise Napisano Lipiec 4, 2019 Zgłoś Udostępnij Napisano Lipiec 4, 2019 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 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Burn Napisano Lipiec 4, 2019 Zgłoś Udostępnij Napisano Lipiec 4, 2019 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 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.