[ Rapaic Rajko @ 20.05.2016. 15:11 ] @
Kolege, pozdravljam vas!

Dakle, pitanje iz naslova: kako ispisati cirilicni text u Form.Caption-u?
Ovde gde radim, postoji komponenta koja radi handle-ovanje poruka Form-e, i sa GetWindowDC(Form1.Handle) i DrawText() odradjuje ispis bilo kog text-a (sa zadanim encoding-om). Medjutim, na novijim Windows-ima (pocev od Viste) to jednostavno vise ne funkcionise.
Probe radi, napravio sam test aplikaciju i pokusao pomenutim postupkom da ispisem text na Caption bar-u; nece da moze, vidi se da su koordinate dobre (spustao Y pomalo da vidim), Caption bar je naprosto nedodirljiv.

Onda sam napravio drugi test. Pozvao sam sad GetWindowDC(0) (za ceo desktop), i ispisao uz pomoc ClientToScreen funkcije. Sad ispisuje, ali text nije transparentan, vidi se bound rect.

I na kraju treci test. Ista stvar kao u drugom, samo sad pravim transparentnu bitmapu u kojoj ispisem text, i zatim tu bitmapu tresnem preko desktopa. E tu se sad desavaju cudne stvari. Caption bar kao da pamti prethodnu podlogu na kojoj je bio; ako je ispod bila neka ikona, pa sam pomerio formu, i pritisnuo btn da iscrta bitmap-u, na njoj (bitmapi) ispod text-a se vide detalji pomenute ikone(!). Ludilo...

Na kraju, promena sistemskog fonta ne dolazi u obzir; ovo mora da radi na svakoj masini, i da ne ometa druge aplikacije.

Daklem, ljudi, ima li ko ideju kako ovo uraditi?

Pozz, i hvala unapred!
[ savkic @ 20.05.2016. 15:46 ] @
Ako imaš neki noviji (XE) delphi onda samo po sebi će to raditi, ako koristiš neki stariji onda razmisli o prelasku na TNT kontrole (koje prave unicode verziju prozora sa CreateWindowW) i tu ćeš takođe imati bez problema ćiriliću. Ako moraš sam da radiš crtanje onda je to mučenje i vrlo je komplikovano, plus ne radi uvek dobro jer Widnows ima tendenciju da iscrta default caption bar preko. Ako hoceš sam da iscrtavaš mogu postovati moj kod za to.
[ captPicard @ 20.05.2016. 15:47 ] @
Ako ne pronađeš pametnije rješenje makni caption bar i napravio svoj. A sjećam se da sam se ja bio gubio oko toga i imao slične probleme kao i ti ali meni to nije bilo neophodno pa sam odustao...
[ Rapaic Rajko @ 21.05.2016. 08:45 ] @
captPicard, hvala za ideju, to mi nije palo na pamet.
Najverovatnije cu tako i odraditi, samo da management odobri. Ionako sam vec odradio masu custom iscrtavanja, jos malo nece da skodi

Pozz (i hvala)
[ Rapaic Rajko @ 23.05.2016. 10:19 ] @
Hehe, resio.

Postupak je sledeci, ako nekom zatreba.

1) Uzme se DC desktopa sa GetWindowDC(0).
2) Zatim se kreira bitmapa, u koju se sa CopyRect() iskopira Rect sa Caption bara (posredtvom DC-a iz 1) ), na/u koji se zeli odraditi ispis.
3) Zatim se na pomenutoj bitmapi odradi Canvas.TextOut(), ali se prethodno podesi Canvas.Brush.Style := bsClear (da text bude transparentan).
4) Na kraju se bitmapa iscrta na/u lokaciju/rect odakle je i uzeta (opet preko DC-a iz 1) ).

Ovo sve je proradilo na D7. Sad cu da popravim pomenuti komponent MXCaption (da bi bilo sto manje izmena u ostatku package-a), i to je to.

Hvala svima na pomoci i podrsci.

Pozz
[ Rapaic Rajko @ 24.05.2016. 08:22 ] @
Po svemu sudeci, prerano sam se obradovao.

O cemu se radi? Pomenuti komponent MXFormCaption osim iscrtavanja Caption-a, radi i handling poruka za Owner formu. Tu je problem, taj handling vise nije adekvatan. Recimo, kad radim move forme (klikom na Caption bar), ne poziva se Repaint, i naravno nema nista ni od Caption-a. Isto je kad misem samo predjem preko sistemskih ikona (Mazimize, Minimize, Close) - one zasijaju, Caption bar se osvezi i opet nista od Caption-a.

Ima li neko link na neki API za ovo? Pretpostavljam da postoje neke nove poruke koje treba handle-ovati, ili tako nesto? Svaka pomoc je dobrodosla.

Pozz (hvala unapred!)
[ tkaranovic @ 24.05.2016. 15:03 ] @
Nisam skoro slao fajl uz poruku pa se nadam cu moci sa browserom koji koristim...

Evo saljem primer TNT main forme u koju se moze ucitati forma koja nema unikod.
Treba samo dodati main tnt formu i u nju ubaciti obicnu.
U trimeru je to na click forme.

Ovo je sa d2007 ali pretpostavljam da moze da radi i u d7.

