2010-08-25 17 views
4

J'ai une boîte de dialogue dans laquelle je dois afficher l'icône Informations standard. Voici mon code RC:Win32: Affichage d'une icône de stock dans une boîte de dialogue sous haute résolution

ICON "",IDC_ICON_INFORMATION,18,70,21,20 

Je traite le message WM_INITDIALOG comme suit:

HICON aIcn = LoadIcon(NULL, IDI_INFORMATION); 
SendDlgItemMessage(m_hWnd, IDC_ICON_INFORMATION, STM_SETICON, (WPARAM) aIcn, 0); 

Tout fonctionne très bien sous 96 DPI: le contrôle statique affiche une icône 32x32 pixels.

Cependant, quand je passe à DPI supérieur (par un clic droit sur le bureau , le choix Résolution d'écran, et en cliquant sur Marque ou autres objets plus ou moins) l'icône n'échelle pas! Comme tout le reste évolue bien, l'icône semble visuellement beaucoup plus petite que le texte voisin. Je m'attendais à ce que sur 144 DPI (150%) les dimensions de l'icône seront 48x48 pixels. J'ai déclaré mon application en tant que DPI au travers d'un manifeste XML. La chose la plus foutue est que lorsque j'utilise ma propre icône sur mesure (provenant aussi du fichier RC), tout s'équilibre parfaitement. En outre, la fonction MessageBox appelée avec l'indicateur MB_ICONINFORMATION affiche également une version mise à l'échelle de l'icône.

Compte tenu de ces pensées, je suppose des éléments suivants:

  1. Le contrôle statique avec le style SS_ICON peut afficher des versions mises à l'échelle d'icônes.
  2. La ressource d'icône qui contient l'icône Informations standard comporte une version mise à l'échelle de l'icône (48x48).

Qu'est-ce que je fais mal alors?

+0

On dirait que la fonction 'LoadIconWithScaleDown' (disponible dans Vista et au-dessus) peut faire le travail. D'autres idées? – Kerido

Répondre

0

Utilisez LoadImage() à la place de LoadIcon() et spécifiez les paramètres cxDesired et cyDesired avec les valeurs fournies par GetSystemMetrics (SM_CYICON) et GetSystemMetrics (SM_CXICON). Ou peut-être que le simple fait de déclarer votre application en tant que DPI est suffisant? Vous pouvez essayer cela facilement en créant simplement un fichier texte qui en fait un fichier manifeste. Voir l'exemple dans la section des remarques de l'API SetProcessDPIAware

+0

J'ai essayé tout cela. Le programme est déjà sensible à DPI à travers le manifeste. C'est écrit dans la question originale. – Kerido