首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调整NSD_SetImageOLE图像的大小

如何调整NSD_SetImageOLE图像的大小
EN

Stack Overflow用户
提问于 2012-11-15 19:13:40
回答 2查看 296关注 0票数 0

我使用的是http://nsis.sourceforge.net/NsDialogs_SetImageOLE的插件宏NSD_SetImageOLE --我想像nsDialog.nsh一样添加另一个宏NSD_SetStretchedImageOLE

但我甚至不确定这是否可能,我发现可以通过获取"HBITMAP,BITMAP和BITMAPINFO“并调整其大小(引用自http://www.mofeel.net/958-microsoft-public-vc-mfc/12516.aspx)来调整IPicture的大小。无论如何,我在尝试将这些方法转换为NSIS的System::Call样式时有点迷茫。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-16 04:33:35

代码语言:javascript
复制
!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
票数 0
EN

Stack Overflow用户

发布于 2014-12-05 11:20:29

我已经用${NSD_SetStretchedImageOLE}更新了http://nsis.sourceforge.net/mediawiki/images/6/65/NsDialogs_setImageOle.zip,它封装了Anders的代码以便于重用。我还将其更改为使用控制尺寸,而不是您自己指定大小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13396371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档