From 9fcfaaa64aeb76649c327bd473165c0cb7d2576d Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Sat, 28 Mar 2015 23:39:14 +0300 Subject: [PATCH] comctl32/listview: Support header item image/bitmap in LVSCW_AUTOSIZE_USEHEADER case. --- dlls/comctl32/listview.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c index 861335b134d..b3c79760325 100644 --- a/dlls/comctl32/listview.c +++ b/dlls/comctl32/listview.c @@ -6,7 +6,7 @@ * Copyright 2000 Jason Mawdsley * Copyright 2001 CodeWeavers Inc. * Copyright 2002 Dimitrie O. Paun - * Copyright 2009-2014 Nikolay Sivov + * Copyright 2009-2015 Nikolay Sivov * Copyright 2009 Owen Rudge for CodeWeavers * Copyright 2012-2013 Daniel Jelinski * @@ -54,7 +54,6 @@ * -- Support CustomDraw options for _WIN32_IE >= 0x560 (see NMLVCUSTOMDRAW docs). * -- LVA_SNAPTOGRID not implemented * -- LISTVIEW_ApproximateViewRect partially implemented - * -- LISTVIEW_SetColumnWidth ignores header images & bitmap * -- LISTVIEW_StyleChanged doesn't handle some changes too well * * Speedups @@ -8402,18 +8401,38 @@ static BOOL LISTVIEW_SetColumnWidth(LISTVIEW_INFO *infoPtr, INT nColumn, INT cx) cx = 0; /* retrieve header text */ - hdi.mask = HDI_TEXT; + hdi.mask = HDI_TEXT|HDI_FORMAT|HDI_IMAGE|HDI_BITMAP; hdi.cchTextMax = DISP_TEXT_SIZE; hdi.pszText = szDispText; if (SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, nColumn, (LPARAM)&hdi)) { HDC hdc = GetDC(infoPtr->hwndSelf); HFONT old_font = SelectObject(hdc, (HFONT)SendMessageW(infoPtr->hwndHeader, WM_GETFONT, 0, 0)); + HIMAGELIST himl = (HIMAGELIST)SendMessageW(infoPtr->hwndHeader, HDM_GETIMAGELIST, 0, 0); + INT bitmap_margin = 0; SIZE size; if (GetTextExtentPoint32W(hdc, hdi.pszText, lstrlenW(hdi.pszText), &size)) cx = size.cx + TRAILING_HEADER_PADDING; - /* FIXME: Take into account the header image, if one is present */ + + if (hdi.fmt & (HDF_IMAGE|HDF_BITMAP)) + bitmap_margin = SendMessageW(infoPtr->hwndHeader, HDM_GETBITMAPMARGIN, 0, 0); + + if ((hdi.fmt & HDF_IMAGE) && himl) + { + INT icon_cx, icon_cy; + + if (!ImageList_GetIconSize(himl, &icon_cx, &icon_cy)) + cx += icon_cx + 2*bitmap_margin; + } + else if (hdi.fmt & HDF_BITMAP) + { + BITMAP bmp; + + GetObjectW(hdi.hbm, sizeof(BITMAP), &bmp); + cx += bmp.bmWidth + 2*bitmap_margin; + } + SelectObject(hdc, old_font); ReleaseDC(infoPtr->hwndSelf, hdc); }