Na ovaj nacin s lako moze dodati TNT forma koja ce prikazivati cirilicu i ne mora se menjati postojeca forma.
jedino treba skloniti postojecoj formi caption i nece se ni primecivati da postoje dve forme.
[ savkic @ 24.05.2016. 15:35 ] @
> adekvatan. Recimo, kad radim move forme (klikom na Caption bar), ne poziva se Repaint, i naravno nema nista ni od Caption-a. Isto je
> kad misem samo predjem preko sistemskih ikona (Mazimize, Minimize, Close) - one zasijaju, Caption bar se osvezi i opet nista od Caption-a.
> Ima li neko link na neki API za ovo? Pretpostavljam da postoje neke nove poruke koje treba handle-ovati, ili tako nesto? Svaka pomoc je dobrodosla.

Evo pogledaj u prilogu imaš formu koja sve to radi (custom tekst, background i dugmici).
[ Rapaic Rajko @ 25.05.2016. 09:17 ] @
tkaranovic, hvala - ali to resenje je za mene bas rogobatno, forma na formi... uh. Ostaje kao rezerva .

Igore, pogledao sam kod koji si prilozio; nece raditi, pisan je za starije Windows-e (do XP-a). Odmah sam video da se koristi DC koji se dobija sa GetWindowDC(Form.Handle). Svaki pokusaj ispisa/crtanja (preko tog DC-a) na Caption bar-u (recimo klikom na neko dugme), nece da moze. Nisam dzabe rekao da je Caption bar nedodirljiv.
Ali handling poruka, e to se vec moze iskoristiti; pokusacu to da iskombinujem sa mojim iscrtavanjem preko DC := GetWindowDC(0). (bice da si tako i mislio )

Pozz ljudi, i veliko hvala
[ tkaranovic @ 25.05.2016. 16:54 ] @
Mislio sam da ces poceti da razmisljas o unikodu kao resenju a tnt primer je ocigledan primer za pravac.
Isto tako o tome da ne mora da se crta (sto je meni rogobatno), pogoto ne po desktopu.

Recimo ovaj kod stavlja cirilicno c, sa D2007 i radi na win7, i ako prozor (kao) nije unikod.

Code (delphi):


var
  Message: TMessage;
  Value: WideString;
begin
  Value := WideChar(1115);
  Message.Msg := WM_SETTEXT;
  Message.lParam := lParam(PWideChar(Value));

  DefWindowProcW(Handle, WM_SETTEXT, 0, lParam(PWideChar(Value)));

 


Ako je potrebno negde moze da se proba i ovo:

Code (delphi):


SetWindowLongW(Handle, GWL_WNDPROC, GetWindowLong(Handle, GWL_WNDPROC));

 


To setuje prozor na unikod. Mada ove gore ili radi ili, ako ne radi, ovo dole ne pomaze.
[ Rapaic Rajko @ 26.05.2016. 08:28 ] @
tkaranovic: hvala veliko .

Prvi primer radi (WM_SETTEXT), i moram reci da sam od pocetka razmisljao kako ici u tom pravcu, ali nisam znao KAKO.

Pozz (dodjem pice/uslugu/sta_vec )

[Ovu poruku je menjao Rapaic Rajko dana 26.05.2016. u 09:45 GMT+1]
[ savkic @ 29.05.2016. 22:55 ] @
> Igore, pogledao sam kod koji si prilozio; nece raditi, pisan je za starije Windows-e (do XP-a). Odmah sam video da se koristi DC
> koji se dobija sa GetWindowDC(Form.Handle). Svaki pokusaj ispisa/crtanja (preko tog DC-a) na Caption bar-u (recimo klikom na neko
> dugme), nece da moze. Nisam dzabe rekao da je Caption bar nedodirljiv.
> Ali handling poruka, e to se vec moze iskoristiti; pokusacu to da iskombinujem sa mojim iscrtavanjem preko DC := GetWindowDC(0). (bice da si
> tako i mislio ;))

Zasto mislis da GetWindowDC nece raditi, on je upravo i tome namenjen?
Inace prg radi u praksi i (crta dobro) i na win10 (kao i win7 i win 8).

BTW ovo rešenje od tkaranovica je zgodno.
[ Rapaic Rajko @ 31.05.2016. 07:33 ] @
Igore, moguce je da taj program sa GetWindowDC(Form1.Handle) radi, ali zahvaljujuci ugradjenom message handling-u (koji je auh slozen, ako cemo pravo).

Ja sam probao crtanje na prosti button click, Aero ne da ni prici Caption bar-u (sto se tice crtanja po njemu).

Ovo sto je tkaranovic pokazao je pravo resenje. Stvar je u tome da svaka forma koju ti Windows napravi JESTE unicode; problem je sto stariji Delphi 7 formu 'vidi' kao non-unicode. Pozivanje Form1.Caption := ... nema efekta, jer ne mozes proturiti WideString Caption (parametar) kroz non-unicode poruku/message. Pomenuta linija koda (DefWindowProcW()) je upravo nacin da se obratis unicode formi (zaobidjes D7) i nateras je da odradi unicode poruku/message. Sve u svemu, forum je mocan .

Pozz
[ tkaranovic @ 31.05.2016. 10:36 ] @
Upravo tako, ako d7 negde hoce da stavi caption onda ga treba spreciti ili pono staviti unikodni.

Taj unikod verovatno radi on WIN NT, a ako nekome treba za neki WIN pre NT verovatno ce morati da crta.
U tom slucaju sam (za WIN 98 recimo) napisao da mozda moze da se setuje na unikod prvo,
ali ako nisu unikod onda se verovatno nece moci ni setovati. To setovanje verovatno radi samo
na novijim i sa IsWindowUnicode se onda cita samo razlicita vrednost.