Nsis 如何调整NSD_SetImageOLE图像的大小

Nsis 如何调整NSD_SetImageOLE图像的大小,nsis,Nsis,我正在使用来自的插件宏NSD_SetImageOLEfrom,我想以同样的方式添加另一个宏NSD_SetStretchedImageOLEnsDialog.nsh工作 但我甚至不确定这是否可能,我发现可以通过获取“HBITMAP、BITMAP和BITMAPINFO”并调整大小(引用自)来调整I结构的大小。无论如何,我在尝试将这些方法转换为NSIS的System::Call风格时有些不知所措。我用${NSD_SetStretchedImageOLE}进行了更新,它封装了Anders的代码以实现可重

我正在使用来自的插件宏
NSD_SetImageOLE
from,我想以同样的方式添加另一个宏
NSD_SetStretchedImageOLE
nsDialog.nsh工作


但我甚至不确定这是否可能,我发现可以通过获取“HBITMAP、BITMAP和BITMAPINFO”并调整大小(引用自)来调整
I结构的大小。无论如何,我在尝试将这些方法转换为NSIS的
System::Call
风格时有些不知所措。

我用${NSD_SetStretchedImageOLE}进行了更新,它封装了Anders的代码以实现可重用性。我还将其更改为使用控件维度,而不是您自己指定大小。

是否需要第二次调用gdi32::GetDIBits?看起来不是,但我不想打破一些黑魔法…@hcs可能是针对颜色表的,如果有,我真的不记得了。有道理,第一次调用只得到一个BitMapInfo头,因为前一行清除了biBitCount(i0清除了biBitCount和biPlanes),然后,由于设置了位计数,第二次调用将获得完整的BITMAPINFO(包括颜色表),这避免了必须指定位计数。谢谢
!ifndef IID_IPicture
    !define IID_IPicture {7BF80980-BF32-101A-8BBB-00AA00300CAB}
!endif
!define SRCCOPY 0xCC0020
!include nsDialogs.nsh

!define IMAGEPATH "$sysdir\migwiz\PostMigRes\Web\base_images\Documents.gif" ;"C:\Windows\Web\Wallpaper\Windows\img0.jpg"
!define NEWSIZEW 200
!define NEWSIZEH 100

Page Custom mypagestretchcreate_GDI ; GDI resize
Page Custom mypagestretchcreate_CTL ; Simple control resize


Function mypagestretchcreate_GDI
nsDialogs::Create 1018
Pop $0
System::Call 'oleaut32::OleLoadPicturePath(w "${IMAGEPATH}",i0r2,i0,i0,g"${IID_IPicture}",*i.r9)i.r1'
${If} $1 = 0
    System::Call 'user32::GetDC(i0)i.s'
    System::Call 'gdi32::CreateCompatibleDC(iss)i.r1'
    System::Call 'gdi32::CreateCompatibleBitmap(iss,i${NEWSIZEW},i${NEWSIZEH})i.r2'
    System::Call 'user32::ReleaseDC(i0,is)'
    System::Call $9->3(*i.r3)i.r4 ; IPicture->get_Handle
    ${If} $4 = 0
        System::Call 'gdi32::SetStretchBltMode(ir1,i4)'
        System::Call '*(&i40,&i1024)i.r4' ; BITMAP / BITMAPINFO
        System::Call 'gdi32::GetObject(ir3,i24,ir4)'
        System::Call 'gdi32::SelectObject(ir1,ir2)i.s'
        System::Call '*$4(i40,i.r6,i.r7,i0,i,i.s)' ; Grab size and bits-ptr AND init as BITMAPINFOHEADER
        System::Call 'gdi32::GetDIBits(ir1,ir3,i0,i0,i0,ir4,i0)' ; init BITMAPINFOHEADER
        System::Call 'gdi32::GetDIBits(ir1,ir3,i0,i0,i0,ir4,i0)' ; init BITMAPINFO
        System::Call 'gdi32::StretchDIBits(ir1,i0,i0,i${NEWSIZEW},i${NEWSIZEH},i0,i0,ir6,ir7,is,ir4,i0,i${SRCCOPY})'
        System::Call 'gdi32::SelectObject(ir1,is)'
        System::Free $4
    ${EndIf}
    System::Call 'gdi32::DeleteDC(ir1)'
    System::Call $9->2() ; IPicture->release()
${EndIf}
${NSD_CreateBitmap} 1u 1u ${NEWSIZEW} ${NEWSIZEH} ""
Pop $9
;Not required when the control size matches: ${NSD_AddStyle} $9 ${SS_CENTERIMAGE}
SendMessage $9 ${STM_SETIMAGE} ${IMAGE_BITMAP} $2
nsDialogs::Show
System::Call 'gdi32::DeleteObject(ir2)'
FunctionEnd

Function mypagestretchcreate_CTL
nsDialogs::Create 1018
Pop $2
${NSD_CreateBitmap} 0 1u 70% 50% ""
Pop $3
${NSD_AddStyle} $3 ${SS_REALSIZECONTROL}
File "/oname=$PLUGINSDIR\image.bmp" "${NSISDIR}\Contrib\Graphics\Header\win.bmp"
${NSD_SetImage} $3 "$PLUGINSDIR\image.bmp" $1
nsDialogs::Show
${NSD_FreeImage} $1
FunctionEnd