[VC, MFC] Größe, Position der Checkbox (ownerdraw)

11/09/2012 - 11:35 von Dirk Noack | Report spam
Hallo NG,

ich gerade dabei eine Checkbox, genauer gesagt einen Button mit der
Eigenschaft Checkbox, selber zu zeichnen. Icons, Bitmaps oder andere
Schriftformatierungen spielen dabei keine Rolle. Ich keine aufgeblasene
XXLButton-Klasse der einschlàgigen Programmierwebsites nehmen um nur die
Hinter-/Vordergrundfarbe zu àndern.

In der DrawItem-Methode habe ich folgendes programmiert:

void CButtonExt::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect = lpDrawItemStruct->rcItem;

...
pDC->DrawFrameControl(rect, DFC_BUTTON, DFCS_BUTTONCHECK );
...
}

Für einen einfachen Button funktioniert die Kombination DrawFrameControl
mit rect (rcItem), jedoch wird bei einer Checkbox, die Box auf die
komplette Steuerelementgröße gezoomt/gezeichnet.

Wenn man die Checkbox nicht als "ownerdraw" vom Framework mit dem Flag
"BS_AUTOCHECKBOX" zeichnen làsst, wird die Größe der eigentlichen
Hàkchenbox begrenzt, d.h. auch wenn ich das Steuerelement im
"Dialogdesigner" größer mache, bleibt die Größe der weißen Box erhalten.

Ich möchte ein nahezu identisches/àhnliches Aussehen wie durch das
Framework, nur um ein Paar einfache Features erweitert.
Wie ermittle ich diese Werte (Größe, Position)? Sind die fest im
Framework hinterlegt oder gibt es da eine irgendeine Get-Methode bzw.
eine abfragbare Systemeigenschaft (Systemmetrics...)?

MfG
Dirk
 

Lesen sie die antworten

#1 Jochen Arndt
11/09/2012 - 17:05 | Warnen spam
Am 11.09.2012 11:35, schrieb Dirk Noack:

ich gerade dabei eine Checkbox, genauer gesagt einen Button mit der
Eigenschaft Checkbox, selber zu zeichnen.


[...]
Für einen einfachen Button funktioniert die Kombination DrawFrameControl
mit rect (rcItem), jedoch wird bei einer Checkbox, die Box auf die
komplette Steuerelementgröße gezoomt/gezeichnet.


[...]
Wie ermittle ich diese Werte (Größe, Position)? Sind die fest im
Framework hinterlegt oder gibt es da eine irgendeine Get-Methode bzw.
eine abfragbare Systemeigenschaft (Systemmetrics...)?



Bei klassischen Check Boxes ist die maximale Größe fix, und zwar 13 x 13
Pixel. Bei Verwendung von Themes kann die Größe ermittelt werden:

SIZE sz;
CRect rectBox = lpDrawItemStruct->rcItem;
if (m_hTheme == NULL ||
GetThemePartSize(m_hTheme,
lpDrawItemStruct->hDC,
BP_CHECKBOX,
RBS_UNCHECKEDNORMAL,
&rectBox,
TS_DRAW,
&sz) != S_OK)
{
sz.cx = sz.cy = 13;
}

Anschließend sollte man die Größe noch justieren, falls die Größe des
Controls kleiner ist als die der CheckBox:

if (rectBox.Height() < sz.cy)
sz.cx = sz.cy = rectBox.Height();

Dann die horizontale Position der Box und die Breite setzen:

if (GetStyle() & BS_LEFTTEXT)
{
if (rectBox.right - sz.cx > rectBox.left)
rectBox.left = rectBox.right - sz.cx;
}
else
{
if (rectBox.left + sz.cx < rectBox.right)
rectBox.right = rectBox.left + sz.cx;
}

Eine abschließende vertikale Zentrierung ist optional, da die Box von
DrawFrameControl() zentriert ausgegeben wird:

if (rectBox.Height() > sz.cy+1)
rectBox.top = (rectBox.Height() - sz.cy) >> 1;
rectBox.bottom = rectBox.top + sz.cy;

rectBox enthàlt jetzt die Koordinaten zum Zeichnen. Bei der Ausgabe des
zugehörigen Textes diesen dann mit 5 Pixel horizontalem Abstand ausgeben.

Joe

Ähnliche fragen