FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Exemple d'une nouvelle version d'un GRID
par Minibug Mer 16 Jan 2019 - 18:23

» Peut-être un bug de l'éditeur pour Jack
par jjn4 Lun 14 Jan 2019 - 17:45

» Wordpic.2
par jjn4 Sam 12 Jan 2019 - 16:34

» Fichier <-> Datas
par jjn4 Sam 12 Jan 2019 - 16:23

» Version instantanée V 0.9.29i6 du 08/01/2019
par Jack Mer 9 Jan 2019 - 7:50

» Make_Exe avec la version V 0.9.29i6
par Jack Mar 8 Jan 2019 - 20:14

» caret_yb_position
par jjn4 Mar 8 Jan 2019 - 19:34

» Problème avec l'analyseur syntaxique de Panoramic.
par jjn4 Lun 7 Jan 2019 - 14:44

» PanExpress : l'éditeur Panoramic avec création d'objet
par Minibug Dim 6 Jan 2019 - 18:39

» Bonne année 2019
par silverman Sam 5 Jan 2019 - 12:02

» Blocage Editeur
par Minibug Mar 1 Jan 2019 - 15:54

» Un texte clignotant
par JL35 Mar 1 Jan 2019 - 13:50

» Bonnes fêtes de fin d'année !
par JL35 Mar 1 Jan 2019 - 0:04

» ON_CLICK sur HVIEWER
par JL35 Lun 31 Déc 2018 - 16:56

» Logiciel de soutien scolaire.
par Pedro Alvarez Lun 31 Déc 2018 - 7:51

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Janvier 2019
LunMarMerJeuVenSamDim
 123456
78910111213
14151617181920
21222324252627
28293031   
CalendrierCalendrier
Autopassion.net le site dédié à l'automobile créé par ses utilisateurs
Partagez | 
 

 Fenêtre en TOPMOST et Editeur Panoramic

Aller en bas 
AuteurMessage
Navigateur

avatar

Nombre de messages : 42
Age : 70
Localisation : Les Clayes-sous-bois 78340
Date d'inscription : 02/09/2016

MessageSujet: Fenêtre en TOPMOST et Editeur Panoramic   Sam 2 Juin 2018 - 18:03

Bonjour,

J'ai rencontré un problème d'affichage dans mon programme de rétablissement des fenêtres des aides de l'éditeur de Panoramic.

Tout d'abord, pour mettre une fenêtre au premier plan (TOPMOST), on ne peut faire appel directement à la fonction SetWindowPos de user32.dll car elle nécessite le passage de 7 paramètres (pas de Dll_Call7). J'ai dû passer par FreeBasic pour créer une DLL à 2 paramètres.
Voir ci-dessous le code en Freebasic à compiler avec l'option -dll pour obtenir la DLL, FB_Set_Wnd_ZO.dll.

Code:
' =================================================================================================
' DLL pour changer le ZEZO-ORDER d'une fenêtre dont le handle est connu
' FREEBASIC V1.05.0
' A compiler avec l'option -dll

Extern "Windows-MS"

#Include Once "windows.bi"

Declare Function FB_Set_Wnd_ZO(as Handle, as Handle) As Integer

' SET WINDOW ZERO ORDER FUNCTION
Function FB_Set_Wnd_ZO(Wnd_Hdle as Handle, Wnd_ZO_Flag as Handle) as Integer Export
  Return SetWindowPos(Wnd_Hdle, Wnd_ZO_Flag, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE)
End Function

End Extern

' =================================================================================================
' Paramètres de la fonction SetWindowPos de user32.dll

' SetWindowPos( hwnd, hWndInsertAfter, x, y, cx, cy, wFlags)

' hwnd : Le handle de la fenêtre à déplacer.

