comctl32/button: Implement BCM_SETSPLITINFO.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
202a1c1ef0
commit
82d39e1817
|
@ -86,6 +86,9 @@ typedef struct _BUTTON_INFO
|
||||||
INT note_length;
|
INT note_length;
|
||||||
DWORD image_type; /* IMAGE_BITMAP or IMAGE_ICON */
|
DWORD image_type; /* IMAGE_BITMAP or IMAGE_ICON */
|
||||||
BUTTON_IMAGELIST imagelist;
|
BUTTON_IMAGELIST imagelist;
|
||||||
|
UINT split_style;
|
||||||
|
HIMAGELIST glyph; /* this is a font character code when split_style doesn't have BCSS_IMAGE */
|
||||||
|
SIZE glyph_size;
|
||||||
RECT text_margin;
|
RECT text_margin;
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
|
@ -243,6 +246,21 @@ static inline WCHAR *get_button_text( const BUTTON_INFO *infoPtr )
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get the default glyph size for split buttons */
|
||||||
|
static LONG get_default_glyph_size(const BUTTON_INFO *infoPtr)
|
||||||
|
{
|
||||||
|
if (infoPtr->split_style & BCSS_IMAGE)
|
||||||
|
{
|
||||||
|
/* Size it to fit, including the left and right edges */
|
||||||
|
int w, h;
|
||||||
|
if (!ImageList_GetIconSize(infoPtr->glyph, &w, &h)) w = 0;
|
||||||
|
return w + GetSystemMetrics(SM_CXEDGE) * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The glyph size relies on the default menu font's cell height */
|
||||||
|
return GetSystemMetrics(SM_CYMENUCHECK);
|
||||||
|
}
|
||||||
|
|
||||||
static void init_custom_draw(NMCUSTOMDRAW *nmcd, const BUTTON_INFO *infoPtr, HDC hdc, const RECT *rc)
|
static void init_custom_draw(NMCUSTOMDRAW *nmcd, const BUTTON_INFO *infoPtr, HDC hdc, const RECT *rc)
|
||||||
{
|
{
|
||||||
nmcd->hdr.hwndFrom = infoPtr->hwnd;
|
nmcd->hdr.hwndFrom = infoPtr->hwnd;
|
||||||
|
@ -834,6 +852,34 @@ static LRESULT CALLBACK BUTTON_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, L
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case BCM_SETSPLITINFO:
|
||||||
|
{
|
||||||
|
BUTTON_SPLITINFO *info = (BUTTON_SPLITINFO*)lParam;
|
||||||
|
|
||||||
|
if (!info) return TRUE;
|
||||||
|
|
||||||
|
if (info->mask & (BCSIF_GLYPH | BCSIF_IMAGE))
|
||||||
|
{
|
||||||
|
infoPtr->split_style &= ~BCSS_IMAGE;
|
||||||
|
if (!(info->mask & BCSIF_GLYPH))
|
||||||
|
infoPtr->split_style |= BCSS_IMAGE;
|
||||||
|
infoPtr->glyph = info->himlGlyph;
|
||||||
|
infoPtr->glyph_size.cx = infoPtr->glyph_size.cy = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->mask & BCSIF_STYLE)
|
||||||
|
infoPtr->split_style = info->uSplitStyle;
|
||||||
|
if (info->mask & BCSIF_SIZE)
|
||||||
|
infoPtr->glyph_size = info->size;
|
||||||
|
|
||||||
|
/* Calculate fitting value for cx if invalid (cy is untouched) */
|
||||||
|
if (infoPtr->glyph_size.cx <= 0)
|
||||||
|
infoPtr->glyph_size.cx = get_default_glyph_size(infoPtr);
|
||||||
|
|
||||||
|
/* Windows doesn't invalidate or redraw it, so we don't, either */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
case BM_GETCHECK:
|
case BM_GETCHECK:
|
||||||
return infoPtr->state & 3;
|
return infoPtr->state & 3;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue