Verändern des Standart-MessageRequester

Anfängerfragen zum Programmieren mit PureBasic.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Verändern des Standart-MessageRequester

Beitrag von CNESM »

Hallo,

mit folgendem Code möchte ich den Standart-MessageRequester meinen Wünschen entsprechend abändern.

Mein Ziel ist es:

- Titel, Text und Buttons mit eigener Beschriftung
- Buttons mit eigener Funktion belegen
- Titel, Text und Buttons des Standart-MessageRequester life upzudaten, also während die Messagebox noch aktiv zu sehen ist

Punkt eins und zwei funktionieren. Punkt drei aber will nicht so recht funktionieren. Den Hook einfach neu zu setzen reicht da scheinbar nicht aus. Nicht alle Elemente erhalten den neuen Text oder werden nicht geupdatet. Zudem passiert das nicht life sonder stets immer nur nach der Neuaktivierung des MessageRequester.

Hier mal mein Code. Vielleicht hat jemand nen Tipp:

Code: Alles auswählen

#SC_CONTEXTHELP=$F180

#IDOK = 1
#IDCANCEL = 2
#IDABORT = 3
#IDRETRY = 4
#IDIGNORE = 5
#IDYES = 6
#IDNO = 7
#IDHELP=9
#IDPROMPT = $FFFF
#MB_HELP=$00004000

Global hHook
Global mbtitle$, mbmsg$, mbopt1$, mbopt2$, mbopt3$, MyMessageBoxHandle

#StringSpace = 80

