R
moin meisters ...
habe mich nochmal dem Thema angenommen:
Ich habe eine ListView auf nen Dialog gezogen. Der LV eine Spalte und
3 Items hinzugefügt, das ganze bei WM_INITDIALOG ...
Folgender Code schließt sich dem an:
WM_INITDIALOG:
...
hList = GetDlgItem(hDlg, IDC_LIST1);
hHeader = ListView_GetHeader(hList);
for( int i=0; i < Header_GetItemCount(hHeader); i++)
{
HDITEM hdi;
hdi.mask = HDI_FORMAT|HDI_HEIGHT;
if( Header_GetItem(hHeader, i, &hdi) == false )
MessageBox(hDlg, "error", "1", MB_OK);
hdi.fmt |= HDF_OWNERDRAW;
hdi.mask = HDI_FORMAT|HDI_HEIGHT;
hdi.cxy *=2;
if( Header_SetItem(hHeader, i, &hdi) == false )
MessageBox(hDlg, "error", "2", MB_OK);
}
ListProc = (WNDPROC)GetWindowLong(hList, GWL_WNDPROC);
SetWindowLong(hList, GWL_WNDPROC, (LONG)SubListProc);
HeaderProc = (WNDPROC)GetWindowLong(hHeader, GWL_WNDPROC);
SetWindowLong(hHeader, GWL_WNDPROC, (LONG)SubHeaderProc);
...
dann folgen die SubProcs ( stehen eigentlich weiter oben, egal )
WNDPROC ListProc;
WNDPROC HeaderProc;
LRESULT CALLBACK SubListProc(HWND hwnd, INT uMsg, WPARAM wParam, LPARAM lParam)
{
switch( uMsg )
{
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
if( lpdis->CtlType == ODT_HEADER )
{
HDITEM hdi;
TCHAR lpBuffer[256];
hdi.mask = HDI_TEXT;
hdi.pszText = lpBuffer;
hdi.cchTextMax = 256;
Header_GetItem(lpdis->hwndItem, lpdis->itemID, &hdi);
DrawFrameControl(lpdis->hDC, &lpdis->rcItem, DFC_BUTTON, DFCS_BUTTONPUSH);
UINT uFormat = DT_CENTER;
DrawText(lpdis->hDC, lpBuffer, strlen(lpBuffer), &lpdis->rcItem, uFormat);
}
}
break;
default:
return CallWindowProc(ListProc, hwnd, uMsg, wParam, lParam);
}
return 0;
}
LRESULT CALLBACK SubHeaderProc(HWND hwnd, INT uMsg, WPARAM wParam, LPARAM lParam)
{
switch( uMsg )
{
case HDM_GETITEMRECT:
{
((LPRECT)lParam)->top = 0;
((LPRECT)lParam)->left = 0;
((LPRECT)lParam)->right = 100;
((LPRECT)lParam)->bottom = 34;
}
default:
return CallWindowProc(HeaderProc, hwnd, uMsg, wParam, lParam);
}
return 0;
}
Ich habe das Beispiel von CodeGuru hier abgewandelt verwendet (ListViewSub).
Wie man sehen sind ein paar experimentellle Zeile enthalten, mit welchen
versucht wird, die Höhe des Header "gewaltsam" zu vergrößern, was aber nicht gelingt.
Bevor Tipps angebracht werden möchte ich aus der MSDN zitieren.
HDI_HEIGHT The cxy member is valid and specifies the item's height.
HDI_WIDTH The cxy member is valid and specifies the item's width.
... und jetzt dürfen mal alle herzlich Lachen
COMMCTRL.H
#define HDI_WIDTH 0x0001
#define HDI_HEIGHT HDI_WIDTH
Ergebnis es ist wohl nicht möglich die Höhe zu ändern, es sei denn man macht
es doch so wie bei http://www.codeguru.com/listview/HeaderCtrlEx.shtml
was ich nicht glauben wollte, daß es nur so geht.
Wobei ich nichts mit dem hier anfangen kann
m_NewHeaderFont.CreatePointFont(190,"MS Serif");
//A BIGGER FONT MAKES THE CONTROL BIGGER
m_HeaderCtrl.SetFont(&m_NewHeaderFont);
Was ich noch nicht probiert habe, aber mir denke, in der SubListProc
WM_NOTIFY == > NM_CUSTOMDRAW abfängt und bei
if(lpcd->dwDrawStage == CDDS_ITEMPREPAINT )
einen neuen (größeren) FONT in den HDC einsetzt und CDRF_NEWFONT zurück gibt.
Bei WM_DRAWITEM wird dann wieder ein andere (kleinerer FONT) genommen ...
mfg
RB