AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

wndproc geht nicht

Ein Thema von milurt · begonnen am 19. Jun 2022 · letzter Beitrag vom 1. Jul 2022
Antwort Antwort
Seite 1 von 2  1 2      
milurt

Registriert seit: 16. Dez 2020
30 Beiträge
 
#1

AW: wndproc geht nicht

  Alt 20. Jun 2022, 11:03
jetzt habe ich das und es funktioniert immer noch nicht:

Code:
program bspforum01chg2;

  uses
  wintypes,
  Winprocs;

  Var
    Cls:WNDCLASSEX;
    dk,db,dm:ShortInt;

  Function wndproc(hwnd1:HWND;m,w:word;l:longint):LongInt;stdcall;
  Begin
    wndproc:=DefWindowProc(hwnd1,m,w,l);
  End;

  Function regwin:Integer;
  Begin
    cls.cbSize:=sizeof(cls);
    cls.style:=CS_HREDRAW Or CS_VREDRAW;
    cls.lpfnWndProc:=Addr(wndproc);
    cls.cbClsExtra:=0;
    cls.cbWndExtra:=0;
    cls.hInstance:=GetModuleHandle(nil);; {IH}
    cls.hIcon:=winprocs.LoadIcon(0, IDI_APPLICATION);
    cls.hCursor:=0;
    cls.hCursor:=0;
    cls.hbrBackground:=(14 + 1);
    cls.lpszMenuName:=NiL;
    cls.lpszClassName:='Win here'#0;
    cls.hIconSm:=LoadIcon(cls.hInstance, IDI_APPLICATION);

    regwin:=winprocs.RegisterClassEx(cls);
  End;

  Function creWin:word;
    Var
      s2,s1:pchar;
      wndparent:hwnd;
      menu:hmenu;
      instance:thandle;
      param:pointer;
  Begin
    S1:='STATIC'#0;
    S2:='Win here'#0;
    wndparent:=0;
    menu:=0;
    instance:=0;
    param:=NiL;
    creWin:=winprocs.createwindow(s2,s1,ws_popup,60,40,300,200,
      wndparent,menu,instance,param);
  End;

  Var hwnd1:hwnd;

  procedure draw4(hwnd1:hwnd;x,y,wid,hei:word;r,g,b:byte);
    Var
      DC,bp:HDC;
      xx,yy:LongInt;
      PaintStrc:wintypes.TPAINTSTRUCT;
  Begin
    DC:=winprocs.getdc(hwnd1); {device context of window}
    PaintStrc.hdc:=DC;
    PaintStrc.ferase:=false;
    PaintStrc.rcpaint.left:=0;
    PaintStrc.rcpaint.top:=0;
    PaintStrc.rcpaint.right:=X+wid;
    PaintStrc.rcpaint.bottom:=Y+hei;
    bp:=winprocs.BeginPaint(hwnd1,PaintStrc);
    for yy:=1 To hei Do
      For xx:=1 To wid Do
      Begin
        winprocs.SetPixel(dc,x+xx,y+yy,(((r*256)+g)*256)+b);
      End;
    winprocs.EndPaint(hwnd1,PaintStrc);
    releasedc(hwnd1,dc);
  end;

  var msgptr:tagmsg;
  hAccelTable:Haccel;

  procedure readkm;
  begin
    while GetMessage(msgptr, hwnd1, 0, 0) do
    begin
      if (TranslateAccelerator(msgptr.hwnd, hAccelTable,msgptr))<>0 then begin
        TranslateMessage(msgptr);
        DispatchMessage(msgptr);
      end;
    end;
    case msgptr.message of
      $100:dk:=+1;
      $101:dk:=-1;
      $201:db:=+1;
      $202:db:=-1;
      $200:dm:=-1*dm;
      $204:db:=2;
//      $015:Begin showwindow(hwnd1,sw_show);
//        updatewindow(hwnd1);End;
    end;
  end;

Begin
  dk:=-1;db:=-1;dm:=-1;
  regwin;
  hwnd1:=crewin;
  msgptr.hwnd:=hwnd1;
  showwindow(hwnd1,sw_show);
  updatewindow(hwnd1);
  draw4(hwnd1,00,00,70,30,$40,$40,$40);
  Repeat
    readkm;
    if dk=-1 Then draw4(hwnd1,02,02,20,20,$C0,$00,$00)
      else draw4(hwnd1,02,02,20,20,$80,$80,$00);
    if db=-1 Then draw4(hwnd1,24,02,20,20,$00,$C0,$00)
      else draw4(hwnd1,24,02,20,20,$00,$80,$80);
    if dm=-1 Then draw4(hwnd1,46,02,20,20,$00,$00,$C0)
      else draw4(hwnd1,46,02,20,20,$80,$00,$80);
  Until db=2;
end.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.034 Beiträge
 
