Jak narysować niestandardowe pole EDIT?

0

Jak wiadomo, edit nie moze byc OwnerDraw - wiec jak przejac jego rysowanie?

Probowalem przez subclassing i napisalem cos takiego:

Kopiuj
LRESULT APIENTRY EditSubclassProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{

 PAINTSTRUCT ps;
 HDC hdc;



 if (uMsg == WM_GETDLGCODE)
        return DLGC_WANTALLKEYS;


 switch (uMsg)
	{

	case WM_PAINT:
	   {hdc = BeginPaint(hwnd, &ps);
	    RECT rc;
	    GetClientRect(hwnd,&rc);
	    FillRect(hdc,&rc,CreateSolidBrush(RGB(100,255,255)));
	    EndPaint(hwnd, &ps);
	    return 0;
	   }

	}

    return CallWindowProc(wpOrigEditProc, hwnd, uMsg,
        wParam, lParam);


}

Chodzi mi np o narysowanie bordera i tla niestandardowego - moglbym probowac przez RoundRect tak jak jest tutaj FillRect - ale jak nie dopuscic do narysowania standardowej kontrolki? Poza tym teraz jezeli klikne na edita to tlo jest znowu przerysowywane na bialo..... jak przejac calkowita kontrole nad rysowaniem kontrolki?

Myslalem zeby nie uzywac tego:

Kopiuj
return CallWindowProc(wpOrigEditProc, hwnd, uMsg,
        wParam, lParam);

Ale wtedy nie wiem jak obsluzyc standardowe komunikaty edita (moze jakos z CallWindowProc?)

Pomoze mi ktos?

0

Pokombinuj może z WM_ERASEBKGND.

0

Tego tez probowalem - moge zmienic tlo, ale po kliknieciu na edit albo wpisaniu jakiegos tekstu znowu jest wstawiane standardowe biale tlo.... no i co z narysowaniem wlasnego bordera?

0

No to w takim razie pozostają dwie opcje - zostać przy standardowym wyglądzie controlki lub napisać własną ;)

0

Heh no tak wychodzi...

Ale wiem ze sie da to zrobic - tylko pytanie jak? Nie raz trafiaja sie programy, ktore maja niestandardowy wyglad kontrolek - a w zasobach sa normalne DialogBoxy, wiec program jakos to zamienia i nie chodzi tu raczej o OwnerDraw tylko o subclassing - zreszta sprawdzalem nazwe klasy okna i jest to zwykle EDIT.......

A malo tego, czasami nawet dialog otwierania albo zapisywania pliku i windowsowe MessageBox maja zmieniony wyglad kontrolek - ale jak to zrobic w WinApi.... [???]

0

zmienne np. globalne:

Kopiuj
HBRUSH brushBlc=CreatePatternBrush((HBITMAP)LoadImage((HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), "tlo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE));

HFONT fontStatic=CreateFont(14, 0, 0, 0, FW_BOLD, 0, 0, 0, ANSI_CHARSET,OUT_CHARACTER_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, "MS Sans Serif");

W procedurze rodzica na której jest edit wstaw:

Kopiuj
case WM_CTLCOLOREDIT:
	SetBkMode((HDC) wParam, TRANSPARENT); //to jest kolor tla w czcionce
	SelectObject((HDC) wParam, fontStatic);//
return (BOOL)brushBlc;//

Powinno działać. U mnie działa. Borland C++ 5.0. WinAPI

0

Nie o to mi chodzilo - chce calkowicie przejac rysowanie kontrolki - po prostu od nowa ja narysowac. Tutaj jest przyklad:

http://www.superplayer.prv.pl/scr.jpg

W ogole interesuje mnie jak to jest zrobione: standardowe systemowe pole otwierania pliku i zmieniony wyglad kontrolek, edit tez.

0
othello napisał(a)

Tutaj jest przyklad:

http://www.superplayer.prv.pl/scr.jpg

W ogole interesuje mnie jak to jest zrobione.

http://www.tgtsoft.com/download.php
http://www.angusj.com/resourcehacker/

To nic innego jak zmiana xp style. Zobacz w jaki sposob się robi nowe style dla win xp, oraz gdzie ten programik to podmienia.

Jeśli ten program zmienia tylko pojedynczą kontrolkę, to prawdpodobnie w jakiś sposób aplikacja używa gotowego stylu tylko dla wygenerowania swoich kontrolek. Jak? Nie wiem, ale jeśli się dowiesz daj znać :)

Przykładowo styl który pokazujesz to:

user image

0

Design and Implementation of a Win32 Text Editor
http://www.catch22.net/

  • przypadkowo był topic o tym na winapi.net ;)

Allerdings möchte ich alles selbst zeichnen und nicht die vorhandenen Windowsklassen benutzen

albo http://www.codeproject.com/editctrl/crysedit.asp

