| |
|
|
Detlef Jagolski | Hallo,
habe das Beispiel aus der Hilfe von XProfan 10 Umgebaut mit den neuen Funktionen von XProfan 11.
Hat einer eine Idee warum das nicht Klappt?
Gruß
Detlef KompilierenMarkierenSeparieren-Begin-----------------------------------------------------------------
-HeaderFiles---------------------------------------------------------
MESSAGES.PH
WINDOWS.PH
-Variables Declaration-----------------------------------------------
Declare Ende%, OldWndProc&, hButton%
Declare hText1%, TextBk1&, hText2%, TextBk2&, hText3%, TextBk3&
-CallBack Routine----------------------------------------------------
SubClassProc
If SubClassMessage(%hwnd, ~WM_CTLCOLORSTATIC)
-Fuer Text1 Farbe setzen---------------------------------------
If &sLParam = hText1%
~SetBkMode(&sWParam, ~TRANSPARENT)
~SetTextColor(&sWParam, @RGB($FF, $00, $00)) -Rot-----------
Return TextBk1&
Set(WinProc,1)
-Fuer Text2 Farbe setzen---------------------------------------
ElseIf &sLParam = hText2%
~SetBkMode(&sWParam, ~TRANSPARENT)
~SetTextColor(&sWParam, @RGB($00, $00, $FF)) -Blau----------
Return TextBk2&
Set(WinProc,1)
-Fuer Text3 Farbe setzen---------------------------------------
ElseIf &sLParam = hText3%
~SetBkMode(&sWParam, ~TRANSPARENT)
~SetTextColor(&sWParam, @RGB($00, $FF, $00)) -Gruen---------
Return TextBk3&
Set(WinProc,1)
EndIf
Set(WinProc,0)
EndIf
EndProc
-Main----------------------------------------------------------------
-Hintergrundfarben festlegen---------------------------------------
TextBk1& = ~CreateSolidBrush(@RGB($00, $FF, $FF)) -Cyan----------
TextBk2& = ~CreateSolidBrush(@RGB($FF, $FF, $00)) -Gelb----------
TextBk3& = ~CreateSolidBrush(@RGB($FF, $00, $FF)) -Magenta-------
-Erweitertes MessageHandling abschalten----------------------------
Set(FastMode, 1)
-Fenster oeffnen---------------------------------------------------
Window 0, 0 - 640, 480
-ProgramMainRoutine mit CallBack umleiten auf eigene---------------
Set(SubClassMode,1)
SubClass %hWnd, 1
-GUI aufbauen------------------------------------------------------
hButton% = @Create(Button, %hWnd, Ende, 10, 10, 100, 24)
-Textfelder------------------------------------------------------
hText1% = @Create(Text, %hWnd, Farbiger Text1, 10, 50, 110, 18)
hText2% = @Create(Text, %hWnd, Farbiger Text2, 10, 70, 110, 18)
hText3% = @Create(Text, %hWnd, Farbiger Text3, 10, 90, 110, 18)
-Dialog-Schleife---------------------------------------------------
Clear Ende%
WhileNot Ende%
WaitInput
If %Key = 2
Ende% = 1
ElseIf @Clicked(hButton%)
Ende% = 1
EndIf
EndWhile
-Fuellmuster freigeben---------------------------------------------
~DeleteObject(TextBk1&)
~DeleteObject(TextBk2&)
~DeleteObject(TextBk3&)
-Urspruengliche ProgramMainRoutine wieder herstellen---------------
SubClass %HWnd, 0
-End-------------------------------------------------------------------
End
|
|
|
| XProfan X4, PRFellow, Profan2Cpp - Version 2.0c-pre5, Windows 11 | 19.06.2008 ▲ |
|
|
|
|
Jac de Lad | Nein, ich hab leider keine Ahnung. |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 19.06.2008 ▲ |
|
|
|
|
Sebastian König | Detlef Jagolski
Hallo, habe das Beispiel aus der Hilfe von XProfan 10 Umgebaut mit den neuen Funktionen von XProfan 11.
Hat einer eine Idee warum das nicht Klappt?
Hallo Detlef,
Du hast in dem Code das Set(WinProc,1) jeweils nach den return-Anweisungen stehen - der Code wird also niemals erreicht. Das Set(WinProc,0) ganz am Ende ist die richtige Idee - nur wird es da in den relevanten Fällen, i.e. wenn WM_CTLCOLORSTATIC für eines der drei Textfelder gesendet wurde, auch nicht erreicht. Korrekt wäre ein Set(WinProc,0) vor jedem return.
Damit funktioniert es dann zumindest dann, wenn Du das Fenster kurz aus dem sichtbaren Bereich und direkt wieder hineinschiebst bzw. die Größe des Fensters änderst. Dieses Verhalten entsteht meiner Auffassung nach aus dem Zusammenspiel folgender Punkte:
a) Windows sendet WM_CTLCOLORSTATIC nur dann, wenn die Objekte neu gezeichnet werden mussen b) die SubClassProc wird in XProfan nur während eines WaitInputs aufgerufen
Eine Lösung für dieses Problem habe ich leider noch nicht...
MfG
Sebastian |
|
|
| |
|
|
|
Andreas Miethe
| Mit einem kleinen Trick geht das schon. Du musst Dein Fenster zum Neuzeichnen zwingen. KompilierenMarkierenSeparieren $H messages.ph
$H windows.ph
declare Text&,IsPainted&
declare ende&
declare brush&
Proc SetColor
Parameters Textcolor&,BackColor&,wParam&
If Brush&
~DeleteObject(Brush&)
Endif
Brush& = ~CreateSolidBrush(BackColor&)
~SetBkMode(wParam&, ~TRANSPARENT)
~SelectObject(wParam&,Brush&)
~SetTextColor(wParam&,Textcolor&)
return Brush&
Endproc
SubClassProc
If SubClassMessage(%hWnd, ~WM_CTLCOLORSTATIC)
Set(WinProc, 0)
Return SetColor($FF00FF,$FFFF00,&swParam)
elseIf SubClassMessage(%hwnd,~WM_TIMER)
Set(WinProc, 0)
If IsPainted& = 0
Repaint
~KillTimer(%hwnd,1)
IsPainted& = 1
Endif
EndIf
EndProc
cls
Set(SubClassMode,1)
SubClass %HWnd, 1
Text& = Createtext(%hwnd,Farbe,10,10,120,24)
~settimer(%hwnd,1,1,0)
whilenot ende&
waitinput
endwhile
Subclassing wieder ausschalten
SubClass %HWnd, 0
~DeleteObject(Brush&)
end
|
|
|
| Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 20.06.2008 ▲ |
|
|
|
|
Sebastian König | Andreas Miethe
Mit einem kleinen Trick geht das schon. Du musst Dein Fenster zum Neuzeichnen zwingen. (...)
Ah, sehr trickreich - nicht schlecht! |
|
|
| |
|
|
|
Detlef Jagolski | Hallo Andreas,
was soll ich sagen: Danke
Habe jetzt Dein Beispiel auf Edit erweitert. Da habe ich noch ein Problem! KompilierenMarkierenSeparierenMESSAGES.PH
WINDOWS.PH
declare Text&,Edit&,IsPainted&
declare ende&
declare brush&
Proc SetColor
Parameters Textcolor&,BackColor&,wParam&
If Brush&
~DeleteObject(Brush&)
Endif
Brush& = ~CreateSolidBrush(BackColor&)
~SetBkMode(wParam&, ~TRANSPARENT)
~SelectObject(wParam&,Brush&)
~SetTextColor(wParam&,Textcolor&)
return Brush&
Endproc
SubClassProc
If SubClassMessage(%hWnd, ~WM_CTLCOLORSTATIC)
Set(WinProc, 0)
Return SetColor($FF00FF,$FFFF00,&swParam)
elseIf SubClassMessage(%hwnd, ~WM_CTLCOLOREDIT)
Set(WinProc, 0)
Return SetColor($FF00FF,$FFFF00,&swParam)
elseIf SubClassMessage(%hwnd,~WM_TIMER)
Set(WinProc, 0)
If IsPainted& = 0
Repaint
~KillTimer(%hwnd,1)
IsPainted& = 1
Endif
EndIf
EndProc
cls
Set(SubClassMode,1)
SubClass %HWnd, 1
Text& = Createtext(%hwnd,Farbe,10,10,120,24)
Edit& = Createedit(%hwnd,Farbe,10,60,120,24)
~settimer(%hwnd,1,1,0)
whilenot ende&
waitinput
endwhile
Subclassing wieder ausschalten
SubClass %HWnd, 0
~DeleteObject(Brush&)
end
Jetzt mein Problem, wenn ich das Kontextmenü öffne oder wenn ich das Edit mit der Maus verlasse ist der XP Stil weg.
Hast Du noch ein Trick?
Gruß
Detlef |
|
|
| XProfan X4, PRFellow, Profan2Cpp - Version 2.0c-pre5, Windows 11 | 20.06.2008 ▲ |
|
|
|
|
Andreas Miethe
| Ich fürchte das wird nicht ganz so einfach werden. Dazu muss man sich tiefergehend mit Themes beschäftigen.
Sieh mal hier:
[...] |
|
|
| Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 20.06.2008 ▲ |
|
|
|
|
Detlef Jagolski | Hallo Andreas,
vielen Dank.
Gruß
Detlef |
|
|
| XProfan X4, PRFellow, Profan2Cpp - Version 2.0c-pre5, Windows 11 | 20.06.2008 ▲ |
|
|
|