Pb NSWindow
ldfa
Membre
Bonjour à tous
Déja un problème ... avec une custom NSView dans une NSWindow.
Enfin c'est surtout avec la fenêtre que j'ai un problème:
Si je valide l'attribute has texture, lorsque je fais un mouseDragged dans ma view, la fenêtre ce déplace ... >:(
Si je dévalide l'attribute has texture .. plus de problème.
J'ai trouvé ça dans la doc qui confirme mon problème...
NSTexturedBackgroundWindowMask
The window displays with a metal-textured background. Additionally, the window may be moved by clicking and dragging anywhere in the window background. A bordered window with this mask gets rounded bottom corners.
Question ... comment éviter que ma fenêtre ce déplace lorsque je click dans ma view ? car j'aime bien le look de cette fenêtre :-)
Déja un problème ... avec une custom NSView dans une NSWindow.
Enfin c'est surtout avec la fenêtre que j'ai un problème:
Si je valide l'attribute has texture, lorsque je fais un mouseDragged dans ma view, la fenêtre ce déplace ... >:(
Si je dévalide l'attribute has texture .. plus de problème.
J'ai trouvé ça dans la doc qui confirme mon problème...
NSTexturedBackgroundWindowMask
The window displays with a metal-textured background. Additionally, the window may be moved by clicking and dragging anywhere in the window background. A bordered window with this mask gets rounded bottom corners.
Question ... comment éviter que ma fenêtre ce déplace lorsque je click dans ma view ? car j'aime bien le look de cette fenêtre :-)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
et en renvoyant NO dans la méthode de NSWindow ?:
Non,
en passant NO à la méthode setMovableByWindowBackground: de NSWindow (à mettre dans le awakeFromNib du contrôleur si la fenêtre est créée dans IB).
.
En effet.
Mais quoiqu'il en soit l'idée de faire une textured window non "background-dragable" n'est pas forcément bonne dans la mesure où justement cet aspect particulier des fenêtres nous informe de ce comportement particulier par apport aux fenêtres "normales".
Ta fenêtre risque de perturber les utilisateurs, je suis pas sur que ce soit conforme à l'Apple Human Interface Guidelines.
Il était ennuyé pour un mouse drag dans une view, pas sur la fenêtre elle-même!
Sinon, les drag'n drop seraient impossible avec des fenêtres texturées
Je n'ose y croire >:D
Celà ne change pas le fait que de désactivé la possibilité de déplacer une textured-window en cliquant dans son contenu soit peut-être un peu perturbant.
Comme j'ai pas encore de contrôleur, j'ai rajouté un awakeFrmNib dans ma sous classe de NSWiew et cela fonctionne, encore merci ... suffisait de lire un peu mieux la doc !!!
Cependant, ma NSView n'occupe pas toute ma fenêtre, donc la rendre dragable autour de ma NSView est un bon exercice pour moi en tout cas :-)
Bon j'ai essayé sans succés dans ma custom NSView:
- (void) mouseDown: (NSEvent *) theEvent //Click souris dans la NSView
{
NSLog (@MouseDown NSView);
[[self window] setMovableByWindowBackground: NO];
}
- (void) mouseUp: (NSEvent *) theEvent //Relachement de bouton de la souris dans la NSView
{
NSLog (@MouseUp NSView);
[[self window] setMovableByWindowBackground: YES];
}
Déja pourquoi cela fonctionne pas m'interesse, même si j'ai une petite idée (le methode est appelé trop tardivement)
Peut être à faire dans la fenêtre, des idées?
Merci
Pour ceci, tu dois implanter dans la sous classe la méthode isOpaque et retourner YES :
Dans ce cas, tu es sûr que tous les événements souris arriveront à ta view (avant d'être attrapés par le window-server comme c'est ton cas actuellement).
.
Merci ... et cela fonctionne .... le moins que l'on puisse dire c'est que c'est opaque :-)
En tout cas c'est pas avec la doc de isOpaque de NSView que j'ai la réponse au pourquoi du comment.
Une piste pour m'aider à comprendre ... un lien vers une doc ?
Bon cela me genère tout de même un léger problème, du coup, je n'ai plus la texture métalique en transparence lorsque je recopie une NSImage dans ma view .... mais du blanc ou du noir ... mais cela me semble plus logique, la partie métalique correspond à la zone permettant le déplacement de la fenêtre.
Eh bin, t'es pas copain avec la doc !
Pour reproduire le fond de la fenêtre dans ta view, là où tu ne dessines rien, il te suffit d'appeler la fonction NSDrawWindowBackground(NSRect) au tout début de ta méthode drawRect: pour "peindre" le fond de la view avec le motif du fond de la fenêtre.
.
Je ne me souviens pas l'avoir fait avec une vue, mais avec une NSView c'est sur.
Après avoir défini: on ajoute quelque chose comme
Avec une valeur de monAlphaValue (float) au dessus de 0,14 , ça marche impec.
La fenêtre est quasiment transparente et elle intercepte les clics et drags.
Je vois pas trop pourquoi il en serait autrement avec une NSView ...
Il en est autrement pour la simple raison qu'une vue ne possède pas de valeur alpha...
Il est donc de ta responsabilité de déterminer si une portion quelconque de ta vue est transparente (et donc laisse voir le fond) ou non.
Dans l'exemple que j'ai donné à ldfa, je ne me suis pas fatigué, sa vue est déclarée entièrement opaque, donc le fond n'est pas visible. Ceci peut être réparé via la fonction NSDrawWindowBackground.
.
une vue en elle même non, mais si la vue est déclarée sans background et que tu "draw" son contenu avec un fond présentant une valeur alpha proche de 0,15 ça doit donner une vue transparente (l'oeil exercé voit à peine qu'il y a un fond) et dragable.
P.S.
La mémoire me revient, j'avais fait ça avec une NSTextVue Sans backround et dont les attributes strings étaient tout simplement affublées d'un tel fond avec valeur alpha.
Pour faire varier la transparence en directe il suffisait de redéfinir la valeur Alpha des attributs de fond et mettre à jour la textVue.
Si ta vue est non-opaque, le gestionnaire d'événement considère alors qu'elle est transparente, et donc (tout comme une fenêtre avec un alpha à 0), transmet l'événement (mouseDown par exemple) à la vue parente.
Même si tu dessines une figure pleine dans ta vue non-opaque, et même si cette dernière est visible à l'écran, le fait de renvoyer NO à isOpaque "trompe" le gestionnaire d'événement. En effet, comment veux tu que ce dernier sache ce que tu as dessiné, et où tu l'as dessiné, et donc de déterminer ce qu'il doit faire de l'événement (le transmettre aux vues parentes ou non)...
Par contre, le système te laisse libre de modifier dynamiquement la valeur de isOpaque en cours d'éxecution, afin d'avertir le gestionnaire que le point de l'événement est sur une portion opaque ou non.
Ainsi, si l'événement à lieu dans ta figure, tu fais en sorte de renvoyer YES à l'appel de isOpaque, sinon tu y renvoies NO.
.
J'avais défini des couleures paires et impaires pour un affichage de listing
Après tu écrit du texte
Puis tu lui colle la background alpha-bétisée
Et ça marche comme ça, sans avoir à intercepter quoique ce soit tant que l'alpha est > 0,14.
Ben ecoutes si c'est le cas pourquoi mon code marche ? (ça vient d'une appli qui tourne depuis 2 ans)
La TextView est posée sur une fenêtre transparente dont la valeur alpha varie avec celle de mes attributes strings, c'est peut-être ça qui fait que ça marche ?
C'est alors la fenêtre (qui a le même alpha) qui réagi au clic ? et non pas la textView ?
Bon dès que je peux je recompile la source et vois ça dans le débugger ...
J'ai recompilé le source en forçant la fenêtre à une valeur Alpha à zéro en permanence et la textVue avec Alpha réglable de zéro à 1.
Force est de constater que je peux plus draguer ma fenêtre (c'est logique).
Mais, si un clic sur une zone transparente de la fenêtre est bien reçue par la fenêtre sous jascente,
un clic sur la textVue, dès que son alpha est suffisant, n'atteint pas la fenêtre du dessous et permet de sélectionner des portions de texte et de les éditer, donc elle gère les clics non ?
Ma textView n'implémente pas de fonction permettant de la draguer, je ne peux donc vérifier si un drag peut-être déclenché, mais la textView (sans brakground) gère les clics tombant sur une ligne dont l'Alpha est superieur à 0,15.
Au besoin, on doit pouvoir, s'il le faut, transmettre le clicDrag reçu par le texte à sa textVue
[EDIT]A noter que le clic a l'air d'être transmis à la hiérarchie dans la mesure ou un clic sur une ligne totalement transparente ne fait rien alors qu'un clic sur une ligne pas tout à fait transparente fait aussi repasser la fenêtre au premier plan
J'aurais peut-être pu me passer de recompiler tout le basar !
Ma fenêtre, à transparence réglable en même temps que son contenu, a une ToolBar dont les items n'on pas de fond non plus !
Et y'a aucun problème pour les draguer (dans le "customize toolbar") dès lors que l'alpha est supérieur à 0,14 !
CQFD non ?
Sinon c'est un problème sans fond pour moi ;D