Comment une barre d'outils Vista ignorer ou comprendre le paramètre de remplissage à la frontière?

StackOverflow https://stackoverflow.com/questions/1101653

Question

J'ai une barre d'outils développée sous les anciennes versions de Windows qui est en grande partie sous Vista coupés en raison de la fenêtre nouvelle padding frontière. Avec le remplissage de bordure par défaut de 4, le tout sur la barre d'outils est poussé quatre pixels vers le bas et à droite, puis tout est recadrée quatre pixels de la droite et en bas. Je ne me soucie pas vraiment de la dimension horizontale autant, mais verticalement cela signifie l'application perd huit pixels de contenu visible.

Par « barre d'outils » Je veux dire une fenêtre créée semblable à ce qui suit:

APPBARDATA  AppBarData;
AppBarData.hWnd = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, MAIN_WNDCLASS,
                                 "", WS_POPUP | WS_THICKFRAME | WS_CLIPCHILDREN,
                                 0, 0, 400, TOOLBAR_HEIGHT, NULL, NULL,
                                 AppInstance, NULL);
// more initialization  ....
SHAppBarMessage(ABM_NEW, &AppBarData);

Depuis le rembourrage de la frontière est un élément de configuration en apparence nouvelle à Vista, comment une application qui fonctionne à la fois XP et Vista gérer cela? Mes questions sont les suivantes:

  1. Est-il possible pour une barre d'outils pour dire Vista « Ignorer le « padding frontière » mise, mon rembourrage frontière est 0 »?
  2. Dans le cas contraire, comment une application comprendre ce que le rembourrage de bordure est définie sur elle peut donc faire sa fenêtre plus grand par deux fois ce montant?
  3. Pour les deux questions, comment faites-vous cela d'une manière qui permet le même exécutable pour fonctionner sous XP, Vista, Win2003, etc.?
Était-ce utile?

La solution

une option est de jouer avec différents styles de fenêtre, en commençant par WS_THICKFRAME.

pour déterminer le rembourrage essayer GetClientRect et GetWindowRect et soustraire l'une de l'autre.

Autres conseils

Une autre chose à noter est séparément que si vous êtes déjà essayé de tenir compte de la bordure de la fenêtre en utilisant GetSystemMetrics ou similaire, le sous-système vous compilez à fait une différence dans la façon dont les frontières impact sur votre espace client.

Un lien à objectmix tente d'expliquer cela. Par sous-système, je crois ce qu'ils veulent dire est le drapeau de /subsystem lorsque vous liez la .exe ou le paramètre correspondant dans Visual Studio.

~ bijoux

Eh bien, je me suis dehors, sorte si. Dans mon cas, la cause du problème est l'utilisation de WS_THICKFRAME lors de l'appel CreateWindowEx(), que je ne l'ai pas besoin. Ce paramètre a été utilisé précédemment pour tout centrer verticalement dans la barre d'outils. Je pense que sous Windows XP (vue classique) et plus tôt, un WS_THICKFRAME on pouvait s'y attendre ajouté 3 pixels de rembourrage sur toutes les tailles.

Ainsi, j'ai supprimé cette option et a changé le code pour déplacer tout trois pixels vers le bas et à droite. Maintenant, la barre d'outils semble identique sous Windows XP et Vista et je n'ai pas ennuyeux et inutile (pour cette barre d'outils) rembourrage supplémentaire.

Cela ne résout pas le cas général, mais étant donné que ma réponse peut aider les autres qui se jettent dans cela, je pensais que je poste ma solution. J'espère que cela aide quelqu'un d'autre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top