Hans Leidekker : msi: Add support for bitmap buttons.
Alexandre Julliard
julliard at winehq.org
Fri Aug 7 10:42:28 CDT 2020
Module: wine
Branch: stable
Commit: 874319927a6e5bc32c9eaa7c627237e184903a8e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=874319927a6e5bc32c9eaa7c627237e184903a8e
Author: Hans Leidekker <hans at codeweavers.com>
Date: Tue Apr 21 11:55:09 2020 +0200
msi: Add support for bitmap buttons.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48974
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 9cc044957791e0658ec3d0d8ad08eebfc08b522c)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
dlls/msi/dialog.c | 166 ++++++++++++++++++++++++++++++------------------------
1 file changed, 91 insertions(+), 75 deletions(-)
diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c
index 8a28e4d4af..4333c82507 100644
--- a/dlls/msi/dialog.c
+++ b/dlls/msi/dialog.c
@@ -1009,38 +1009,120 @@ static UINT msi_dialog_button_handler( msi_dialog *dialog, msi_control *control,
return r;
}
+static HBITMAP msi_load_picture( MSIDATABASE *db, const WCHAR *name, INT cx, INT cy, DWORD flags )
+{
+ HBITMAP hOleBitmap = 0, hBitmap = 0, hOldSrcBitmap, hOldDestBitmap;
+ MSIRECORD *rec = NULL;
+ IStream *stm = NULL;
+ IPicture *pic = NULL;
+ HDC srcdc, destdc;
+ BITMAP bm;
+ UINT r;
+
+ rec = msi_get_binary_record( db, name );
+ if (!rec)
+ goto end;
+
+ r = MSI_RecordGetIStream( rec, 2, &stm );
+ msiobj_release( &rec->hdr );
+ if (r != ERROR_SUCCESS)
+ goto end;
+
+ r = OleLoadPicture( stm, 0, TRUE, &IID_IPicture, (void **)&pic );
+ IStream_Release( stm );
+ if (FAILED( r ))
+ {
+ ERR("failed to load picture\n");
+ goto end;
+ }
+
+ r = IPicture_get_Handle( pic, (OLE_HANDLE *)&hOleBitmap );
+ if (FAILED( r ))
+ {
+ ERR("failed to get bitmap handle\n");
+ goto end;
+ }
+
+ /* make the bitmap the desired size */
+ r = GetObjectW( hOleBitmap, sizeof(bm), &bm );
+ if (r != sizeof(bm))
+ {
+ ERR("failed to get bitmap size\n");
+ goto end;
+ }
+
+ if (flags & LR_DEFAULTSIZE)
+ {
+ cx = bm.bmWidth;
+ cy = bm.bmHeight;
+ }
+
+ srcdc = CreateCompatibleDC( NULL );
+ hOldSrcBitmap = SelectObject( srcdc, hOleBitmap );
+ destdc = CreateCompatibleDC( NULL );
+ hBitmap = CreateCompatibleBitmap( srcdc, cx, cy );
+ hOldDestBitmap = SelectObject( destdc, hBitmap );
+ StretchBlt( destdc, 0, 0, cx, cy, srcdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY );
+ SelectObject( srcdc, hOldSrcBitmap );
+ SelectObject( destdc, hOldDestBitmap );
+ DeleteDC( srcdc );
+ DeleteDC( destdc );
+
+end:
+ if (pic) IPicture_Release( pic );
+ return hBitmap;
+}
+
static UINT msi_dialog_button_control( msi_dialog *dialog, MSIRECORD *rec )
{
msi_control *control;
- UINT attributes, style;
+ UINT attributes, style, cx = 0, cy = 0, flags = 0;
+ WCHAR *name = NULL;
TRACE("%p %p\n", dialog, rec);
style = WS_TABSTOP;
attributes = MSI_RecordGetInteger( rec, 8 );
- if( attributes & msidbControlAttributesIcon )
- style |= BS_ICON;
+ if (attributes & msidbControlAttributesIcon) style |= BS_ICON;
+ else if (attributes & msidbControlAttributesBitmap)
+ {
+ style |= BS_BITMAP;
+ if (attributes & msidbControlAttributesFixedSize) flags |= LR_DEFAULTSIZE;
+ else
+ {
+ cx = msi_dialog_scale_unit( dialog, MSI_RecordGetInteger(rec, 6) );
+ cy = msi_dialog_scale_unit( dialog, MSI_RecordGetInteger(rec, 7) );
+ }
+ }
control = msi_dialog_add_control( dialog, rec, szButton, style );
- if( !control )
+ if (!control)
return ERROR_FUNCTION_FAILED;
control->handler = msi_dialog_button_handler;
if (attributes & msidbControlAttributesIcon)
{
- /* set the icon */
- LPWSTR name = msi_get_binary_name( dialog->package, rec );
+ name = msi_get_binary_name( dialog->package, rec );
control->hIcon = msi_load_icon( dialog->package->db, name, attributes );
if (control->hIcon)
{
SendMessageW( control->hwnd, BM_SETIMAGE, IMAGE_ICON, (LPARAM) control->hIcon );
}
- else
- ERR("Failed to load icon %s\n", debugstr_w(name));
- msi_free( name );
+ else ERR("Failed to load icon %s\n", debugstr_w(name));
+ }
+ else if (attributes & msidbControlAttributesBitmap)
+ {
+ name = msi_get_binary_name( dialog->package, rec );
+ control->hBitmap = msi_load_picture( dialog->package->db, name, cx, cy, flags );
+ if (control->hBitmap)
+ {
+ SendMessageW( control->hwnd, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM) control->hBitmap );
+ }
+ else ERR("Failed to load bitmap %s\n", debugstr_w(name));
}
+ msi_free( name );
return ERROR_SUCCESS;
}
@@ -1336,72 +1418,6 @@ static UINT msi_dialog_scrolltext_control( msi_dialog *dialog, MSIRECORD *rec )
return ERROR_SUCCESS;
}
-static HBITMAP msi_load_picture( MSIDATABASE *db, LPCWSTR name,
- INT cx, INT cy, DWORD flags )
-{
- HBITMAP hOleBitmap = 0, hBitmap = 0, hOldSrcBitmap, hOldDestBitmap;
- MSIRECORD *rec = NULL;
- IStream *stm = NULL;
- IPicture *pic = NULL;
- HDC srcdc, destdc;
- BITMAP bm;
- UINT r;
-
- rec = msi_get_binary_record( db, name );
- if( !rec )
- goto end;
-
- r = MSI_RecordGetIStream( rec, 2, &stm );
- msiobj_release( &rec->hdr );
- if( r != ERROR_SUCCESS )
- goto end;
-
- r = OleLoadPicture( stm, 0, TRUE, &IID_IPicture, (LPVOID*) &pic );
- IStream_Release( stm );
- if( FAILED( r ) )
- {
- ERR("failed to load picture\n");
- goto end;
- }
-
- r = IPicture_get_Handle( pic, (OLE_HANDLE*) &hOleBitmap );
- if( FAILED( r ) )
- {
- ERR("failed to get bitmap handle\n");
- goto end;
- }
-
- /* make the bitmap the desired size */
- r = GetObjectW( hOleBitmap, sizeof bm, &bm );
- if (r != sizeof bm )
- {
- ERR("failed to get bitmap size\n");
- goto end;
- }
-
- if (flags & LR_DEFAULTSIZE)
- {
- cx = bm.bmWidth;
- cy = bm.bmHeight;
- }
-
- srcdc = CreateCompatibleDC( NULL );
- hOldSrcBitmap = SelectObject( srcdc, hOleBitmap );
- destdc = CreateCompatibleDC( NULL );
- hBitmap = CreateCompatibleBitmap( srcdc, cx, cy );
- hOldDestBitmap = SelectObject( destdc, hBitmap );
- StretchBlt( destdc, 0, 0, cx, cy,
- srcdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
- SelectObject( srcdc, hOldSrcBitmap );
- SelectObject( destdc, hOldDestBitmap );
- DeleteDC( srcdc );
- DeleteDC( destdc );
-
-end:
- if ( pic )
- IPicture_Release( pic );
- return hBitmap;
-}
static UINT msi_dialog_bitmap_control( msi_dialog *dialog, MSIRECORD *rec )
{
More information about the wine-cvs
mailing list