Autor Beitrag
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Mo 08.09.03 14:25 
Hi leute,

meine Frage zielt auf die bearbeitung nach
ausblenden Delphi-Quelltext
1:
HSTATIC := createwindow('STATIC''', SS_BLACKFRAME or WS_VISIBLE or WS_CHILD, 1301010030, 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 user profile iconMotzi: Topic verschoben

_________________
mfg
Tana´Ri
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: 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, 1301010030, hwnd, IDSTATIC, hInstance, nil);

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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



BeitragVerfasst: 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:
ausblenden 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 Suche im MSDN "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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Mo 21.06.04 22:00 
Wer hätte gedacht, dass ein Beitrag vom 08.09.03 noch mal so "aktiv" wird :roll:

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 21.06.04 22:06 
Du hast doch damit angefangen. :mrgreen:
Ich habe nur gesagt, warum WM_SETTEXT nicht funktioniert.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.
ausblenden 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:
ausblenden Delphi-Quelltext
1:
CreateWindowEx(0'STATIC''', WS_CHILD or WS_VISIBLE or SS_ETCHEDFRAME or SS_ETCHEDHORZ, 0905502, hDlg, 998, hInstance, nil);					

Dann wird die Höhenangabe nicht ignoriert.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden volle Höhe Delphi-Quelltext
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:
//
// STATIC Control Demo (Special styles)
// Copyright (c) 2004, Mathias Simmack
// based on "StaticText.dpr" by Michael Puff
//
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
        // Maße des Fensters ermitteln
        GetClientRect(wnd,rc);

        // horizontale Linie (= TBevel)
        CreateWindowEx(0,'STATIC',nil,SS_ETCHEDHORZ or WS_VISIBLE or
          WS_CHILD,rc.Left + 15,rc.Top + 15,rc.Right - 30,
          6000// <-- Höhe wird sowieso ignoriert
          wnd,IDC_LABEL,hInstance,nil);

        // vertikale Linie (= TBevel)
        CreateWindowEx(0,'STATIC',nil,SS_ETCHEDVERT or WS_VISIBLE or
          WS_CHILD,(rc.Right - rc.Left) div 2,rc.Top + 30,
          6000// <-- Breite wird durch "SS_ETCHEDVERT" ignoriert
          25,wnd,IDC_LABEL,hInstance,nil);

        // Box (= TPanel)
        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);

        // Rechteck (Stil und Farbe per Zufall)
        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;


//
// WinMain
//
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
  // Zufallsgenerator initialisieren
  Randomize;

  // Fensterklasse registrieren
  wc.hInstance     := hInstance;
  wc.hIcon         := LoadIcon(0,IDI_WINLOGO);
  wc.hbrBackground := GetSysColorBrush(COLOR_3DFACE);
  wc.hCursor       := LoadCursor(0, IDC_ARROW);
  if(RegisterClassEx(wc) = 0then exit;

  // Fenster erzeugen
  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) = 0then exit;

  // Nachrichtenschleife
  while(GetMessage(msg,0,0,0)) do
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;
end.

Warum das aber bei der Dialogressource nicht funktioniert, ... hm ... :oops:
Mal gucken.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 05.07.04 11:18 
Ja, ohne geht es. War irgendwie durch das Rumprobieren noch drin.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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.