Use LoadImage to load bitmaps and icons.
This commit is contained in:
parent
ede2c34343
commit
e41ba5ca80
|
@ -53,7 +53,7 @@ struct msi_control_tag
|
|||
msi_handler handler;
|
||||
LPWSTR property;
|
||||
LPWSTR value;
|
||||
IPicture *pic;
|
||||
HBITMAP hBitmap;
|
||||
HICON hIcon;
|
||||
LPWSTR tabnext;
|
||||
WCHAR name[1];
|
||||
|
@ -301,7 +301,7 @@ static msi_control *msi_dialog_create_window( msi_dialog *dialog,
|
|||
control->handler = NULL;
|
||||
control->property = NULL;
|
||||
control->value = NULL;
|
||||
control->pic = NULL;
|
||||
control->hBitmap = NULL;
|
||||
control->hIcon = NULL;
|
||||
control->tabnext = strdupW( MSI_RecordGetString( rec, 11) );
|
||||
|
||||
|
@ -628,52 +628,6 @@ static MSIRECORD *msi_get_binary_record( MSIDATABASE *db, LPCWSTR name )
|
|||
return MSI_QueryGetRecord( db, query, name );
|
||||
}
|
||||
|
||||
static UINT msi_load_bitmap( MSIDATABASE *db, LPCWSTR name, IPicture **pic )
|
||||
{
|
||||
MSIRECORD *rec = NULL;
|
||||
IStream *stm = NULL;
|
||||
UINT r;
|
||||
|
||||
rec = msi_get_binary_record( db, name );
|
||||
if( !rec )
|
||||
return ERROR_FUNCTION_FAILED;
|
||||
|
||||
r = MSI_RecordGetIStream( rec, 2, &stm );
|
||||
msiobj_release( &rec->hdr );
|
||||
if( r != ERROR_SUCCESS )
|
||||
return r;
|
||||
|
||||
r = OleLoadPicture( stm, 0, TRUE, &IID_IPicture, (LPVOID*) pic );
|
||||
IStream_Release( stm );
|
||||
if( FAILED( r ) )
|
||||
return ERROR_FUNCTION_FAILED;
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
static UINT msi_dialog_bitmap_control( msi_dialog *dialog, MSIRECORD *rec )
|
||||
{
|
||||
IPicture *pic = NULL;
|
||||
msi_control *control;
|
||||
OLE_HANDLE hBitmap = 0;
|
||||
LPCWSTR text;
|
||||
UINT r;
|
||||
|
||||
control = msi_dialog_add_control( dialog, rec, szStatic,
|
||||
SS_BITMAP | SS_LEFT | SS_CENTERIMAGE );
|
||||
text = MSI_RecordGetString( rec, 10 );
|
||||
r = msi_load_bitmap( dialog->package->db, text, &pic );
|
||||
if( r == ERROR_SUCCESS )
|
||||
{
|
||||
r = IPicture_get_Handle( pic, &hBitmap );
|
||||
if( SUCCEEDED( r ) )
|
||||
SendMessageW( control->hwnd, STM_SETIMAGE, IMAGE_BITMAP, hBitmap );
|
||||
control->pic = pic;
|
||||
}
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
static LPWSTR msi_create_tmp_path(void)
|
||||
{
|
||||
WCHAR tmp[MAX_PATH];
|
||||
|
@ -698,19 +652,19 @@ static LPWSTR msi_create_tmp_path(void)
|
|||
return path;
|
||||
}
|
||||
|
||||
static UINT
|
||||
msi_load_icon( MSIDATABASE *db, LPCWSTR name, DWORD attributes, HICON *picon )
|
||||
static HANDLE msi_load_image( MSIDATABASE *db, LPCWSTR name, UINT type,
|
||||
UINT cx, UINT cy, UINT flags )
|
||||
{
|
||||
UINT r = ERROR_FUNCTION_FAILED;
|
||||
MSIRECORD *rec = NULL;
|
||||
HANDLE himage = NULL;
|
||||
LPWSTR tmp;
|
||||
MSIRECORD *rec;
|
||||
HICON hicon = 0;
|
||||
UINT r;
|
||||
|
||||
TRACE("loading %s\n", debugstr_w( name ) );
|
||||
TRACE("%p %s %u %u %08x\n", db, debugstr_w(name), cx, cy, flags);
|
||||
|
||||
tmp = msi_create_tmp_path();
|
||||
if( !tmp )
|
||||
return r;
|
||||
return himage;
|
||||
|
||||
rec = msi_get_binary_record( db, name );
|
||||
if( rec )
|
||||
|
@ -718,8 +672,63 @@ msi_load_icon( MSIDATABASE *db, LPCWSTR name, DWORD attributes, HICON *picon )
|
|||
r = MSI_RecordStreamToFile( rec, 2, tmp );
|
||||
if( r == ERROR_SUCCESS )
|
||||
{
|
||||
DWORD cx = 0, cy = 0, flags = LR_LOADFROMFILE | LR_DEFAULTSIZE;
|
||||
himage = LoadImageW( 0, tmp, type, cx, cy, flags );
|
||||
DeleteFileW( tmp );
|
||||
}
|
||||
msiobj_release( &rec->hdr );
|
||||
}
|
||||
|
||||
HeapFree( GetProcessHeap(), 0, tmp );
|
||||
return himage;
|
||||
}
|
||||
|
||||
static UINT msi_dialog_bitmap_control( msi_dialog *dialog, MSIRECORD *rec )
|
||||
{
|
||||
UINT cx, cy, flags, style, attributes;
|
||||
msi_control *control;
|
||||
LPCWSTR text;
|
||||
|
||||
flags = LR_LOADFROMFILE;
|
||||
style = SS_BITMAP | SS_LEFT | WS_GROUP;
|
||||
|
||||
attributes = MSI_RecordGetInteger( rec, 8 );
|
||||
if( attributes & msidbControlAttributesFixedSize )
|
||||
{
|
||||
flags |= LR_DEFAULTSIZE;
|
||||
}
|
||||
style |= SS_CENTERIMAGE;
|
||||
|
||||
control = msi_dialog_add_control( dialog, rec, szStatic, style );
|
||||
text = MSI_RecordGetString( rec, 10 );
|
||||
cx = MSI_RecordGetInteger( rec, 6 );
|
||||
cy = MSI_RecordGetInteger( rec, 7 );
|
||||
cx = msi_dialog_scale_unit( dialog, cx );
|
||||
cy = msi_dialog_scale_unit( dialog, cy );
|
||||
|
||||
control->hBitmap = msi_load_image( dialog->package->db, text,
|
||||
IMAGE_BITMAP, cx, cy, flags );
|
||||
if( control->hBitmap )
|
||||
SendMessageW( control->hwnd, STM_SETIMAGE,
|
||||
IMAGE_BITMAP, (LPARAM) control->hBitmap );
|
||||
else
|
||||
ERR("Failed to load bitmap %s\n", debugstr_w(text));
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
static UINT msi_dialog_icon_control( msi_dialog *dialog, MSIRECORD *rec )
|
||||
{
|
||||
msi_control *control;
|
||||
DWORD attributes, cx = 0, cy = 0, flags;
|
||||
LPCWSTR text;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
control = msi_dialog_add_control( dialog, rec, szStatic,
|
||||
SS_ICON | SS_CENTERIMAGE | WS_GROUP );
|
||||
|
||||
flags = LR_LOADFROMFILE | LR_DEFAULTSIZE;
|
||||
attributes = MSI_RecordGetInteger( rec, 8 );
|
||||
if( attributes & msidbControlAttributesFixedSize )
|
||||
{
|
||||
flags &= ~LR_DEFAULTSIZE;
|
||||
|
@ -736,41 +745,11 @@ msi_load_icon( MSIDATABASE *db, LPCWSTR name, DWORD attributes, HICON *picon )
|
|||
/* msidbControlAttributesIconSize48 handled by above logic */
|
||||
}
|
||||
|
||||
hicon = LoadImageW( 0, tmp, IMAGE_ICON, cx, cy, flags );
|
||||
if( hicon )
|
||||
*picon = hicon;
|
||||
else
|
||||
ERR("failed to load icon from %s\n", debugstr_w( tmp ));
|
||||
DeleteFileW( tmp );
|
||||
}
|
||||
msiobj_release( &rec->hdr );
|
||||
}
|
||||
|
||||
HeapFree( GetProcessHeap(), 0, tmp );
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static UINT msi_dialog_icon_control( msi_dialog *dialog, MSIRECORD *rec )
|
||||
{
|
||||
msi_control *control;
|
||||
DWORD attributes;
|
||||
HICON hIcon = 0;
|
||||
LPCWSTR text;
|
||||
UINT r;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
control = msi_dialog_add_control( dialog, rec, szStatic,
|
||||
SS_ICON | SS_CENTERIMAGE | WS_GROUP );
|
||||
text = MSI_RecordGetString( rec, 10 );
|
||||
attributes = MSI_RecordGetInteger( rec, 8 );
|
||||
r = msi_load_icon( dialog->package->db, text, attributes, &hIcon );
|
||||
if( r == ERROR_SUCCESS )
|
||||
{
|
||||
r = SendMessageW( control->hwnd, STM_SETICON, (WPARAM) hIcon, 0 );
|
||||
control->hIcon = hIcon;
|
||||
}
|
||||
control->hIcon = msi_load_image( dialog->package->db, text,
|
||||
IMAGE_ICON, cx, cy, flags );
|
||||
if( control->hIcon )
|
||||
SendMessageW( control->hwnd, STM_SETICON, (WPARAM) control->hIcon, 0 );
|
||||
else
|
||||
ERR("Failed to load bitmap %s\n", debugstr_w(text));
|
||||
return ERROR_SUCCESS;
|
||||
|
@ -1907,8 +1886,8 @@ void msi_dialog_destroy( msi_dialog *dialog )
|
|||
/* leave dialog->hwnd - destroying parent destroys child windows */
|
||||
HeapFree( GetProcessHeap(), 0, t->property );
|
||||
HeapFree( GetProcessHeap(), 0, t->value );
|
||||
if( t->pic )
|
||||
IPicture_Release( t->pic );
|
||||
if( t->hBitmap )
|
||||
DeleteObject( t->hBitmap );
|
||||
if( t->hIcon )
|
||||
DestroyIcon( t->hIcon );
|
||||
HeapFree( GetProcessHeap(), 0, t->tabnext );
|
||||
|
|
Loading…
Reference in New Issue