MessageRequester mit eigenen Buttons, Chechboxen und Timeout

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

MessageRequester() mit Checkbox

Beitrag von AND51 »

Neuen Code bekommen:

Code: Alles auswählen

; ***************************************************** 
; Code    : MessageRequester with "Don't ask me again" 
; Author  : Sparkie 
; Date    : November 17, 2006 
; OS      : Windows only 
; License : It's all yours to use as you so desire 
;           (props/credit are welcome) 
; ***************************************************** 

Global hHook.l = 0, oldProc.l = 0, askagain.l = 0 

;...This one is still missing in PB def 
#BS_TEXT = 0 

;...Make sure Checkbox ID <> any of the other MessageRequester buttons 
#CheckBoxID = 12 

;...Subclassed MessageRequester Procedure() 
Procedure MsgBoxProc(hwnd.l, msg.l, wParam.l, lParam.l) 
  result.l = CallWindowProc_(oldProc, hwnd, msg, wParam, lParam) 
  Select msg 
    Case #WM_DESTROY 
      ;...Get handle to our checkbox 
      hCheckBox.l = GetDlgItem_(hwnd, #CheckBoxID) 
      ;...Get the checkbox state. <0 = not checked> <1 = checked> 
      ;...For this test I'll set a Global var to = CheckBox state 
      ;...In a real app you could set the value in a config/ini file 
      ;...or maybe a use a Registry setting 
      askagain = SendMessage_(hCheckBox, #BM_GETCHECK, 0, 0) 
  EndSelect 
  ProcedureReturn result 
EndProcedure 

;...Our hook Procedure() 
Procedure CBTProc(nCode.l, wParam.l, lParam.l) 
  result.l = CallNextHookEx_(hHook, nCode,wParam,lParam) 
  ;...Creation of MessageRequester is here 
  If nCode = #HCBT_CREATEWND 
    *cbt_cw.CBT_CREATEWND = lParam 
    *lpcs.CREATESTRUCT = *cbt_cw\lpcs 
    ;...Take action only if this is our MessageRequester 
    If *lpcs\hWndParent = WindowID(0) And *lpcs\lpszClass = 32770 
      ;...Resize the MessageRequester to make room for our CheckBoxGadget 
      *lpcs\cy + 30 
    EndIf 
    result = 0 
  EndIf 
  
  ;...MessageRequester is about to become active 
  ;...Here we will add our "Don't ask me this again" checkbox 
  If nCode = #HCBT_ACTIVATE 
    hMsgBox.l = wParam 
    
    ;...Subclass the MessageRequester 
    oldProc = SetWindowLong_(hMsgBox, #GWL_WNDPROC, @MsgBoxProc()) 
    hCheckBox.l = CreateWindowEx_(0, "Button", "Don't ask me this again.", #BS_AUTOCHECKBOX | #BS_TEXT | #WS_GROUP | #WS_TABSTOP | #WS_CHILD | #WS_VISIBLE, 10, 95, 150, 25, hMsgBox, #CheckBoxID, GetModuleHandle_(0), 0) 
    hFont.l = GetStockObject_(#DEFAULT_GUI_FONT) 
    SendMessage_(hCheckBox, #WM_SETFONT, hFont, 0) 
    ;...Release the hook 
    If hHook 
      UnhookWindowsHookEx_(hHook) 
      hHook = 0 
    EndIf 
    result = 0 
  EndIf 
  ProcedureReturn result 
EndProcedure 
If OpenWindow(0, 100, 100, 300, 200, "Don't ask me again", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  ButtonGadget(1, 10, 40, 280, 22, "Display Custom MessageRequester") 
  TextGadget(2, 10, 80, 280, 25, "") 
  Repeat 
    Event.l = WaitWindowEvent() 
    If Event = #PB_Event_Gadget And EventGadget() = 1 
      ;...Create a local hook to watch for MessageRequester 
      If askagain = 0 
        hHook = SetWindowsHookEx_(#WH_CBT, @CBTProc(), 0, GetCurrentThreadId_()) 
        MessageRequester("Welcome", "Do you want to continue?", #MB_YESNO | #MB_ICONQUESTION) 
      Else 
        MessageRequester("Sorry", "You requested not to see that message again.", #MB_OK | #MB_ICONINFORMATION) 
      EndIf 
      Select askagain 
        Case 0 
          SetGadgetText(2, "Ask me again was not checked") 
        Case 1 
          SetGadgetText(2, "Ask me again was checked") 
      EndSelect 
    EndIf 
  Until Event = #PB_Event_CloseWindow 
EndIf 
;...Just in case it's still there 
If hHook 
  UnhookWindowsHookEx_(hHook) 
  hHook = 0 
EndIf 
End
Stammt aus dem englischen Forum: http://www.purebasic.fr/english/viewtop ... ight=AND51

Der Autor des Code will versuchen, den Code am Wochenende aufzuräumen und neu in das Forum zu stellen. Er sagt außerdem, dass vor jedem MessageRequester, das eine Checkbox enthalten soll, dieser Window-Hook aufgerufen werden muss (falls jemand mehrere Messagerequester in sein Programm verbauen will).
Zuletzt geändert von AND51 am 19.11.2006 02:23, insgesamt 1-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

New Codes! Sparkie hat neue Codes geschrieben, seht sie euch unbedingt bezüglich dieses Themas an!!!!

Link: http://www.purebasic.fr/english/viewtop ... D51#171043
Zuletzt geändert von AND51 am 19.11.2006 02:24, insgesamt 1-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Kiffi
Beiträge: 10719
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Punkt 1: Schrei nicht so!

Punkt 2: Es gibt einen Edit-Button.
a²+b²=mc²
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Punkt 1: OK, ich seh's ein. Dafür habe ich
Punkt2: den Edit Button benutzt! :mrgreen:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

Was für mich im moment interessannter wäre, wäre ein 4-5 Button Requester.
Aber das jetzige ist auch nicht übel. :allright:
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

al90 hat geschrieben:Was für mich im moment interessannter wäre, wäre ein 4-5 Button Requester.
Das kannst du dir ganz leicht selber basteln, brauchst nur den Code ein bisschen zu erweitern.

Such mal die zeile CreateWindowEx_(), diese erstellt nämlich das CheckboxGadget! Dort fügst du einfach ein paar Buttons ein und fertig!

Bitte sieh dir auch noch mal meine Screenshots auf der 1. Seite dieses Threads an!!!! Dort siehst du beispielsweise einen 4-Button-Requester!!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

@AND51

Im moment habe ich mir bereits ein 5-Button Requester selbst gemacht.
Wenn ich mal was mehr zeit habe, schaue ich mir die Routinen mal in
ruhe an. :wink:
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Klar! Es besteht ja kein Zwang; kam von mir vielleicht so rüber, weil die Emotionen mit mir durchgingen, weil ich sowas noch nie gesehen habe... :wink: *hach*
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten