Seite 2 von 2

MessageRequester() mit Checkbox

Verfasst: 18.11.2006 01:46
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).

Verfasst: 19.11.2006 01:33
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

Verfasst: 19.11.2006 02:00
von Kiffi
Punkt 1: Schrei nicht so!

Punkt 2: Es gibt einen Edit-Button.

Verfasst: 19.11.2006 02:24
von AND51
Punkt 1: OK, ich seh's ein. Dafür habe ich
Punkt2: den Edit Button benutzt! :mrgreen:

Verfasst: 19.11.2006 21:01
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:

Verfasst: 19.11.2006 22:31
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!!

Verfasst: 20.11.2006 01:24
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:

Verfasst: 20.11.2006 15:50
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*