Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   [nonVCL] Automatisch verschwindender Text in Edit Box (https://www.delphipraxis.net/183639-%5Bnonvcl%5D-automatisch-verschwindender-text-edit-box.html)

lbccaleb 25. Jan 2015 09:26

[nonVCL] Automatisch verschwindender Text in Edit Box
 
Hallo,

Ihr kennt doch bestimmt diese Eingabe Boxen die in den mit blauem Text z.B. steht "Hier den blabla Text" einfügen.
Wenn man dann in die Edit Box klickt, verschwindet der Text automatisch und die normale Eingabe startet.

Nun also die Frage: Kann ich das OHNE VCL auch machen, oder muss ich mir das selber irgendwie zusammen bauen? Wenn ja, wie?

mfg Martin

jaenicke 25. Jan 2015 09:30

AW: [nonVCL] Automatisch verschwindender Text in Edit Box
 
Ich glaube das konnte man per Windows Message setzen, das kam glaube ich von Windows selbst...

// EDIT:
Kurz mal in die Doku geschaut, die Message ist EM_SETCUEBANNER:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

lbccaleb 25. Jan 2015 09:32

AW: [nonVCL] Automatisch verschwindender Text in Edit Box
 
Vielen Dank!
Ich wusste nicht wonach ich suchen sollte...

lbccaleb 27. Jan 2015 16:51

AW: [nonVCL] Automatisch verschwindender Text in Edit Box
 
Jetzt muss ich mich doch nochmal hier melden, also das MSDN sagt:

Zitat:

You cannot set a cue banner on a multiline edit control or on a rich edit control.
Nun ist natürlich genau das mein Problem. Wie kann ich das ganze in einem Multiline Control erzeugen? Hat da vllt. jemand eine Idee für mich?

himitsu 27. Jan 2015 17:26

AW: [nonVCL] Automatisch verschwindender Text in Edit Box
 
Genauso, wie es viele Webseiten immernoch machen.

Hinweis-Text als TEXT reinschreiben (eventuell Rextfarbe ändern) und im OnEnter oder beim ersten Tastenklick den Text wieder löschen und im OnExit wieder anzeigen (wenn Text leer). :roll:
Alternatov ein eigenes OnPaint, das bei leer was anderes reinmalt (macht cue-banner intern auch nicht anders)

lbccaleb 29. Jan 2015 22:07

AW: [nonVCL] Automatisch verschwindender Text in Edit Box
 
Also lauffähig hab ich es jetzt, mit nur einem kleinen Problem, jedesmal wenn ich was eingebe in das Memo, und dann das Memo den Fokus verliert und dann wiederbekommt, verschwindet der Text (ist noch da aber nicht mehr sichtbar). Erst wenn ich den Text markiere oder änder wird er wieder angezeigt, woran kann das liegen??

Delphi-Quellcode:
function MemoWndProc(hEdit: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
 rc: TRect;
 OldFont: HFONT;
 S: string;
 DC: HDC;
 PaintStruct: TPaintStruct;
begin
  case uMsg of
    WM_PAINT:
      begin;
        DC := BeginPaint(hEdit, PaintStruct);

        GetClientRect(hEdit, rc);
        SetBkMode(DC, TRANSPARENT);
        OldFont := SelectObject(DC, hAppFont);

        if (Length(GetText(hEdit)) < 1) and (GetFocus <> hEdit) then begin;
          case GetDlgCtrlID(hEdit) of
            IDC_MEMO1: S := szKBText;
            IDC_MEMO2: S := szReccFarmsText;
          end;
        SetTextColor(DC, GetSysColor(COLOR_GRAYTEXT));
        DrawText(DC, PChar(S), Length(S), rc, DT_CENTER or DT_VCENTER or DT_NOPREFIX or DT_WORDBREAK);
        end;

        SelectObject(DC, OldFont);
        ReleaseDC(hEdit, DC);
        DeleteObject(OldFont);

        EndPaint(hEdit, PaintStruct);
        Result := 0;
     end
  else
    Result := CallWindowProc(OldWndProc, hEdit, uMsg, wParam, lParam);
  end;
end;

Sherlock 30. Jan 2015 13:20

AW: [nonVCL] Automatisch verschwindender Text in Edit Box
 
Musst Du Dir halt merken, ob der Cuetext oder der Anwendertext drin steht...

Sherlock

lbccaleb 30. Jan 2015 17:01

AW: [nonVCL] Automatisch verschwindender Text in Edit Box
 
Hallo Sherlock,
wie genau meinst du das? Also der CueText steht ja gar nicht drin, sondern wird einfach nur "drübergepinselt".
Wie gesagt, das funktioniert alles. Nur hab ich das Problem, das halt der selbst eingegebene Text verschwindet, wenn das Control den Fokus wiedererlangt.
Wenn man dann den darin stehenden Text markiert oder ebend um einen Buchstaben ergänzt (oder aber auch löscht) erscheint er wieder. der Text steht also noch im Control, es macht aber den Anschein als würde der Text in der Farbe des Controls eingefärbt wenn es den Fokus wiedererlangt.

Der Effekt ist auch vorhanden, wenn ich alles ausklammer in der OnPaint Methode und quasi nur dieses übrig lasse:

Delphi-Quellcode:
function MemoWndProc(hEdit: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
 rc: TRect;
 OldFont: HFONT;
 S: string;
 DC: HDC;
 PaintStruct: TPaintStruct;
begin
  case uMsg of
    WM_PAINT:
      begin;
        DC := BeginPaint(hEdit, PaintStruct);
        EndPaint(hEdit, PaintStruct);
        Result := 0;
     end
  else
    Result := CallWindowProc(OldWndProc, hEdit, uMsg, wParam, lParam);
  end;
end;

Wo kann denn dort nen Fehler sein, das verstehe ich nicht.


Edit:
Also ich bin jetzt schon mal so weit zu sagen, das es an dem
Delphi-Quellcode:
 or ES_MULTILINE
liegt:

Delphi-Quellcode:
       CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '', WS_CHILD or WS_VISIBLE or WS_VSCROLL {or ES_MULTILINE }or ES_NOHIDESEL or ES_WANTRETURN, 5, 155, 200, 110, hWnd, IDC_MEMO2, hInstance, nil);


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz