Positionnement d'un "MessageRequester" ou l'on veut

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Positionnement d'un "MessageRequester" ou l'on veut

Message par GallyHC »

Bonjour,

J'avais besoin pour un programme de pouvoir positionner un "MessageRequester", ou je le voulais, alors j'ai fait ce petit code que je vous partage.

Code : Tout sélectionner

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

DisableASM
EnableExplicit

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Structure MSGBOX
  m_Hook.i
  m_Left.i
  m_Top.i
EndStructure

Global msgbox.MSGBOX

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

#SWVB_DEFAULT   = $FFFFFFFF

; **********************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure.i MsgBoxHook(nCode.i, wParam.i, lParam.i)
;
  Protected x.l
  Protected y.l
  Protected nSize.i
  Protected tmpHook.i
  Protected sBuffer.s
  Protected Height.i
  Protected Width.i
  Protected fHeight.i
  Protected fWidth.i
  Protected wndRect.rect

  tmpHook = CallNextHookEx_(msgbox\m_Hook, nCode, wParam, lParam)
  If nCode = #HCBT_ACTIVATE
    sBuffer = Space(32)
    nSize   = GetClassName_(wParam, sBuffer, 32)
    If Left(sBuffer, nSize) <> "#32770"
      ProcedureReturn #False
    EndIf
    GetWindowRect_(wParam, wndRect)
    Height  = (wndRect\bottom - wndRect\top) / 2
    Width   = (wndRect\right - wndRect\left) / 2 
    GetWindowRect_(GetParent_(wParam), wndRect)
    fHeight = wndRect\top + (wndRect\bottom - wndRect\top)  / 2
    fWidth  = wndRect\left + (wndRect\right - wndRect\left) / 2
    If msgbox\m_Left = #SWVB_DEFAULT
        x = fWidth - width
    Else
        x = msgbox\m_Left
    EndIf
    If msgbox\m_Top = #SWVB_DEFAULT
        y = fHeight - height
    Else
        y = msgbox\m_Top
    EndIf
    SetWindowPos_(wParam, #HWND_TOP, x, y, 0, 0, #SWP_NOSIZE + #SWP_NOZORDER + #SWP_NOACTIVATE)
    UnhookWindowsHookEx_(msgbox\m_Hook)
    ProcedureReturn tmpHook
  EndIf

EndProcedure

Procedure.i MessageResquestBOX(spromp.s, button.l, stitle.s, left.l, top.l)
;
  Protected hInst.i
  Protected thread.i
  Protected hInstance.i
  Protected wndRect.rect
  
  hInstance = GetModuleHandle_(0)
  thread    = GetCurrentThreadId_()
  With msgbox
    \m_Hook = SetWindowsHookEx_(#WH_CBT, @MsgBoxHook(), hInst, thread)
    \m_Left = left
    \m_Top  = top
  EndWith
  ProcedureReturn MessageRequester(stitle, spromp, button)

EndProcedure

; **********************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Debug MessageResquestBOX("Le message...", #PB_MessageRequester_YesNoCancel, "Votre Titre", 300, 800)

End
Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Positionnement d'un "MessageRequester" ou l'on veut

Message par Backup »

bien compliqué ton histoire :)
et puis peut etre un peu limité a Windows


voici ma version compatible tout OS

Code : Tout sélectionner


; *************** declarations *************************
;{ Windows
Enumeration
	#Window
EndEnumeration
;}
;{ Gadgets
Enumeration
	#Button_ok
	#Button_no
	#Button_Cancel
	#Text_Titre
	#Editor
EndEnumeration
;}
;{ Fonts
Enumeration
	#Font_Text_Titre
EndEnumeration
;}
Declare.s  Openrequester(x,y,titre.s,message.s)
; ********************************************************
;}

; *************** utilisation **********************
debug "la reponse est: "+Openrequester(509,187,"Information","Ceci est un message"+chr(10)+"multiligne !! ")
; ***********************************************





; ************** zone des Procedures ****************************************************
Procedure.s Openrequester(x,y,titre.s,message.s)
	; By Dobro
	if x<0:x=0:endif
	if y<0:y=0:endif
	If OpenWindow(#Window, x, y, 434, 226, "Alerte", #PB_Window_SystemMenu|#PB_Window_Tool|#PB_Window_TitleBar)
		If CreateGadgetList(WindowID(#Window))
			ButtonGadget(#Button_ok, 84, 184, 81, 28, "OK")
			ButtonGadget(#Button_no, 174, 184, 81, 28, "No")
			ButtonGadget(#Button_Cancel, 266, 184, 81, 28, "Cancel")
			TextGadget(#Text_Titre, 105, 13, 212, 34, titre.s)
			EditorGadget(#Editor, 11, 51, 412, 124, #PB_Editor_ReadOnly)
			SetGadgetText(#Editor, message.s)
			; Gadget Fonts
			SetGadgetFont(#Text_Titre, LoadFont(#Font_Text_Titre, "Arial", 18, #PB_Font_Bold|#PB_Font_HighQuality))
		EndIf
	EndIf
	;{- Event loop
	Repeat
		Select WaitWindowEvent(2)
			; ///////////////////
			Case #PB_Event_Gadget
			Select EventGadget()
				Case #Button_ok
				CloseWindow(#Window)
				ProcedureReturn "ok"
				Case #Button_no
				CloseWindow(#Window)
				ProcedureReturn "no"
				Case #Button_Cancel
				CloseWindow(#Window)
				ProcedureReturn "Cancel"
				Case #Text_Titre
				Case #Editor
			EndSelect
			; ////////////////////////
			Case #PB_Event_CloseWindow
			Select EventWindow()
				Case #Window
				CloseWindow(#Window)
				Break
			EndSelect
		EndSelect
	Forever
	;
	;}
EndProcedure

; EPB
Répondre