0

To nic innego jak zmiana xp style. Zobacz w jaki sposob się robi nowe style dla win xp, oraz gdzie ten programik to podmienia

Hmm to nie chodzi o to. Wh mnie jest jakis sposob na to, zeby calkowicie podmienic wyglad okna glownego aplikacji oraz wszystkich okien, ktorych parentem jest ta aplikacja. Dlatego nawet MessageBox ma zmienione przyciski......i to jest niezalezne od styli i od wersji Windows.

Ponawiam pytanie: jak to jest zrobione????? Ostatnio pojawilo sie wiele programow, ktore sa tak napisane. Chcialem znalezc na google cos na ten temat, ale nie wiem nawet co wpisac.

0

Całkowite przerysowanie wszystkiego umozliwiają komponenty firmy tmssoftware (o ile chcesz je stosować) http://www.tmssoftware.com/ komponent nazywa się SkinFactory

0

Myśle że zmiana wyglądu każdej z kontrolek w interfejsie sie nie powiedzie bo np. TOpenDialog jest otwierany przez ShellApi i w żaden sposób nie ma dosytępu uchwytów poszczególnych kontrolek. Pozostaje coś takiego stworzyć od podstaw lub zmuścić aplikacje by urzywała stylu WinXP pod Windows XP.

0

Myśle że zmiana wyglądu każdej z kontrolek w interfejsie sie nie powiedzie bo np. TOpenDialog jest otwierany przez ShellApi i w żaden sposób nie ma dosytępu uchwytów poszczególnych kontrolek.

Hmmm ciagle nie rozumiecie o co mi chodzi...po pierwsze to chodzilo mi o czyste WinApi, po drugie dostep do uchwytow kontrolek nawet w systemowym dialogu otwierania pliku z ShellApi daloby sie uzyskac ale to niewiele daje, a po trzecie: sa aplikacje, ktore wlasnie to robia: zmieniaja wyglad wszystkich konrolek we wszystkich oknach, ktore wyswietlaja: obojetnie czy to jest systemowy OpenDialog z ShellApi, czy systemowy MessageBox, czy cokolwiek innego - wazne ze jest to okno wyswietlane przez ta aplikacje.

Nawet menedzer okien Nvidia (kto ma taka karte ten wie o co chodzi), ktory dodaje dodatkowa pozycje do menu systemowego okien po wyswietleniu okna ustawien ma zmienione kontrolki na takie, jakie posiada aplikacja. XP theme raczej niewiele mi tu da, zreszta, to dziala chyba i z wczesniejszymi wersjami Windows, ktore nic nie wiedza o XP Themes.

Naprawde nikt niczego takiego nigdy nie widzial??? :| Przeciez pelno jest ostatnio takich programow....

0
dj napisał(a)

[...] bo np. TOpenDialog jest otwierany przez ShellApi i w żaden sposób nie ma dosytępu uchwytów poszczególnych kontrolek.

To akurat nieprawda ;)

0

Wszystkie aplikacje które maja niestandardowe wyglądy okna i kontrolek i których kody ja widziałem to po prostu jest inna funkcja rysowania okna nie da się tym obciążyć systemu. Co innego jest np. z efektem przezroczystości a i tak działa on tylko w systemach windows 2000 i wyższych. Z jakimikolwiek implementacjami miałem do czynienia to są na nowo napisane kontrolki(a raczej nadpisane stare wersje co niestety ma wpływ na szybkość). Widziałem motyw ze skórkami winamp dla własnych programów, w tym programie nie ma rzadnych kontrolek a jedynie w odpowiednich miejscach rysowane są obrazki cała obsługa związana z obsługa myszy spada na implementacje w programie system nie pomaga ani troche. To było by całkiem dobre rozwiązanie gdyby wykorzystać do rysowania np. OpenGL lub coś podobnego a nie WinApi.

Wróciwszy jescze do sprawy TOpenDialog jest otwierany przez funkcje GetOpenFileName nawet jeżeli dostaniemy uchwyty poszczególnych kontrolek i będziemy w stanie podmienić procedury okna to wątpie żeby to było łatwe i przyjemne rozwiązanie a tym bardziej efektywne. No i jeszcze czy uda się to wszystko zgrać by nie było żadnych nieprzyjemnych efektów.

0

Jakby na to nie patrzeć to wszystko pod windowsem jest okienkiem... Dostaje to-to komunikaty i ma się narysować/zachowywać.

Po co roztrząsać bez celu "jak to jest zaimplementowane"? Te wszystkie toolkity do skinowania mogą i rysować same i rysować częściowo przez system. Liczy się końcowy efekt i zachowanie.

Othello: po prostu za mało rzeczy obsługujesz żeby zmienić wygląd jednego edita... A co z WM_CTLCOLOREDIT [???] To nie jest takie proste w WinAPI, jak się nie wie "jak to działa?"... Na pewno prościej będzie w MFC lub VCL.

