Diviser un CDIALOG dans deux domaines avec des arrière-plans différents (image de l'objectif à l'intérieur)

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

Question

J'ai besoin de construire une fenêtre conçue pour ressembler exactement à ceci (elle a des contrôles à l'intérieur de la zone blanche, mais ce n'est pas pertinent pour l'instant):

http://dl.dropbox.com/u/3432167/example.png
Mon problème est de définir ces deux «zones» distinctes avec des arrière-plans différents.
Le plus proche que j'ai obtenu du look attendu représentait la zone blanche avec une boîte de liste vide, mais le résultat n'est pas le même (et c'est un piratage moche).

Des idées sur la façon de réaliser cela?

Était-ce utile?

La solution 2

Après quelques fouilles, j'ai découvert qu'une bonne façon de le faire est de remplacer la fonction Onpaint.
Vous trouverez ci-dessous un exemple utilisé pour la boîte de dialogue illustrée sur la question ci-dessus. Les dimensions rectangulaires sont codées en dur car cette boîte de dialogue particulière n'est pas redimensionnenable.

N'oubliez pas d'ajouter sur_wm_paint () sur la carte des messages.

void CTestDlg::OnPaint()
{
    if (IsIconic())
    {
        (...)
    }
    else
    {
        CPaintDC dc(this); // device context for painting
        dc.FillSolidRect(0,0,612,376, RGB(255,255,255));
        dc.FillSolidRect(0,376,612,60, ::GetSysColor(COLOR_3DFACE));
        CDialog::OnPaint();
    }
}

La solution a fini par être assez simple, mais je suppose que vous êtes utile de partager de toute façon.

Autres conseils

Si la boîte de dialogue n'a pas besoin d'être redonnable, le moyen le plus simple serait de créer un BMP avec l'arrière-plan souhaité (assez facile si vous pouvez utiliser CDIALOGEX au lieu de CDIALOG - il suffit d'appeler SetBackgroundMage).

Si vous ne pouvez pas utiliser de bitmap, vous devrez créer votre propre contrôle pour dessiner cet arrière-plan.

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