2008-11-03 3 views
2

Je souhaite créer une boîte de dialogue transparente. Je capture le message OnCtlColor dans une classe dérivée CDialog ... c'est le code:Comment rendre l'arrière-plan du texte de la boîte de groupe transparent

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{ 
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
    if(bSetBkTransparent_) 
    { 
     pDC->SetBkMode(TRANSPARENT); 
     hbr = (HBRUSH)GetStockObject(NULL_BRUSH);   
    } 


    return hbr; 
} 

Il fonctionne très bien pour toutes les commandes mais le groupe boîte (CStatic). Toutes les étiquettes (CStatic) sont peintes avec un fond de texte transparent mais le texte de la boîte de groupe n'est pas transparent.

je l'ai déjà googlé pour cela, mais je n'ai pas trouvé des solutions. Est-ce que quelqu'un sait comment faire une vraie boîte de groupe transparente? En passant, je travaille sous Windows XP. Et je ne veux pas dessiner complètement le contrôle pour éviter d'avoir à changer le code si l'application est migrée vers un autre système d'exploitation.

Merci,

Javier

Note: J'ai finalement changé la boîte de dialogue pour que je ne ai pas besoin pour le rendre transparent. Quoi qu'il en soit, j'ajoute cette information car peut-être que quelqu'un essaie toujours de le faire. Le groupbox n'est pas un CStatic mais un CButton (je sais que ce n'est pas nouveau). J'ai changé le thème de Windows XP en Windows classique, puis le backgraund groupbox était transparent. La mauvaise nouvelle est que dans ce cas, la ligne de cadre devient visible sous le texte ... donc si quelqu'un suit cette approche, je pense qu'il pourrait peut-être mieux suivre le conseil de l'Adzm.

+0

Je viens d'essayer ceci dans un test très rapide, et le texte de la boîte de groupe est transparent (dans la mesure où même la boîte de groupe est visible sous le texte). Il se peut que votre problème ne soit pas dans le code ci-dessus: vous pouvez essayer un programme de test de démonstration minimal et rapide. – DavidK

Répondre

1

Vous avez deux options.

Vous ne pouvez pas utiliser les contrôles communs v6 (les contrôles stylés XP), qui fera de votre application perdre le fanciness des nouvelles versions de Windows. Cependant IIRC le groupbox respectera le problème CTLCOLOR. Si vous ne l'utilisez que de toute façon, et il est toujours pas respecter votre couleur, alors vous n'avez une option ...

Ce qui est de dessiner vous-même. Je sais que vous avez dit que vous ne le vouliez pas, mais parfois vous devez le faire. Heureusement, une boîte de groupe est un contrôle très simple à dessiner. Cette page contient un exemple pour dessiner une boîte de groupe de style classique: http://www.codeguru.com/cpp/controls/controls/groupbox/article.php/c2273/ Vous pouvez également dessiner très simplement en utilisant les bibliothèques UxTheme fournies avec XP +.

Si l'application sera migré vers un autre système d'exploitation, vous aurez beaucoup à faire face à la migration sur une application MFC en général. Si tel est votre objectif, alors vous devriez vraiment envisager de développer avec une boîte à outils de l'interface utilisateur multiplateforme.

1

définir simplement le style de fenêtre de WS_EX_TRANSPARENT étendu pour la zone de groupe.

Questions connexes