0

po prostu za mało rzeczy obsługujesz żeby zmienić wygląd jednego edita...

Hmm... czyli...?

Ale naprawde, widzialem juz sporo bibliotek i komponentow do skinowania, ale zaden nie potrafil dokonac tego, zeby skinowanie rozciagalo sie nawet na menu systemowe, systemowe MessageBoxy, systemowe dialogi otwierania pliku itd....

Ja jestem ciekawy jak jest to zaimplementowane....pewnie takie proste to nie jest.

Ale nawet pomijajac to, pytam: jakich biliotek/komponentow/klas toto uzywa? Szukalem i nie znalazlem, moze ktos ma jakis link, moze byc nawet MFC. [???]

0

Czyli czytaj co piszą! CTLCOLORxxx

No przecież już ci nawet 0x666 poradził, że napisanie własnej kontrolki... Ręczne rysowanie kontrolki. Przecież cała kontrolka to okienko NARYSOWANE, to nie jest coś osobnego, po prostu jest tak narysowane i tak się narysuje po kliknięciu, inaczej po wyłączeniu, jeszcze inaczej po dostaniu fokusa, itp.

Posłuchaj: wszystko się da zrobić pod Windowsem... Chociażby WindowsBlinds :-P
Problemem jest to, że ty nie znasz całej architektury systemu, żeby to zrobić, ale to jest możliwe do zrobienia.

Co ty chcesz zrobić: zmienić kolor edita, czy napisać własny toolkit do skinowania, bo ja już nie wiem...

0

Ok, wyjasnie jeszcze raz.....

To nie problem sciagnac jaks biblioteke do skinowania/komponent VCL. Ja to wszystko rozumiem co piszecie, ale:

  • samo WM_CTRLCOLOREDIT nie pasuje - mozna jedynie zmienic kolor edita i to tyle

  • napisanie wlasniej kontrolki: tez nie o to mi chodzi. Ta technika, ktora mama na mysli, z pewnoscia nie opiera sie na pisaniu wlasnych konrolek, bo sprawdzilem (przez mouse hook), ze klasa okna to dalej EDIT, a gdyby to byly wlasne kontrolki, to musialyby posiadac wlasna klase okna o innej nazwie.

No i ostatnia rzecz: wszystkie okna wyswietlanie przez program sa zmienione (inaczej narysowane)

Nawet systemowe dialogi, czy dialogi, ktore ja sam zaloze na okno programu przez hooka maja zmieniony wyglad.

Oczywiscie moge zrobic przykladowo wlasna kontrolke edit, ale wtedy kontrolki Edit wyswietlane we wszystkich oknach nie beda zmienione, a tym bardziej nie beda zmienione w dialogach wyswietlanych przez system.
Bede musial za kazdym razem zamiast normalnego edita stosowac kontrolke zrobiona przeze mnie.

Tymczasem ta technika o ktorej mowie umozliwia stosowanie normalncyh dialogow w zasobach, a program sam zamienia wyglad wszystkich kontrolek dialogu - ale sa to nadal te standardowe kontrolki - bo klasa okna nazywa sie tak samo. Poza tym, jak w ten sposob mialbym zmienic wyglad okna wyswietlanego przez funkcje MessageBox, czy GetOpenFileName usuwac standardowe konrolki i wstawiac moje wlasne? Bez sensu...

Sorry ze tak sie rozpisalem, ale przeczytajcie uwaznie o co mi chodzi. Napisalem to na przykladzie Edita, bo wyglad innych kontrolek moge zmienic przez OwnerDraw. Ale chodzi mi o to, jak to ogolnie dziala, bo chyba nie przez OwnerDraw.

Byc moze te XPTheme?? Ale watpie, to przeciez dziala i we wczesniejszych wersjach Windows (?)

0

No ogólnie działa przez owner draw, subclassing, superclassing, hooking, dll injecton, itp.

0

Hm no ok, zalozmy ze tak..........tyle to bym sie sam domyslil, tylko ze mi zalezy na konkretach - a przetrzasnalem cale google i nie znalazlem: ani zadnego przykladu jak cos takiego zrealizowac, ani tez zadnej biblioteki ktora to realizuje - tylko normalne OwnerDraw, ew subclassing (duperele typu, ze jak naciskam enter to przechodze do nastepnego edita).

Ale juz przykladowo jak zmienic rysowanie kontrolki przez subclassing nie znalazlem (a wydaje mi sie ze to na tym moze sie opierac).

0

Zmiana ramki w edit
trzeba przechwycić i obsłużyć aż... dwa komunikaty:
WM_NCCALCSIZE - usterenie marginesów, które malujesz w:
WM_NCPAINT
i to by było na tyle... 8-O

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.