Delphi 12 Athens
 
#2

AW: wndproc geht nicht

  Alt 21. Jun 2022, 15:09
Vielleicht ist es einfacher wenn du uns sagst mit welcher Delphi Version du was erreichen willst? Evtl. ist dann ein ganz anderer Ansatz der richtige..?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#3

AW: wndproc geht nicht

  Alt 21. Jun 2022, 15:54
Zitat:
Vielleicht ist es einfacher wenn du uns sagst mit welcher Delphi Version du was erreichen willst? Evtl. ist dann ein ganz anderer Ansatz der richtige..?
joar

Zitat:
wie
Auf die Messages reagieren
oder GetAsyncKeyState
oder GetKeyState (innerhalb irgendeiner Message)
oder anderes Zeugs, z.B. aus DirectX und Co.


So wie in #3 (mit Message-Loop und der richtigen registrieren Klasse) funktioniert es, in halbwegs aktuellen Windowsen und in allen Delphis der letzten 15 Jahre und vermutlich auch mehr.



Was macht im readkm das CASE außerhalb der Schleife?


zum Code aus #8:
Wenn jemand (DU) den Debugger benutzten würde,
dann viele vielleicht auf, dass das Programm im CreateWindow in creWin hängen bleibt
und nachfolgend natürlich die externe Messagebeandlung & Tastenprüfung demnach auch garnichts machen kann.

Und ab Delphi 11 bekommt man auch noch wunderschön einen RuntimError 201 um die Ohren gehauen,
da dort die Bereichsprüfung (RangeCheck) nun im Debug-Profil standardmäßig aktiv ist.




Und wer ein eigentliches "HauptFenster" als Popup (WS_POPUP) deklariert, der braucht sich nicht wundern, wenn es etwas "anders" auf Tastatur/Maus/Fokusteuerung reagiert.




PeekMessage ohne Pausen, lässt die CPU nur ein bissl unnötig viel arbeiten.

PeekMessage+MsgWaitForMultipleObjects (siehe DelayDelay) oder GetMessage sind da sparsamer. (aber funktionell ist es erstmal egal)







Lesetipps:

https://www.delphi-treff.de/tutorial...ierung/nonvcl/

und auch mal da durchstöbern

https://www.michael-puff.de/ (das menü unten funktioniert nicht mehr, daher siehe nachfolgenden Link)
http://web.archive.org/web/201804300...chael-puff.de/



PS: Wenn wndprocnur noch DefWindowProc macht, dann kann man das auch gleich ganz weglassen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (21. Jun 2022 um 16:23 Uhr)
  Mit Zitat antworten Zitat
milurt

Registriert seit: 16. Dez 2020
30 Beiträge
 
#4

AW: wndproc geht nicht

  Alt 21. Jun 2022, 23:09
ja, ich habe die case in readkm kurz nach dem forum
in die schleife getan und es hat auch nicht funktioniert.
wm_popup: ich wollte nicht so mit zwei fenstern
arbeiten sondern ein fenster das ich (border,...)
gestalten kann.
derzeit habe ich community10.4 und möchte win 64bit
programme schreiben auch wenn es akzeptabel ist wenn
sie vor win10 noch laufen (32bit,16bit).
ich möchte erzählen dass ich später nicht nur keydown
haben will, sondern auch den letter von der tastatur,
aber wenn nicht mal das ging sollte ich das warum
machen?
himitsu, was ist #3 und #8 bei dir da?
mein debugger überspringt in readkm $100 zu $101
und von dort zu getmessage.
wenn ich call readkm weglasse werden die drei vierecke
gezeichnet, ansonsten nur das grosse graue.
deine webseiten haben nichts gebracht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#5

AW: wndproc geht nicht

  Alt 22. Jun 2022, 09:57
himitsu, was ist #3 und #8 bei dir da?
Schau mal im Forum bei den einzelnen Posts oben rechts in die Ecke.

Wenn neues Delphi, dann schmeiß die uralten Units raus und verwende die Aktuellen,
denn wintypes und winproc gibt es schon seit Jahrzehnten nicht mehr. (du kannst froh sein, dass standardmäßig in Projektoptionen > Delphi-Compiler > Unit-Aliase etwas drin steht)

ja, ich habe die case in readkm kurz nach dem forum
in die schleife getan und es hat auch nicht funktioniert.
Ja, theoretisch würde es dann gehn, wenn ... dein Programm nicht vorher hängen bleiben würde (siehe meine letzte Antwort).
Oder wenn es durch GetMessage nicht in der Schleife hinge und deine Rechtecke aus draw4 nicht öfters gelöscht/üermalt würden, als du sie neu zeichnen lässt.