Procedure MsgBoxHookProc (uMsg, wParam, lParam)
   If uMsg = #HCBT_ACTIVATE
      SetWindowText_ (wParam, mbtitle$)
      SetDlgItemText_ (wParam, #IDOK, mbopt1$)
      SetDlgItemText_ (wParam, #IDHELP, mbopt2$)
      SetDlgItemText_ (wParam, #IDPROMPT, mbmsg$)
      UnhookWindowsHookEx_ (hHook)
   EndIf
   ProcedureReturn #False
EndProcedure

Procedure WNDCB(WindowID, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_HELP
   DisplayPopupMenu(0,WindowID(0))
Case #WM_SYSCOMMAND 
   Select wParam
      Case #SC_CONTEXTHELP
         SendMessage_(WindowID,#WM_HELP,0,0)
         Result= 0
   EndSelect
Case #WM_COMMAND
  If wParam=1
    Debug "4"
  ElseIf wParam=2
    Debug "here i want to change the text of the message requester!"
  EndIf
EndSelect
ProcedureReturn Result
EndProcedure 

Procedure MessageBoxH (parentWindow, title$, message$, button1$, button2$)
   mbtitle$ = title$
   mbmsg$ = message$
   mbopt1$ = button1$
   mbopt2$ = button2$
   hInstance = GetModuleHandle_ (0)
   hThreadId = GetCurrentThreadId_ ()
   hHook = SetWindowsHookEx_ (#WH_CBT,@MsgBoxHookProc(),hInstance,hThreadId)
   ProcedureReturn MessageBox_ (parentWindow,Space(#StringSpace),Space(#StringSpace),#MB_HELP|#MB_ICONINFORMATION)
EndProcedure

hwnd=OpenWindow(0, 100, 100, 420, 240, "", #PB_Window_SystemMenu)
If hwnd
  SetWindowCallback(@WNDCB())  
  If CreatePopupMenu(0)
    MenuItem(1,"Only a test")    
    MenuBar()
    MenuItem(2,"Change text")  
  EndIf

  MyMessageBoxHandle=MessageBoxH(WindowID(0),"My title","Text","Oookeey","My Ops")
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      Quit = 1
    ElseIf EventID=#PB_Event_Menu 
    Debug "l"
      If EventMenu()=1
        Debug "Test"
      ElseIf EventMenu()=2
        Debug "Do something"
      EndIf
    EndIf
  Until Quit = 1
EndIf
End
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Verändern des Standart-MessageRequester

Beitrag von Kiffi »

Auch wenn ich jetzt keinen konkreten Tipp zu Deinem aktuellen
Problem habe: al90 hat vor nicht allzu langer Zeit eine Lib für
neue Dialogboxen in PB gepostet. Vielleicht kannst Du damit
ja was anfangen:

http://www.purebasic.fr/german/viewtopi ... 58#p257858

Grüße ... Kiffi
a²+b²=mc²
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Re: Verändern des Standart-MessageRequester

Beitrag von CNESM »

Ja ne feine Sache das mit der Lib, aber doch nicht das was ich genau suche. Vielleicht hat jemand noch ne Idee?

Folgender Code ändert den Text aller Elemente außer des ehemaligen OK-Buttons, obwohl ich nicht weiss, warum das so ist. Weiterhin geschieht dies erst nachdem der MessageRequester nochmal mit der Maus direkt aktiviert wurde. Wenn der Requester nach dem Textupdate aber erstmal in den Hintergrund gestellt wird und dann aktiviert wird, gehen die Textänderungen beispielsweise auch verloren:

Code: Alles auswählen

#SC_CONTEXTHELP=$F180

#IDOK = 1
#IDCANCEL = 2
#IDABORT = 3
#IDRETRY = 4
#IDIGNORE = 5
#IDYES = 6
#IDNO = 7
#IDHELP=9
#IDPROMPT = $FFFF
#MB_HELP=$00004000

Global hHook
Global mbtitle$, mbmsg$, mbopt1$, mbopt2$, mbopt3$, MyMessageBoxHandle

#StringSpace = 80

Procedure MsgBoxHookProc (uMsg, wParam, lParam)
   If uMsg = #HCBT_ACTIVATE
      SetWindowText_ (wParam, mbtitle$)
      SetDlgItemText_ (wParam, #IDOK, mbopt1$)
      SetDlgItemText_ (wParam, #IDHELP, mbopt2$)
      SetDlgItemText_ (wParam, #IDPROMPT, mbmsg$)
      UnhookWindowsHookEx_ (hHook)
   EndIf
   ProcedureReturn #False
EndProcedure

Procedure WNDCB(WindowID, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_HELP
   DisplayPopupMenu(0,WindowID(0))
Case #WM_SYSCOMMAND 
   Select wParam
      Case #SC_CONTEXTHELP
         SendMessage_(WindowID,#WM_HELP,0,0)
         Result= 0
   EndSelect
Case #WM_COMMAND
  If wParam=1
    Debug "4"
  ElseIf wParam=2
   mbtitle$ = "schwups"
   mbmsg$ = "juhuuuuuu"
   mbopt1$ = "dummy"
   mbopt2$ = "ach ne"
   hInstance = GetModuleHandle_ (0)
   hThreadId = GetCurrentThreadId_ ()
   hHook = SetWindowsHookEx_ (#WH_CBT,@MsgBoxHookProc(),hInstance,hThreadId)
  EndIf
EndSelect
ProcedureReturn Result
EndProcedure 

Procedure MessageBoxH (parentWindow, title$, message$, button1$, button2$)
   mbtitle$ = title$
   mbmsg$ = message$
   mbopt1$ = button1$
   mbopt2$ = button2$
   hInstance = GetModuleHandle_ (0)
   hThreadId = GetCurrentThreadId_ ()
   hHook = SetWindowsHookEx_ (#WH_CBT,@MsgBoxHookProc(),hInstance,hThreadId)
   ProcedureReturn MessageBox_ (parentWindow,Space(#StringSpace),Space(#StringSpace),#MB_HELP|#MB_ICONINFORMATION)
EndProcedure

hwnd=OpenWindow(0, 100, 100, 420, 240, "", #PB_Window_SystemMenu)
If hwnd
  SetWindowCallback(@WNDCB())  
  If CreatePopupMenu(0)
    MenuItem(1,"Only a test")    
    MenuBar()
    MenuItem(2,"Change text")  
  EndIf

  MyMessageBoxHandle=MessageBoxH(WindowID(0),"My title","Text","Oookeey","My Ops")
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      Quit = 1
    ElseIf EventID=#PB_Event_Menu 
    Debug "l"
      If EventMenu()=1
        Debug "Test"
      ElseIf EventMenu()=2
        Debug "Do something"
      EndIf
    EndIf
  Until Quit = 1
EndIf
End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Verändern des Standart-MessageRequester

Beitrag von ts-soft »

Selber ein modales Fenster erstellen ist doch wesentlich einfacher! Was anderes macht die Lib von AL90 auch nicht.
Warum also die API unnötig und kompliziert hooken?

Gruß
Thomas
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Verändern des Standart-MessageRequester

Beitrag von Kaeru Gaman »

ts-soft hat geschrieben:Selber ein modales Fenster erstellen ist doch wesentlich einfacher! Was anderes macht die Lib von AL90 auch nicht.
Warum also die API unnötig und kompliziert hooken?

Gruß
Thomas
+1
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Re: Verändern des Standart-MessageRequester

Beitrag von CNESM »

Mir schon klar das mir das auch selber basteln kann. Mein Wunsch wäre aber die betriebssystemabhängigen Layouts soweit wie möglich übernehmen zu können, ohne mir das per Hand zusammenfummeln zu müssen und nur die Dinge abzuändern, die ich anders haben möchte wie Buttons usw. Über den Sinn und Zweck lässt sich streiten ...
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Re: Verändern des Standart-MessageRequester

Beitrag von CNESM »

So, bin einen Schritt weiter. Die Notwendigkeit den OK-Button anzupassen ist Vergangenheit. Es muss lediglich der Text angepasst werden und da fehlt nur noch die Anpassung der Speicheradresse, damit auch längere Texte komplett angezeigt werden:

Code: Alles auswählen

#SC_CONTEXTHELP=$F180

#IDOK = 1
#IDCANCEL = 2
#IDABORT = 3
#IDRETRY = 4
#IDIGNORE = 5
#IDYES = 6
#IDNO = 7
#IDHELP=9
#IDPROMPT = $FFFF
#MB_HELP=$00004000

Global hHook
Global mbtitle$, mbmsg$, mbopt1$, mbopt2$, mbopt3$, MyMessageBoxHandle, asdasd

#StringSpace = 80

Procedure MsgBoxHookProc (uMsg, wParam, lParam)
   If uMsg = #HCBT_ACTIVATE
      SetWindowText_ (wParam, mbtitle$)
      SetDlgItemText_ (wParam, #IDOK, mbopt1$)
      SetDlgItemText_ (wParam, #IDHELP, mbopt2$)
      SetDlgItemText_ (wParam, #IDPROMPT, mbmsg$)
      UnhookWindowsHookEx_ (hHook)
   EndIf
    If uMsg =  #HCBT_CREATEWND      
      *cbcw.CBT_CREATEWND = lParam
      *crws.CREATESTRUCT = *cbcw\lpcs
      If *crws\lpszClass = 32770
         asdasd=wParam
      EndIf
   EndIf
   
   ProcedureReturn #False
EndProcedure

Procedure WNDCB(WindowID, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_HELP
   DisplayPopupMenu(0,WindowID(0))
Case #WM_SYSCOMMAND 
   Select wParam
      Case #SC_CONTEXTHELP
         SendMessage_(WindowID,#WM_HELP,0,0)
         Result= 0
   EndSelect
Case #WM_COMMAND
  If wParam=1
    Debug "4"
  ElseIf wParam=2
   mbmsg$ = "Das ist mal ein etwas größerer Test, um zu sehen"+Chr(13)+"ob alles soweit funktioniert. Nicht das es nachher noch irgendwelche Probleme gibt"+Chr(13)+"Das wäre ja sehr sehr unschön so eine Sache!"
   hInstance = GetModuleHandle_ (0)
   hThreadId = GetCurrentThreadId_ ()
   hHook = SetWindowsHookEx_ (#WH_CBT,@MsgBoxHookProc(),hInstance,hThreadId)
   BringWindowToTop_(asdasd)
  EndIf
EndSelect
ProcedureReturn Result
EndProcedure 

Procedure MessageBoxH (parentWindow, title$, message$, button1$, button2$)
   mbtitle$ = title$
   mbmsg$ = "zeile1"+Chr(13)+"zeile2"
   mbopt1$ = button1$
   mbopt2$ = button2$
   hInstance = GetModuleHandle_ (0)
   hThreadId = GetCurrentThreadId_ ()
   hHook = SetWindowsHookEx_ (#WH_CBT,@MsgBoxHookProc(),hInstance,hThreadId)
   ProcedureReturn MessageBox_ (parentWindow,mbmsg$,mbtitle$,#MB_HELP|#MB_ICONINFORMATION|#MB_SYSTEMMODAL)
EndProcedure

hwnd=OpenWindow(0, 100, 100, 420, 240, "", #PB_Window_SystemMenu)
If hwnd
  SetWindowCallback(@WNDCB())  
  If CreatePopupMenu(0)
    MenuItem(1,"Only a test")    
    MenuBar()
    MenuItem(2,"Change text")  
  EndIf

  MyMessageBoxHandle=MessageBoxH(WindowID(0),"title","","Oo okeey","My Ops")
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      Quit = 1
    ElseIf EventID=#PB_Event_Menu 
    Debug "l"
      If EventMenu()=1
        Debug "Test"
      ElseIf EventMenu()=2
        Debug "Do something"
      EndIf
    EndIf
  Until Quit = 1
EndIf
End
Antworten