Quelltexte/ Codesnippets | | | | | Andreas Miethe, URL=www.paules-pc-forum.de/forum/spezielles/123967-messagebox-mit-option.html#post754182, ZEITPUNKT=26.12.2009
Messagebox mit Option Eine kleine Spielerei mit einer Messagebox und einem Hook. Vielleicht kanns ja jemand gebrauchen. $H Windows.ph
$H Messages.ph
#############################
Messagebox-Konstanten
DEF &IDOK 1
DEF &IDCANCEL 2
DEF &IDABORT 3
DEF &IDRETRY 4
DEF &IDIGNORE 5
DEF &IDYES 6
DEF &IDNO 7
DEF &IDICON 20
DEF &IDPROMPT $FFFF
DEF &IDSTATIC $CAFE
#############################
Struct CWPSTRUCT = lParam&,wParam&,message&,hwnd&
Struct Rect = left&,top&,right&,bottom&
Declare Hook&,OldProc&
Declare B&,B1&
Proc MB
Parameters wnd&,msg&,wparam&,lparam&
Declare Result&
select msg&
Caseof ~WM_INITDIALOG
Var Rect# = New(Rect)
~GetWindowRect(wnd&,Rect#)
~Movewindow(wnd&,Rect#.left&,rect#.top&,width(wnd&)+12,Height(wnd&)+40,1)
B& = Create("CheckBox",wnd&,"Diese Meldung nicht wieder anzeigen",0,height(wnd&)-18,width(wnd&),18)
SendMessage(B&,~WM_SETFONT,~GetStockObject(~ANSI_VAR_FONT),1)
SendMessage(~GetDlgItem(wnd&,&IDICON),~STM_SETIMAGE,~IMAGE_ICON,~LoadIcon(%hInstance,"EIMER"))
Result& = 1
Caseof ~WM_COMMAND
If lparam& = b&
If Getcheck(B&)
B1& = 1
Endif
Endif
Caseof ~WM_NCDESTROY
~UnhookWindowsHookEx(Hook&)
Result& = 1
Endselect
Result& = ~CallWindowProc(OldProc&,wnd&,msg&,wparam&,lparam&)
Return Result&
Endproc
Proc SetHook
Parameters nCode&, wParam&, lParam&
Select nCode&
Caseof ~HC_ACTION
Var pw# = New(CWPSTRUCT)
pw# = lparam&
If pw#.message& = ~WM_INITDIALOG
OldProc& = ~SetWindowlong(pw#.hwnd&,~GWL_WNDPROC,ProcAddr("MB",4))
Endif
EndSelect
Return ~CallNextHookEx(Hook&, nCode&, wParam&, lParam&)
EndProc
Proc PRF_Messagebox
Set("Fastmode",1)
Parameters body$, title$, flags&
Declare Result&
Flags& = Flags& | ~MB_ICONQUESTION
Hook& = ~SetWindowsHookEx(~WH_CALLWNDPROC, ProcAddr("SetHook",3), 0,~GetCurrentThreadId())
Result& = MessageBox(title$,body$, flags&)
Set("Fastmode",0)
Return Result&
EndProc
cls
Print PRF_Messagebox("Titel","Wirklich löschen ? ",~MB_YESNO)
Print IF(B1&=1,"Nicht wieder anzeigen","wieder anzeigen")
Waitinput
Gruss Andreas
Auch sehr schön mit Hyperlinks: [...]
Andreas Miethe, Beitrag=55999, Zeitpunkt=06.02.2010
Per Hook geht eine Menge $H Windows.ph
$H Messages.ph
Struct CWPSTRUCT = lParam&,wParam&,message&,hwnd&
Struct Rect = left&,top&,right&,bottom&
#############################
Messagebox-Konstanten
DEF &IDOK 1
DEF &IDCANCEL 2
DEF &IDABORT 3
DEF &IDRETRY 4
DEF &IDIGNORE 5
DEF &IDYES 6
DEF &IDNO 7
DEF &IDHELP 9
DEF &IDTRYAGAIN 10
DEF &IDCONTINUE 11
DEF &IDICON 20
DEF &IDPROMPT $FFFF
DEF &IDSTATIC $CAFE
#############################
Proc MB
Parameters wnd&,msg&,wparam&,lparam&
Declare Result&,W&,H&,b&
Result& = ~CallWindowProc(OldProc&,wnd&,msg&,wparam&,lparam&)
select msg&
Caseof ~WM_INITDIALOG
Var SRect# = New(Rect)
~GetWindowRect(wnd&,SRect#)
Dialog vergrössern und zentrieren
W& = SRect#.right& - SRect#.left&
H& = SRect#.bottom& -SRect#.top& + 40
~Movewindow(wnd&,((%maxx/2)-(W&/2)),((%maxy/2)-(H&/2)),W&,H&,1)
Positionen der Controls 40 Pixel nach untern verchieben
~Getwindowrect(~GetDlgItem(wnd&,&IDSTATIC),SRect#)
~Mapwindowpoints(0,wnd&,SRect#,2)
~Movewindow(~GetDlgItem(wnd&,&IDSTATIC),0,SRect#.Top&+40,SRect#.Right&,SRect#.Bottom&,1)
Whileloop 1,11
If ~IsWindow(~GetDlgItem(wnd&,&Loop))
~Getwindowrect(~GetDlgItem(wnd&,&Loop),SRect#)
~Mapwindowpoints(0,wnd&,SRect#,2)
~Setwindowpos(~GetDlgItem(wnd&,&Loop),0,SRect#.Left&,SRect#.Top&+40,0,0,~SWP_NOSIZE | ~SWP_NOZORDER)
Endif
Endwhile
Position vom PROMPT holen
~Getwindowrect(~GetDlgItem(wnd&,&IDPROMPT),SRect#)
~Mapwindowpoints(0,wnd&,SRect#,2)
LINKS unter PROMPT anlegen
Link& = Control("SysLink","<a>Besuch meine Homepage</a>",$50000000,SRect#.Left&,SRect#.Bottom&+10,width(wnd&),18,wnd&,4000,0,0)
SendMessage(Link&,~WM_SETFONT,~GetStockObject(~ANSI_VAR_FONT),1)
Mail& = Control("SysLink","<a>Schick mir eine Mail</a>",$50000000,SRect#.Left&,SRect#.Bottom&+30,width(wnd&),18,wnd&,4001,0,0)
SendMessage(Mail&,~WM_SETFONT,~GetStockObject(~ANSI_VAR_FONT),1)
Dispose SRect#
Result& = 1
Caseof ~WM_NOTIFY
Link abfragen
If (Long(lparam&,8) = -2) and (Long(lParam&,0) = LINK&)
ShellExec("https://www.ampsoft.eu","open",~SW_SHOWNORMAL)
endif
If (Long(lparam&,8) = -2) and (Long(lParam&,0) = Mail&)
ShellExec("Mailto://","open",~SW_SHOWNORMAL)
endif
Result& = 1
Caseof ~WM_NCDESTROY
~UnhookWindowsHookEx(Hook&)
Result& = 1
Endselect
Return Result&
Endproc
Proc SetHook
Parameters nCode&, wParam&, lParam&
Select nCode&
Caseof ~HC_ACTION
Var pw# = New(CWPSTRUCT)
pw# = lparam&
If pw#.message& = ~WM_INITDIALOG
OldProc& = ~SetWindowlong(pw#.hwnd&,~GWL_WNDPROC,ProcAddr("MB",4))
Dispose pw#
Endif
EndSelect
Return ~CallNextHookEx(Hook&, nCode&, wParam&, lParam&)
EndProc
Proc PRF_Messagebox
Set("Fastmode",1)
Parameters body$, title$, flags&
Declare Result&
Hook& = ~SetWindowsHookEx(~WH_CALLWNDPROC, ProcAddr("SetHook",3), 0,~GetCurrentThreadId())
Result& = MessageBox(title$,body$, flags&)
Set("Fastmode",0)
Return Result&
EndProc
Hier gehts los
Declare Hook&,OldProc&
Declare LINK&,Mail&
cls
Print PRF_Messagebox("Eine Frage...","Wirklich löschen ?",~MB_YESNOCANCEL | ~MB_DEFBUTTON2 | ~MB_ICONQUESTION | ~MB_APPLMODAL)
Waitinput
|
| | | | |
| | | EndProcedure im Code geändert in EndProc.
|
| | | | |
| | Dietmar Horn | Hab ich schon vor Stunden gleich im XProfan-Manager und in meiner Quellcodeammlung gebunkert, damit eine solche "Perle" der Allgemeinheit nicht verlorengeht ... |
| | | Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V. [...] Windows 95 bis Windows 7 Profan² 6.6 bis XProfan X2 mit XPSE Das große XProfan-Lehrbuch: [...] | 27.12.2009 ▲ |
| |
| | H.Brill | iF: EndProcedure im Code geändert in EndProc.
Programmierste stereo -> PureBasic + XProfan ? Hoffentlich kommt da nicht irgendwann mal ein Mischmasch raus, den keiner mehr compilieren kann. |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 27.12.2009 ▲ |
| |
| | Andreas Miethe
| H.Brill, Beitrag=55597, Zeitpunkt=27.12.2009
iF: EndProcedure im Code geändert in EndProc. Programmierste stereo -> PureBasic + XProfan ?
Stereo ???
Delphi,Java,C,VB usw.usf.
Da muss man schon aufpassen, dass man nicht durcheinander kommt |
| | | 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 : [...] | 27.12.2009 ▲ |
| |
| | Jörg Sellmeyer | H.Brill, Beitrag=55597, Zeitpunkt=27.12.2009
iF: EndProcedure im Code geändert in EndProc. Programmierste stereo -> PureBasic + XProfan ? Hoffentlich kommt da nicht irgendwann mal ein Mischmasch raus, den keiner mehr compilieren lesen kann.
Da ist iF doch schon lange angekommen |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 27.12.2009 ▲ |
| |
| | Andreas Miethe
| Hier noch ein bunteres Beispiel mit Timer für automatisches Schliessen. KompilierenMarkierenSeparieren $H Windows.ph
$H Messages.ph
#############################
Messagebox-Konstanten
DEF &IDOK 1
DEF &IDCANCEL 2
DEF &IDABORT 3
DEF &IDRETRY 4
DEF &IDIGNORE 5
DEF &IDYES 6
DEF &IDNO 7
DEF &IDICON 20
DEF &IDPROMPT $FFFF
DEF &IDSTATIC $CAFE
#############################
Struct CWPSTRUCT = lParam&,wParam&,message&,hwnd&
Struct Rect = left&,top&,right&,bottom&
Struct PAINTSTRUCT = hdc&,fErase&,rcPaint!Rect,fRestore&,fIncUpdate&,rgbReserved#(32)
Proc Disablexptheme
Var Ux& = ImportDll("UxTheme.dll","")
Parameters Wnd&
Declare Word#
Dim Word#,2
If UX&
Setwindowtheme(Wnd&, Word#, Word#)
Endif
Dispose Word#
FreeDll UX&
Endproc
Proc ShadowProc
Parameters wnd&,lparam&
If (~GetDlgCtrlID(wnd&) >= &IDOK) AND (~GetDlgCtrlID(wnd&) <= &IDNO)
Disablexptheme(wnd&)
Declare x&,y&,w&,h&,Brush&,Pen&,OldBrush&,OldPen&
Var Rect# = New(Rect)
Brush& = ~GetStockObject(~BLACK_BRUSH)
Pen& = ~GetStockObject(~NULL_PEN)
~GetClientRect(wnd&,Rect#)
~MapWindowpoints(wnd&,~GetParent(wnd&),Rect#,2)
x& = Rect#.left&+6
y& = Rect#.top&+6
w& = x&+(Rect#.right&-Rect#.left&)
h& = y&+(Rect#.bottom&-Rect#.top&)
OldBrush& = ~SelectObject(lParam&,Brush&)
OldPen& = ~SelectObject(lParam&,Pen&)
~Rectangle(lParam&,x&,y&,w&,h&)
~SelectObject(lParam&,OldBrush&)
~SelectObject(lParam&,OldPen&)
~DeleteObject(Brush&)
~DeleteObject(Pen&)
EndIf
Return 1
EndProc
Proc MB
Parameters wnd&,msg&,wparam&,lparam&
Declare Result&,W&,H&
select msg&
Caseof ~WM_INITDIALOG
Var DC& = ~GetDC(wnd&)
Var Rect# = New(Rect)
Var icon& = SendMessage(~GetDlgItem(wnd&,&IDICON),~STM_GETICON,0,0)
~GetWindowRect(wnd&,Rect#)
Dialog vergrössern und zentrieren
W& = Rect#.right& - Rect#.left& + 20
H& = Rect#.bottom& -Rect#.top& + 30
~Movewindow(wnd&,((%maxx/2)-(W&/2)),((%maxy/2)-(H&/2)),W&,H&,1)
Static-Control, auf dem die Buttons liegen, anpassen
~GetClientRect(~GetDlgItem(wnd&,&IDSTATIC),Rect#)
~MapWindowpoints(~GetDlgItem(wnd&,&IDSTATIC),wnd&,Rect#,2)
~Movewindow(~GetDlgItem(wnd&,&IDSTATIC),Rect#.left&,Rect#.top&,w&,44,1)
Dispose Rect#
Bitmap für Hintergrund anlegen
Pic& = Create("hNewPic",w&,h&,$FFFFFF)
Farbverlauf ins Bitmap
Startpaint Pic&
GradientRect(%hdc,0,0,w&,h&,$8000,$FF,0)
~DrawiconEx(%hdc,20,20,Icon&,32,32,0,0,$3)
If D&
TextColor $FFFF,$FF
Drawtext width(wnd&)-24,Height(wnd&)-20,Format$("%3.0f",D&)
Endif
EndPaint
Brush& = ~CreatePatternBrush(Pic&)
Bitmap für Static anlegen
ein Static-Control ist erst ab Vista vorhanden !
Pic1& = Create("hNewPic",w&,44,$0)
Farbverlauf ins Bitmap
Startpaint Pic1&
GradientRect(%hdc,0,0,w&/2,44,$FF,$8000,0)
GradientRect(%hdc,w&/2,0,w&,44,$8000,$FF,0)
EndPaint
Brush1& = ~CreatePatternBrush(Pic1&)
B& = Create("CheckBox",wnd&,"Diese Meldung nicht wieder anzeigen",0,height(wnd&)-20,width(wnd&),18)
Disablexptheme(B&)
SendMessage(B&,~WM_SETFONT,~GetStockObject(~ANSI_VAR_FONT),1)
ShowWindow(~GetDlgItem(wnd&,&IDICON),0)
Result& = 1
Caseof ~WM_PAINT
Var ps# = New(PAINTSTRUCT)
~BeginPaint(wnd&,ps#)
~EnumChildWindows(wnd&,ProcAddr("ShadowProc",2),ps#.hdc&)
~EndPaint(wnd&,ps#)
Dispose ps#
Caseof ~WM_CTLCOLORSTATIC
If lParam& = ~GetDlgItem(wnd&,&IDSTATIC)
Return Brush1&
else
~SetTextColor(wParam&,$FFFF)
~SetBkMode(wparam&,~Transparent)
Return ~GetStockObject(~NULL_BRUSH)
Endif
Caseof ~WM_CTLCOLORDLG
~SetBkMode(wparam&,~Transparent)
Return Brush&
Caseof ~WM_CTLCOLORBTN
~SetBkMode(wparam&,~Transparent)
Return ~GetStockObject(~NULL_BRUSH)
Caseof ~WM_TIMER
Dec D&
Startpaint wnd&
TextColor $FFFF,$FF
Drawtext width(wnd&)-24,Height(wnd&)-20,Space$(10)
Drawtext width(wnd&)-24,Height(wnd&)-20,Format$("%3.0f",D&)
Endpaint
If D& = 0
sendmessage(wnd&,~wm_close,0,0)
endif
Return 0
Caseof ~WM_COMMAND
If lparam& = b&
If Getcheck(B&)
B1& = 1
Endif
Endif
Result& = 1
Caseof ~WM_NCDESTROY
~Killtimer(wnd&,1)
~DeleteObject(Brush&)
~DeleteObject(Pic&)
~DeleteObject(Brush1&)
~DeleteObject(Pic1&)
~UnhookWindowsHookEx(Hook&)
Result& = 1
Endselect
Result& = ~CallWindowProc(OldProc&,wnd&,msg&,wparam&,lparam&)
Return Result&
Endproc
Proc SetHook
Parameters nCode&, wParam&, lParam&
Select nCode&
Caseof ~HC_ACTION
Var pw# = New(CWPSTRUCT)
pw# = lparam&
If pw#.message& = ~WM_INITDIALOG
If D& : ~Settimer(pw#.hwnd&,1,1000,0):Endif
OldProc& = ~SetWindowlong(pw#.hwnd&,~GWL_WNDPROC,ProcAddr("MB",4))
Dispose pw#
Endif
EndSelect
Return ~CallNextHookEx(Hook&, nCode&, wParam&, lParam&)
EndProc
Proc PRF_Messagebox
Set("Fastmode",1)
Parameters body$, title$, flags&
Declare Result&
Flags& = Flags& | ~MB_ICONQUESTION
Hook& = ~SetWindowsHookEx(~WH_CALLWNDPROC, ProcAddr("SetHook",3), 0,~GetCurrentThreadId())
Result& = MessageBox(title$,body$, flags&)
Set("Fastmode",0)
Return Result&
EndProc
Proc GradientRect
Parameters DC&,x%,y%,w%,h%,Color1&,Color2&,HV&
Declare GradRect#,Trivertex#
Dim GradRect#,8
Dim Trivertex#,32
Long Gradrect#,0 = 0,1
Long Trivertex#,0 =x%,y%
word Trivertex#,8=GETRVALUE(Color1&) << 8,GETGVALUE(Color1&) << 8,GETBVALUE(Color1&) << 8,0
Long Trivertex#,16=w%,h%
word Trivertex#,24=GETRVALUE(Color2&) << 8,GETGVALUE(Color2&) << 8,GETBVALUE(Color2&) << 8,0
External("Msimg32.dll","GradientFill",DC&,Trivertex#,2,Gradrect#,1,HV&)
Dispose Trivertex#
Dispose Gradrect#
EndProc
Hier gehts los
Declare Hook&,OldProc&
Declare B&,B1&
Declare X&,T&,Brush&,Pic&,Brush1&,Pic1&
Declare D&
TIMER auf 15 Sekunden setzen
D& = 15
Wenn D& = 0, dann kein Timer
Nach 15 Sekunden verschwindet die Box automatisch
cls
Print PRF_Messagebox("Eine Frage...","Wirklich löschen ?",~MB_YESNOCANCEL | ~MB_ICONQUESTION)
Print IF(B1&=1,"Nicht wieder anzeigen","wieder anzeigen")
Waitinput
|
| | | 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 : [...] | 27.12.2009 ▲ |
| |
| | Jörg Sellmeyer | Sehr schön! Bei mir wird allerdings, statt des Textes in der Checkbox, nur ein schwarzer Balken angezeigt. Ist eigentlich dein ~DeleteObject() etwas anderes als das profane oder könnte man auch einfach DeleteObject h& verwenden? |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 27.12.2009 ▲ |
| |
| | Andreas Miethe
| Jörg Sellmeyer, Beitrag=55605, Zeitpunkt=27.12.2009
Sehr schön! Bei mir wird allerdings, statt des Textes in der Checkbox, nur ein schwarzer Balken angezeigt. Ist eigentlich dein ~DeleteObject() etwas anderes als das profane oder könnte man auch einfach DeleteObject h& verwenden?
Das mit dem schwarzen Balken verstehe ich nicht, ich habs ja extra unter XP getestet und fotografiert.
~DeleteObject() oder profanes DeleteObject ist wohl das Selbe. |
| | | 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 : [...] | 27.12.2009 ▲ |
| |
| | | H.Brill, Beitrag=55597, Zeitpunkt=27.12.2009
iF: EndProcedure im Code geändert in EndProc.
Programmierste stereo -> PureBasic + XProfan ?
Also ich hab kein PB und brauch auch keins um zu wissen, dass EndProcedure wohl ein EndProc hätte werden sollen. ^^ |
| | | | |
| | Frank Abbing | Den schwarzen Balken kann ich bestätigen. |
| | | | |
| | Jörg Sellmeyer | So sieht das dann aus:
|
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 27.12.2009 ▲ |
| |
|
Zum QuelltextThemenoptionen | 12.661 Betrachtungen |
ThemeninformationenDieses Thema hat 9 Teilnehmer: |