WM_POPUP hat nichts hat nichts direkt mit der Fenstergestaltung zu tun. Dafür gibr es andere Attribute.
Es steuert wird das Fenster reagiert ... eben wie ein POPUP, also was selbstgebautes ähnlich einem PopupMenü, MainMenü oder dem DropDown einer ComboBox.

nicht nur keydown haben will, sondern auch den letter von der tastatur
Wenn man statt nichtssagender Nummern die passenden Konstanten verwenden würde, dann könnte man auch in der Hilfe danach suchen
und fände raus, dass dort die Taste ebenfalls in der Message drin steckt und wie man da dran kommt.

MSDN-Library durchsuchenWM_KEYDOWN/WM_KEYUP ala TForm.OnKeyDown/OnKeyUp liefert den ScanCode (Code der Taste, noch ohne Übersetuung des KeyboardLayouts) und die ModifierKeys (Strg/Alt/Shift)
MSDN-Library durchsuchenWM_CHAR als TForm.OnKeyPress



mein debugger überspringt in readkm $100 zu $101
und von dort zu getmessage.
wenn ich call readkm weglasse werden die drei vierecke
gezeichnet, ansonsten nur das grosse graue.
Nja, mit GetMessage hat du ein großes Problem ... das Programm wartet dort, bis zur nächsten Message.

Mit PostMessage rannte es immer in der schleife und dadurch wurden auch die Rechtecke "immer wieder" neu gemalt.
Fällt nicht kaum auf, wenn Windows das Fenster neu malt und damit deine Rechtecke übermalt. (sie dann ganz kurz weg sind, bis zum nächsten Malen der Rechtecke)

Eigentlich gehört das Malen der Rechtecke besser ins WM_PAINT (ala OnPaint bei TForm oder TPaintBox)
und beim Ändern des Status, durch Taste/Maus, löst man ein Repaint aus.

In aktuellen Windowsen hast du noch Grlück, dass der WindowsDesktoManager mehr zwischenspeichert ... bei älteren Windows hättest du noch mehr Probleme, weil dort noch öfters das Fenster neu gemalt würde (es deine Rechtecke übermalt).


Zitat:
deine webseiten haben nichts gebracht.
Wenn man direkt mit der WinAPI (GDI) arbeiten will, dann sollte man da bissl Grundlagen kennen und wissen wo die Dokumentation zu finden ist (MSDN bzw. Win32-SDK).
Für eine Suche bezüglich Delphi, da nennen wir sowas gern mal NonVCL (also "ohne die VCL" und somit ohne so Zeugs wie TForm und TPaintBox/TImage oder TShape und OnKeyDown/OnKeyPress/OnMouseMove, was man hierfür verwenden könnte)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (22. Jun 2022 um 10:00 Uhr)
  Mit Zitat antworten Zitat
milurt

Registriert seit: 16. Dez 2020
30 Beiträge
 
#6

AW: wndproc geht nicht

  Alt 22. Jun 2022, 13:39
sind wintypes,winprocs jetzt 16bit obwohl ich
nur 1x C:\windows habe, das 64bit ist?
öfter übermalt: ich errinnere mich, das ich die
reaktion früher anders gemacht habe und nur
auf keydn ohne keyup zeichnete.
wenn getmessage auf eingabe wartet, soll ich
also doch wieder wndproc benutzen?
wenn man wm_popup macht, heisst das also
das ich wndproc keydn nicht mehr nutzen kann?
ich habe schon verstanden, dass nach keydn
man wparam braucht, wollte aber es nicht
programmieren. denn da war so viel von
shiftstate-read die rede und die taste liest man
doch von wndproc, die nicht window-style heisst.
"Wenn man mit der WinAPI (GDI) arbeiten will":
willst du sagen ich kann setpixel nicht gebrauchen?
mein problem sind doch keyboard und mouse.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: wndproc geht nicht

  Alt 22. Jun 2022, 16:41
willst du sagen ich kann setpixel nicht gebrauchen?
Er wollte wohl eher vermitteln das man unter Non-VCL sich alle Informationen via Microsoft besorgen kann, wie das erwähnte SetPixel.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
milurt

Registriert seit: 16. Dez 2020
30 Beiträge
 
#8

AW: wndproc geht nicht

  Alt 24. Jun 2022, 13:40
ich habe es geschafft, danke.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.034 Beiträge
 
Delphi 12 Athens
 
#9

AW: wndproc geht nicht

  Alt 25. Jun 2022, 10:21
ich habe es geschafft, danke.
Som du hast es also geschafft. Aber mit welchem Ansatz?
Magst du verhindern, dass wir diesbezüglich dumm sterben?
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#10

AW: wndproc geht nicht

  Alt 25. Jun 2022, 11:08
Zitat:
Magst du verhindern, dass wir diesbezüglich dumm sterben?
Wird er wohl nicht können.
Denn bekanntlich sterben wir alle dumm andernfalls würden wir ewig leben.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz