Autor | Thema: Messagehandling | | Datum:29.04.02 17:01 
(ps@burghardt-ib.de) | |
Hallo, ich arbeite gerade an einem Programm das ein ListViewControl verwendet. Wenn ich auf den Header des ListViews klicke, sollten die Daten nach bestimmten kreterien sortiert werden. (In etwa so als wenn man im Explorer auf "Typ" klickt, damit die Dateien nach Dateityp sortiert werden) Daimt ich das überhaupt mitbekomme habe ich mich mit Messagehandling beschäftigt und bin auf gewaltige Probleme gestoßen. Kurzum ich hab es mit den Profan-Befehlen (GetMessage usw)nicht geschafft, dem Problem Herr zu werden, da besonders %NotifyCode mir irgendwie immer nur unvollständiges zurückliefert (ich hab den Eindruck, dass über Profan Messages des Queues verlorengehen.) Deshalb bin ich auf die Apifunktionen GetMessage, TranslateMessage und DispatchMessage ausgewichen und auf ein weiters Problem gestoßen: GetMessage soll laut api-doc immer einen wert <> 0 zurückgeben, es sei denn es ist eine wm_Quit, also Programmende aufgetreten, bei mir ist es aber permanent 0. DA kann doch nicht ständig wm_quit auftreten ?????
Kleines Beispiel:
def @GetExtMessage(4) !"user32.dll","GetMessageA"
def @DispatchMessage(1) !"user32.dll","DispatchMessageA"
def @TranslateMessage(1) !"user32.dll","TranslateMessage"
declare back_msg%
declare MSG#,msg& 'Messagestruktur anlegen
struct MSG = hwnd&,message&,w_param&,l_param&,time&,pt&
dim MSG#,MSG
let msg& = msg#
windowstyle 528 'Schließen manuell übernehmen
window 100,100-200,200
Seterrorlevel -2 'Handling durch Profan abschalten
whilenot @equ(%key,2)
let back_msg% = @GetExtMessage(msg&,%hwnd,0,0) 'Messages abholen
Print "Message: ",MSG#.message&,"back: ",back_msg%
DispatchMessage (msg&)'Message zurück zu Windows
wend
end
verwendetes Os:Win 2000, Profan-Runtime 7.0e
Bitte helft mir...
Philipp Sternberg
|
| | Datum:29.04.02 18:28 
| |
Hallo.
Zuerst mal: Ich kein absolut kein Message-Profi !
Aber meines Erachtens nach kannst du die Message API's nicht mit Profan benutzen. Das gesamte Message-Handling deines Programms muß in einer Prozedur stehen, deren Zeiger du dann an Windows übergibst. Das geht aber mit Profan nicht, da keine Programmadressen ermittelt werden können...
Sorry.
Gruß, Frank
|
| | Datum:29.04.02 18:48 
(ps@burghardt-ib.de) | |
Hmm, du meinst also ich sollte die Profan fubktionen getmessage nehmen ??
Komisch irgendwie scmeißen die andere werte raus als GetMessage
alles sehr merkwürdig ....
Philipp Sternberg
|
| | Datum:29.04.02 19:13 
(ps@burghardt-ib.de) | |
So, hier noch mal ein weiteres beispiel:
normalerweise sollte der Button einen wm_command (273) auslösen (genauso wie das Systemmenü), aber es tut sich einfach nichts ! Weiterhin ist mir aufgefallen, dass sich manchmal %LastMessage ändert obwohl %Message gleichgeblieben ist, darf doch eigentlich gar nicht sein oder ???
windowstyle 536 'Schließen manuell übernehmen
window 100,100-400,200
declare back_msg%,ende%,bu_calc%
let bu_calc% = @control ("BUTTON","&Berechnen",$50010000,206,120,112,22,%hwnd,222,%hinstance,$20000)
Seterrorlevel -2 'Handling durch Profan abschalten
whilenot ende%
GetMessage 'Messages abholen
color 0,15
Print "Message: ",%message,%LastMessage,"Notify;",%NOTIFYCODE
if @equ(%message,273) 'wm_command
color 15,0
case @equ(@div&(&WParam,256)) : let ende% = 1
Print "identify: ",@div&(&WParam,256)," loword: ",@and(&WParam,256)," handle:",@word(MSG#,12)
elseif @equ(%message,274) 'wm_syscommand
case @equ(&WParam,61536) : let ende% = 1 'sc_close
endif
case @gt(%csrlin,8) : locate 1,1
wend
end
vielleicht kann mir da auch nur Roland weiterhelfen ..
wie gesagt, runtime 7.0e-NT unter win2k
bis dann
|
| | Datum:29.04.02 19:33 
(joerse@gmx.de) | |
Hallo,
Vielleicht hilft's, wenn Du die Messages, die Du benötigst als usermessages definierst.
Gruß
Jörg
|
| | Datum:29.04.02 19:47 
(ps@burghardt-ib.de) | |
Wie bitte soll ich diese Usermessage denn an mein Hauptfenster absetzen oder besser gesagt von wo??? Ich möchte doch herausfinden ob eines meiner Child-fenster irgendeine Message an mein Hauptfenster gesendet hat oder nicht, ich kann dem childfenster ja schlecht sagen dass es ne usermessage absetzen soll bzw, dass kann ich nur wenn ich vorher dessen wirkliche message kenn, die ich aber nicht erhalte (im übrigen wäre es reichlich unproduktiv usermessages an sich selbst zu schreiben um diese dann auszuwerten)
nein, dass ist mit sicherheit keine Lösung
Philipp
|
| | Datum:30.04.02 11:00 
(Pascalxd@owl-online.de) | |
Hallo Philipp!
Die Auswertung von WM_NOTIFY lässt in der Tat zu wünschen übrig...
Jedenfalls: Ob irgendein HeaderButton angeklickt wurde, lässt sich ja über %Notifycode
erkennen: -302, wenn das LV den Focus vorher schon hatte, -7, wenn nicht.
Die Abfrage, welcher HeaderButton betroffen ist, wird wohl nur über die Maus-
position möglich sein. Entweder durch einen direkten Vergleich oder indem du
per LVM_GETHEADER (ab Comctl32.dll 4.7) das Handle des Headers ermittelst und
darauf HDM_HITTEST anwendest (alles ohne Gewähr, weil noch nicht getestet).
@ Roland: Wie wäre es mit einem Befehl, mit dem man Profan mitteilt, welche Notify-
Message man auswerten möchte (wenn sie eintrifft) und für den man eine entsprechene
Bereichsvariable zur Verfügung stellt?
HTH
Pascal
|
| | Datum:30.04.02 12:54 
(ps@burghardt-ib.de) | |
Dank an Uwe.
Vielen Adn, ja, so wird es wahrscheinlich gehen, mein problem ist nur dass ich ständig auf der suche nach konstanten bin. So besitze ich leider auch kein commctrl32.h v4.7 woher bekommst du die denn immer (apropos, ab welchem OS ist die common control 4.7 denn dabei ??)
Philipp
|
| | Datum:30.04.02 16:26 
(webmaster@yatil.de) | |
Bei Windows ME ist die Version 5.81 dabei...
MfG, Eric
|
| | Datum:01.05.02 10:57 
| |
Hi,
Alle Konstanten sind in der Datei "Windows.inc" vorhanden. Das ist eine Datei, die Assembler benutzen, aber die Werte nützen dir natürlich auch in Profan. Such' mal per Google.de
Gruß, Frank
|
| | Datum: 01.05.02 23:23 
(Pascalxd@owl-online.de) | |
Hallo Leute!
Ich habe vor einiger Zeit am Kiosk das "PC-Magazin"-Sonderheft "C++ und Java"
gefunden. Da waren massenhaft halbwegs aktuelle C-Header und API-Infos (im chm-Format)
drauf. Dazu musste man VC++ nicht mal installieren, was ich aber erst hinterher
gemerkt habe ;-}
Ansonsten: Einfach mal im WWW nach einer markanten Konstantenbezeichnung suchen.
BTW: Unter http://support.microsoft.com/servicedesks/fileversion/default.asp
kann man für jede MS-dll die möglichen Versionen erfragen und mit welchem OS, Update
oder Programm diese "ausgeliefert wurde", sprich: auf den Rechner gekommen ist.
So einen Service hätte ich Microsoft garnicht zugetraut...
P.S. Die Comctl32.dll ist schon in Win95 + IE 3.x enthalten!
SeeYou
Pascal
|
|
|