Je constate un curieux comportement de la commande Line.
J'exécute dans 2 fenêtres du même projet l'instruction :
Line (x1, y1)-(x2, y2), QBcolor(12), BF
Dans un cas le rectangle EFFACE les Labels qui se trouvent à l'intérieur,
dans l'autre fenêtre il les laisse intacts.
Pourtant ces labels ont été copiés d'une fenêtre vers l'autre.
Que se passe-t-il ?
NOTA: j'ai aussi des ListBox et des OptionButton à l'intérieur des
rectangles. Ils ne sont pas effacés.
J'ajoute que je peux récupérer mes Labels avec Label....Refresh mais ce n'est pas élégant et n'explique pas le phénomène.
Picalausa François
Hello,
Pour faire simple, les labels sont tracés en même temps que tout traçage nécessaire sur le form (c'est à dire, à l'événement Paint). Ceci est du au fait qu'il s'agisse de contrôle windowless (ils ne disposent pas de leur propre surface de traçage, mais peuvent indiquer à leur parent la zone qu'ils aimeraient occuper). Ceci permet de diminuer le nombre d'hwnd que windows devra gérer pour une même application. (ce qui évitait sous 9x de tomber sur les limites de nombre d'hwnd, et qui permet encore de préserver un peu de mémoire)
Label.refresh, force la zone client de la form à retracer le label, et donc corrige le problème.
En disposant d'une feuille autoredraw = true, il est aussi possible de masquer ce problème. Une autre manière de l'aborder est de stoquer les éléments (ici, le rectangle) à tracer d'une manière ou d'une autre, et dans l'événement paint de tracer ceux-ci. Il suffira alors d'utiliser la méthode Refresh du form pour actualiser tous les labels et effectuer le traçage (ça se rapproche de ce que réalisé autoredraw).
Une autre manière de procéder est de négliger l'avantage windowless, les fenêtres superposées effectuant un clipping automatiquement. Par exemple, en plaçant le label dans un picturebox sur la form, le problème disparait car le picturebox est une fenêtre!
-- Picalausa François
"Barsalou" a écrit dans le message de news:
J'ajoute que je peux récupérer mes Labels avec Label....Refresh mais ce n'est pas élégant et n'explique pas le phénomène.
Hello,
Pour faire simple, les labels sont tracés en même temps que tout traçage
nécessaire sur le form (c'est à dire, à l'événement Paint). Ceci est du au
fait qu'il s'agisse de contrôle windowless (ils ne disposent pas de leur
propre surface de traçage, mais peuvent indiquer à leur parent la zone
qu'ils aimeraient occuper).
Ceci permet de diminuer le nombre d'hwnd que windows devra gérer pour une
même application. (ce qui évitait sous 9x de tomber sur les limites de
nombre d'hwnd, et qui permet encore de préserver un peu de mémoire)
Label.refresh, force la zone client de la form à retracer le label, et donc
corrige le problème.
En disposant d'une feuille autoredraw = true, il est aussi possible de
masquer ce problème.
Une autre manière de l'aborder est de stoquer les éléments (ici, le
rectangle) à tracer d'une manière ou d'une autre, et dans l'événement paint
de tracer ceux-ci. Il suffira alors d'utiliser la méthode Refresh du form
pour actualiser tous les labels et effectuer le traçage (ça se rapproche de
ce que réalisé autoredraw).
Une autre manière de procéder est de négliger l'avantage windowless, les
fenêtres superposées effectuant un clipping automatiquement. Par exemple, en
plaçant le label dans un picturebox sur la form, le problème disparait car
le picturebox est une fenêtre!
--
Picalausa François
"Barsalou" <ericMettreUnPointbarsalou@wanadoo.fr> a écrit dans le message de
news: eBhxDpNEHHA.4120@TK2MSFTNGP02.phx.gbl...
J'ajoute que je peux récupérer mes Labels avec Label....Refresh mais ce
n'est pas élégant et n'explique pas le phénomène.
Pour faire simple, les labels sont tracés en même temps que tout traçage nécessaire sur le form (c'est à dire, à l'événement Paint). Ceci est du au fait qu'il s'agisse de contrôle windowless (ils ne disposent pas de leur propre surface de traçage, mais peuvent indiquer à leur parent la zone qu'ils aimeraient occuper). Ceci permet de diminuer le nombre d'hwnd que windows devra gérer pour une même application. (ce qui évitait sous 9x de tomber sur les limites de nombre d'hwnd, et qui permet encore de préserver un peu de mémoire)
Label.refresh, force la zone client de la form à retracer le label, et donc corrige le problème.
En disposant d'une feuille autoredraw = true, il est aussi possible de masquer ce problème. Une autre manière de l'aborder est de stoquer les éléments (ici, le rectangle) à tracer d'une manière ou d'une autre, et dans l'événement paint de tracer ceux-ci. Il suffira alors d'utiliser la méthode Refresh du form pour actualiser tous les labels et effectuer le traçage (ça se rapproche de ce que réalisé autoredraw).
Une autre manière de procéder est de négliger l'avantage windowless, les fenêtres superposées effectuant un clipping automatiquement. Par exemple, en plaçant le label dans un picturebox sur la form, le problème disparait car le picturebox est une fenêtre!
-- Picalausa François
"Barsalou" a écrit dans le message de news:
J'ajoute que je peux récupérer mes Labels avec Label....Refresh mais ce n'est pas élégant et n'explique pas le phénomène.
Jean-marc
"Barsalou" a écrit dans le message de news:
J'ajoute que je peux récupérer mes Labels avec Label....Refresh mais ce n'est pas élégant et n'explique pas le phénomène.
"Barsalou" <ericMettreUnPointbarsalou@wanadoo.fr> a écrit dans le message de
news: eBhxDpNEHHA.4120@TK2MSFTNGP02.phx.gbl...
J'ajoute que je peux récupérer mes Labels avec Label....Refresh mais ce
n'est pas élégant et n'explique pas le phénomène.