Autor |
Beitrag |
Tana´Ri
      
Beiträge: 230
|
Verfasst: Mo 08.09.03 14:25
Hi leute,
meine Frage zielt auf die bearbeitung nach
Delphi-Quelltext 1:
| HSTATIC := createwindow('STATIC', '', SS_BLACKFRAME or WS_VISIBLE or WS_CHILD, 130, 10, 100, 30, hwnd, IDSTATIC, hInstance, nil); |
ab.
Und zwar weiß ich nicht wie ich jetzt einen Text in STATIC schreib, WM_SETTEXT funktionierte bei mir nicht, und soviel mit nonVCL hab ick noch net jemacht. Wenns irgendwo ein gutes tutorial bzw Sites zur weiteren Verarbeitung (nach Create) gibt; her damit  geht schließlichendlich net nur um STATIC sonder um alle.
ps: Tutorial Erstellen eigener Klassen und nonVCL v. Assarbad hab ick
Moderiert von Motzi: Topic verschoben
_________________ mfg
Tana´Ri
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: So 20.06.04 08:40
Ich hatte gerade ein ähnliches Problem und beim rumgoogeln habe ich diesen Uraltbeitrag gefunden. Hier eine Möglichkeit:HSTATIC := createwindow('STATIC', 'Hello world', SS_LEFT or WS_VISIBLE or WS_CHILD, 130, 10, 100, 30, hwnd, IDSTATIC, hInstance, nil);
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 20.06.04 21:24
Tana´Ri hat folgendes geschrieben: | WM_SETTEXT funktionierte bei mir nicht, |
Je ganuer die fehlerbeschreibung, desto besser kann dir geholfen werden. Oder sollen wir jetzt alle raten, was "funktioniert nicht" bei dir bedeutet?
Aber kuck mal hier: tutorials.luckie-online.de
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 21.06.04 16:03
Zitat: | WM_SETTEXT funktionierte bei mir nicht |
ist in dem Fall eine ausreichende Fehlerbeschreibung  , da er an sich nichts falsch gemacht hat. Ursache ist SS_BLACKFRAME; entfernt man diesen Stil, dann hat man ein gewöhnliches Textfeld, das auch problemlos via WM_SETTEXT oder "SetWindowText" mit eigenem Text versehen werden kann.
Wer bspw. das typische TPanel erzeugen will, der benutzt:
Delphi-Quelltext 1: 2:
| hwndLabel1 := CreateWindowEx(0,'STATIC',nil,SS_ETCHEDFRAME or WS_VISIBLE or WS_CHILD,15,25,160,60,hWnd,IDC_LABEl1,hInstance,nil); |
wobei im Gegensatz zur VCL hier der Text ignoriert wird. Im Beispiel steht zwar nil drin, aber selbst wenn man dort Text angibt wird er nicht angezeigt.
Das TBevel (benutzt man manchmal zur Abgrenzung zwischen den Buttons eines Dialogs und anderen Controls) erhält man mit SS_ETCHEDHORZ bzw. SS_ETCHEDVERT, wobei Breite und Höhe dann auch ignoriert werden. Ein horizontales Static-Control ist dann immer nur 2px hoch; ein vertikales immer nur 2px breit.
Wer das PSDK installiert hat, findet unter folgendem Link alles wichtige zu Static-Controls:
ms-help://MS.PSDK.1033/shellcc/platform/commctls/staticcontrols/staticcontrols.htm
Ansonsten spuckt das MSDN sicher auch was zu "STATIC CONTROLS" aus. In den o.g. Tutorials wird nämlich "nur" erwähnt, wie man das Static als Textfeld und als TImage nutzen kann.
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Mo 21.06.04 22:00
Wer hätte gedacht, dass ein Beitrag vom 08.09.03 noch mal so "aktiv" wird 
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 21.06.04 22:06
Du hast doch damit angefangen.
Ich habe nur gesagt, warum WM_SETTEXT nicht funktioniert.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 05.07.04 08:23
Da muss ich mich noch mal dranhängen.
Ich habe in einer Ressource ein Static auf einem Dialog. Im VC Ressourceneditor ist sonst nichts weiter angehakt. jetzt versuche ich in WM_INIDIALOG den Trennlinien-Stil zu setzteN.
Delphi-Quelltext 1:
| SetWindowLong(GetDlgItem(hDlg, 998), GWL_STYLE, GetWindowlong(GetDlgItem(hDlg, 998), GWL_STYLE) or SS_ETCHEDHORZ); |
Aber irgendwie sehe ich nichts. Ich könnte es natürlich auch mit CreateWindowEx erstellen, nur warum sollte ich, wenn ich doch eh einen Dialog in einer Ressource habe.
Und wen ich es so mache:
Delphi-Quelltext 1:
| CreateWindowEx(0, 'STATIC', '', WS_CHILD or WS_VISIBLE or SS_ETCHEDFRAME or SS_ETCHEDHORZ, 0, 90, 550, 2, hDlg, 998, hInstance, nil); |
Dann wird die Höhenangabe nicht ignoriert.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 05.07.04 11:09
Die letzte Frage kann ich dir, denke ich, beantworten: In dem Fall werden sich wohl "*FRAME" und "*HORZ" in die Quere kommen, weil die "*FRAME"-Konstante einen Rahmen zeichnen soll. Und der benötigt nun mal auch irgendwie eine Höhe. IMHO also entweder SS_ETCHEDFRAME oder SS_ETCHEDHORZ, aber nicht beides zusammen.
Hatte ich dir eigentlich die Panel-Demo damals mit den ganzen Korrekturen mitgeschickt? Wenn nicht, hier ist sie:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105:
| program StaticText;
uses Windows, Messages;
const ClassName = 'WndClass'; AppName = 'Static Control Styles'; const IDC_LABEL = 1;
function WndProc(wnd: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): LRESULT; stdcall; const dwRectStyles : array[0..5]of dword = (SS_BLACKFRAME,SS_BLACKRECT, SS_GRAYFRAME,SS_GRAYRECT, SS_WHITEFRAME,SS_WHITERECT); var rc : TRect; iRandom : dword; begin Result := 0;
case uMsg of WM_CREATE: begin GetClientRect(wnd,rc);
CreateWindowEx(0,'STATIC',nil,SS_ETCHEDHORZ or WS_VISIBLE or WS_CHILD,rc.Left + 15,rc.Top + 15,rc.Right - 30, 6000, wnd,IDC_LABEL,hInstance,nil);
CreateWindowEx(0,'STATIC',nil,SS_ETCHEDVERT or WS_VISIBLE or WS_CHILD,(rc.Right - rc.Left) div 2,rc.Top + 30, 6000, 25,wnd,IDC_LABEL,hInstance,nil);
CreateWindowEx(0,'STATIC',nil,SS_ETCHEDFRAME or WS_VISIBLE or WS_CHILD,rc.Left + 15,rc.Top + 65,rc.Right - 30,25,wnd, IDC_LABEL,hInstance,nil);
iRandom := Random(length(dwRectStyles));
CreateWindowEx(0,'STATIC',nil,dwRectStyles[iRandom] or WS_VISIBLE or WS_CHILD,rc.Left + 15,rc.Top + 100,rc.Right - 30,25,wnd, IDC_LABEL,hInstance,nil); end; WM_DESTROY: PostQuitMessage(0); else Result := DefWindowProc(wnd,uMsg,wp,lp); end; end;
var msg : TMsg; wc : TWndClassEx = (cbSize:sizeof(TWndClassEx); Style:CS_HREDRAW or CS_VREDRAW; lpfnWndProc:@WndProc; cbClsExtra:0; cbWndExtra:0; lpszMenuName:nil; lpszClassName:ClassName; hIconSm:0; ); begin Randomize;
wc.hInstance := hInstance; wc.hIcon := LoadIcon(0,IDI_WINLOGO); wc.hbrBackground := GetSysColorBrush(COLOR_3DFACE); wc.hCursor := LoadCursor(0, IDC_ARROW); if(RegisterClassEx(wc) = 0) then exit;
if(CreateWindowEx(0,ClassName,AppName,WS_CAPTION or WS_VISIBLE or WS_SYSMENU,integer(CW_USEDEFAULT),integer(CW_USEDEFAULT),200,170, 0,0,hInstance,nil) = 0) then exit;
while(GetMessage(msg,0,0,0)) do begin TranslateMessage(msg); DispatchMessage(msg); end; end. |
Warum das aber bei der Dialogressource nicht funktioniert, ... hm ...
Mal gucken.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 05.07.04 11:18
Ja, ohne geht es. War irgendwie durch das Rumprobieren noch drin.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 05.07.04 11:38
Hm, was die Dialoge angeht: Auf einen grünen Zweig bin ich so gesehen auch nicht gekommen. Es würde funktionieren, wenn du das Ressourcenskript manuell bearbeitest und im entsprechenden STATIC-Control das Attribut SS_ETCHEDHORZ (bspw.) setzt. Kompilierst du das Skript, wird auch der "Strich" richtig angezeigt.
Beim Laden des (gepatchten) Skriptes in den VS-Editor siehst du dann aber ein Control mit dem Stilvermerk "Rahmen". Es scheint, als könne man den TBevel-Stil nicht auf diese Weise setzen. Evtl. gilt das auch programmtechnisch.  Wenn ich nämlich tatsächlich ein "Rahmen"-Control habe:
Quelltext 1:
| CONTROL "",110,"Static",SS_ETCHEDFRAME,27,42,224,8 |
dann kann ich im Programm zumindest den Stil ändern, solange es ein Rahmen bleibt:
Delphi-Quelltext 1: 2: 3: 4:
| WM_INITDIALOG: SetWindowLong(GetDlgItem(hwndDlg,110),GWL_STYLE,(GetWindowLong( GetDlgItem(hwndDlg,110),GWL_STYLE) and not SS_ETCHEDFRAME) or SS_WHITEFRAME); |
Sobald ich aber SS_WHITEFRAME gegen SS_ETCHEDHORZ/VERT tausche, verschwindet das Control.
|
|
|