' hWndInsertAfter : Le handle de la fenêtre à positionner pas rapport à la fenêtre située derrière
'                   ou un des paramètres d'état suivants :
'                   HWND_BOTTOM    =  1 : Mettre la fenêtre en bas de l'ordre Z.
'                   HWND_NOTOPMOST = -2 : Put the window below all topmost windows and above all non-topmost windows.
'                   HWND_TOP       =  0 : Mettre la fenêtre au dessus des autres.
'                   HWND_TOPMOST   = -1 : Mettre la fenêtre au dessus de toutes les autres en permanence.

' x   : Coordonné x du coin haut gauche.
' y   : Coordonnée y du coin haut gauche.
' cx  : Coordonnée x du coin bas droit.
' cy  : Coordonnée y du coin bas droit.

' wFlags : Zéro ou une des valeurs suivantes :
'                   SWP_DRAWFRAME    = 20  : Identique à SWP_FRAMECHANGED.
'                   SWP_FRAMECHANGED = 20  : Redessine complètement la fenêtre dans sa nouvelle position.
'                   SWP_HIDEWINDOW   = 80  : Cache la fenêtre.
'                   SWP_NOACTIVATE   = 10  : Ne réactive pas la fenêtre après déplacement si celle-ci était déjà active.
'                   SWP_NOCOPYBITS   = 100 : Ne redessine rien de la fenêtre après son déplacement.
'                   SWP_NOMOVE       = 2   : Sans déplacement de la fenêtre.
'                   SWP_NOSIZE       = 1   : Sans redimensionnement de la fenêtre.
'                   SWP_NOREDRAW     = 8   : Ne redessine pas l'image de la fenêtre de sa position initiale (laissera une image fantôme à l'écran).
'                   SWP_NOZORDER     = 4   : Ne pas changer la position de la fenêtre dans l'ordre Z.
'                   SWP_SHOWWINDOW   = 40  : Afficher la fenêtre si celle-ci est caché.
' =================================================================================================

Maintenant, en Panoramic, je crée 2 programmes pour afficher un court message dans leur fenêtre Form 0. Une fenêtre a gardé son titre (caption) par défaut et l'autre a vu son titre changé.

Affichage d'une fenêtre en TOPMOST avec son titre par défaut :

Code:
' PROGRAMME AVEC LA FORM 0 EN TOP MOST AVEC SON TITRE PAR DEFAUT
' PANORAMIC V0.9.28i18 du 27/04/2018
' FREEBASIC V1.05.0
 
' =================================================================================================
' FONCTIONS/COMMANDES PANORAMIC/FREEBASIC
' User32.dll         => Function SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int  X, int  Y, int  cx, int  cy, uFlags)
' FB_Set_Wnd_ZO.dll  => Function FB_Set_Wnd_ZO(Wnd_Hdle as Handle, Wnd_ZO_Flag as Handle) as Integer
' Définition des valeurs possibles de Wnd_ZO_Flag
Dim ZO_BOTTOM%    : ZO_BOTTOM%    =  1 : ' Put the window at the bottom of the Z-order.
Dim ZO_NOTOPMOST% : ZO_NOTOPMOST% = -2 : ' Put the window below all topmost windows and above all non-topmost windows.
Dim ZO_TOP%       : ZO_TOP%       =  0 : ' Put the window at the top of the Z-order.
Dim ZO_TOPMOST%   : ZO_TOPMOST%   = -1 : ' Make the window topmost (above all other windows) permanently.

' Dimensions / position de FORM 0
Left   0, 700
Top    0, 0
Width  0, 340
Height 0, 115

' Handle de la FORM 0
Dim Form0_Hdle%
Form0_Hdle% = Handle(0)

' FORM0 en TOPMOST
Dim res%
Dll_ON "FB_Set_Wnd_ZO.dll"
res% = Dll_Call2("FB_Set_Wnd_ZO", Form0_Hdle%, ZO_TOPMOST%)
DLL_OFF

' Affichage d'un texte
Font_Bold 0
Print
Print "     *****************************************************"
Print "     ***** FENETRE AFFICHEE EN TOPMOST *****"
Print "     *****    SANS CHANGEMENT DE TITRE   *****"
Print "     *****************************************************"

Affichage d'une fenêtre en TOPMOST avec changement de titre :

Code:
' PROGRAMME AVEC LA FORM 0 EN TOP MOST AVEC CHANGEMENT DE TITRE
' PANORAMIC V0.9.28i18 du 27/04/2018
' FREEBASIC V1.05.0
 
' =================================================================================================
' FONCTIONS/COMMANDES PANORAMIC/FREEBASIC
' User32.dll         => Function SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int  X, int  Y, int  cx, int  cy, uFlags)
' FB_Set_Wnd_ZO.dll  => Function FB_Set_Wnd_ZO(Wnd_Hdle as Handle, Wnd_ZO_Flag as Handle) as Integer
' Définition des valeurs possibles de Wnd_ZO_Flag
Dim ZO_BOTTOM%    : ZO_BOTTOM%    =  1 : ' Put the window at the bottom of the Z-order.
Dim ZO_NOTOPMOST% : ZO_NOTOPMOST% = -2 : ' Put the window below all topmost windows and above all non-topmost windows.
Dim ZO_TOP%       : ZO_TOP%       =  0 : ' Put the window at the top of the Z-order.
Dim ZO_TOPMOST%   : ZO_TOPMOST%   = -1 : ' Make the window topmost (above all other windows) permanently.

' Dimensions / position de FORM 0
Left   0, 700
Top    0, 120
Width  0, 340
Height 0, 115

' Handle de la FORM 0
Dim Form0_Hdle%
Form0_Hdle% = Handle(0)

' Changement de nom de FORM 0
Caption 0, "TOPMOST"

' FORM0 en TOPMOST
Dim res%
Dll_ON "FB_Set_Wnd_ZO.dll"
res% = Dll_Call2("FB_Set_Wnd_ZO", Form0_Hdle%, ZO_TOPMOST%)
DLL_OFF

' Affichage d'un texte
Font_Bold 0
Print
Print "     *****************************************************"
Print "     ***** FENETRE AFFICHEE EN TOPMOST *****"
Print "     *****    AVEC CHANGEMENT DE TITRE   *****"
Print "     *****************************************************"

Je crée les deux fichiers exe correspondant que j'exécute.

Si à partir de la même version de l'éditeur, j'exécute via F9 un autre programme (même sans aucune instruction), la fenêtre qui a gardé son titre par défaut disparaît.

Cela semble lié à un processus (Père ?) lié à la fenêtre dont le titre, qui n'a pas changé, est le même que celui de l'éditeur qui l'a créé.
L'éditeur/son make-exe doit faire le "ménage" au lancement d'un autre programme (du moins parmi les programmes à fenêtre TOPMOST qui portent le même titre que lui ?)

Handle           Lev      Pid     -Window status-  Image                                                 Caption
0x3A09D8 1     3400  Res Ina Ena Vis   FEN_TOPMOST_AVEC_CHGT_NOM  Fen_topmost_avec_chgt_nom
0x4506BC 1     5880  Res Ina Ena Vis   FEN_TOPMOST_SANS_CHGT_NOM  Fen_topmost_sans_chgt_nom
0x34053C 1     5880  Res Ina Ena Vis   FEN_TOPMOST_SANS_CHGT_NOM  PANORAMIC V 0.9.28i18


Navigateur
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 6063
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Fenêtre en TOPMOST et Editeur Panoramic   Sam 2 Juin 2018 - 19:02

Au lieu de SetWindowPos tu peux utiliser BringWindowToTop de la user32.dll qui permet d’amener une fenêtre spécifiée en haut du Z-index, en la plaçant au dessus de toutes les fenêtres qui se trouvaient auparavant dessus.

Inspire toi de ce code pour l'adapter à tes besoins.

Code:

rem ============================================================================
label clic
dim i,hwnd%,ret%
shape 1 : shape_rectangle_rounded 1 : full_space 1 : color 1,255,255,0
for i = 10 to 50 step 10
    panel i : top i,5*i : left i,4*i : width i,200 : height i,150
    color i,i*4,255-i,i : on_click i,clic
next i

for i = 100 to 150 step 10
    panel i : top i, 2.5*i-150 : left i,500-2*i
    width i,250 : height i,100
    color i,50+i,100,200-i : on_click i,clic
next i
caption 0,"Cliquez dans les PANELs"
end
rem ============================================================================
Clic:
   dll_on "user32"
   hwnd% = handle(number_click)
   ret% = dll_call1("BringWindowToTop",hwnd%)
   dll_off
return
rem ============================================================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Navigateur

avatar

Nombre de messages : 42
Age : 70
Localisation : Les Clayes-sous-bois 78340
Date d'inscription : 02/09/2016

MessageSujet: Re: Fenêtre en TOPMOST et Editeur Panoramic   Dim 3 Juin 2018 - 13:43

Bonjour,

Merci papydall pour la réponse.

En fait la fonction BringWindowToTop de user32.dll ne permet pas de mettre une fenêtre au premier plan.

Il a des subtilités dans l'états de fenêtres que je ne comprends pas encore bien. Voir ci-dessous quelques explications trouvées sur le WEB.

D'après
- https://msdn.microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx
- https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms632673(v=vs.85).aspx

 BringWindowToTop function :

 Brings the specified window to the top of the Z order.
 If the window is a top-level window, it is activated.
 If the window is a child window, the top-level parent window associated with the child window is activated.


 SetWindowPos function :
 Changes the size, position, and Z order of a child, pop-up, or top-level window.
 These windows are ordered according to their appearance on the screen.
 The topmost window receives the highest rank and is the first window in the Z order.


- http://forums.codeguru.com/showthread.php?491610-Windows-SDK-What-is-a-top-level-window
 Windows SDK: What is a top-level window?
 Q: What is a top-level window?

 A: A top-level window is a window that is not child, i.e. it has not WS_CHILD style set.

 Notes
 . unlike the child windows, a top-level window can be displayed anywhere in the screen;
 . many definitions state that a top-level window is "a window that has no parent";
that is correct but can lead in a confusion: many people think that every window which is created passing a valid hWndParent in CreateWindow(Ex) "has a parent" then, according to the definition it is not top-level;
in fact hWndParent may be either a handle to parent or owner window;
if hWndParent is a valid window handle and WS_CHILD style is not set, then we have a top-level owned window;
 . a top-level window can or can not be owned but is never a child; further we can say that it can have an owner but never has a parent.
 . top-level windows can be either overlapped windows (having WS_OVERLAPPED style and generally used as application main window) or popup windows (having WS_POPUP style, usually temporary windows like message boxes and dialogs);
. the coordinates used in CreateWindow(Ex), MoveWindow, SetWindowPos, and so on are always scren coordinates (relative to top-left corner of the screen).


Pour revenir à mon problème dans le rétablissement des fenêtres d'aide de l'éditeur de Panoramic, je l'ai résolu en renommant la fenêtre de mon programme. En faisant cela, il me semble que mon programme n’apparaît plus comme étant un enfant (child) de l'éditeur Panoramic et n'est plus perturbé par le lancement d'un autre programme par F9.

Navigateur.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Fenêtre en TOPMOST et Editeur Panoramic   

Revenir en haut Aller en bas
 
Fenêtre en TOPMOST et Editeur Panoramic
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Editeur Panoramic.
» Générateur / editeur de donjon (les débuts)
» Programmes Panoramic en ligne de commande
» Liste des mots-clé de Panoramic
» [RESOLU] EDITEUR IME

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: A l'aide!-
Sauter vers: