2008-11-26 7 views
0

J'essaie de créer un contrôle qui implémente le mélange alpha par pixel tout en peignant un bitmap 32 bits.Contrôle statique avec style WS_EX_TRANSPARENT non repeint

J'ai étendu un CWnd et utilisé un contrôle statique dans l'éditeur de ressources. J'ai réussi à peindre le canal alpha correctement, mais le contrôle statique continue à peindre le fond gris. J'ai écrasé le OnEraseBkgnd pour empêcher le contrôle de peindre l'arrière-plan, mais cela n'a pas fonctionné. J'ai finalement réussi à le faire en utilisant WS_EX_TRANSPARENT.

Mon problème est maintenant que mon contrôle est placé sur un autre contrôle. La première fois que la boîte de dialogue est peinte tout fonctionne bien ... mais si je clique sur le contrôle "parent" (c'est-à-dire celui sous mon contrôle) mon contrôle n'a pas reçu le message WM_PAINT. Donc ce n'est plus peint.

Si je minimise l'application et la maximise à nouveau, les commandes sont repeintes.

S'il vous plaît, quelqu'un peut-il donner un indice? Je deviens fou avec ce contrôle !!!

Merci.

Répondre

3

j'aurais bien que si vous traitez à la fois la WM_ERASEBKGND et les WM_PAINT messages alors vous devriez avoir couvert toutes les options de peinture, sans avoir à recourir à l'utilisation du style de WS_EX_TRANSPARENT.

Etes-vous sûr de votre code ne passe pas ces messages sur le traitement par défaut ?

Une autre option pourrait être sous-classe le contrôle statique, juste pour vous assurer que votre code est le seul à gérer ces deux messages.

0

http://unick-soft.ru/Articles.cgi?id=12 - désolé sur le russe, mais ont Exemple. Exemple avoir un lien hypertexte "", sur l'article du bas après l'exemple de code. Apprendre le russe :)

+0

Merci pour le lien. Heureusement, C++ peut être compris dans n'importe quel "langage". J'ai assez d'essayer d'apprendre l'anglais pour commencer avec le russe. –

+0

Si vous n'avez pas trouvé de lien vers l'échantillon. Lien direct: http://unick-soft.ru/soft/static.zip –

2
BEGIN_MESSAGE_MAP(CTransparentStatic, CStatic) 
    ON_WM_ERASEBKGND() 
    ON_WM_CTLCOLOR_REFLECT() 
END_MESSAGE_MAP() 

BOOL CTransparentStatic::OnEraseBkgnd(CDC* /*pDC*/) 
{ 
    // Prevent from default background erasing. 
    return FALSE; 
} 

BOOL CTransparentStatic::PreCreateWindow(CREATESTRUCT& cs) 
{ 
    cs.dwExStyle |= WS_EX_TRANSPARENT; 
    return CStatic::PreCreateWindow(cs); 
} 

HBRUSH CTransparentStatic::CtlColor(CDC* pDC, UINT /*nCtlColor*/) 
{ 
    pDC->SetBkMode(TRANSPARENT); 
    return reinterpret_cast<HBRUSH>(GetStockObject(NULL_BRUSH)); 
} 

void CTransparentStatic::PreSubclassWindow() 
{ 
    CStatic::PreSubclassWindow(); 

    const LONG_PTR exStyle = GetWindowLongPtr(m_hWnd, GWL_EXSTYLE); 
    SetWindowLongPtr(m_hWnd, GWL_EXSTYLE, exStyle | WS_EX_TRANSPARENT); 
} 
Questions connexes