NSIS:在标签中插入链接

NSIS:在标签中插入链接,nsis,Nsis,假设我有以下nsDialog标签: 通过单击“接受”,我同意示例的许可协议和隐私政策。您可以访问需要使用个人信息的功能。有关更多信息,请下载示例的内容策略 我想在此标签中插入链接,如下所示: 通过单击“接受”,我同意示例的和。您可以访问需要使用个人信息的功能。有关更多信息,请下载示例* 我可以用NSD\U CreateLink创建链接,但我不知道如何制作如上所述的链接。除了编写自己的插件来承载IE或类似的东西之外,没有什么完美的解决方案 RichEdit文本框应该支持这样的链接,但我从来并没有让

假设我有以下nsDialog标签:

通过单击“接受”,我同意示例的许可协议和隐私政策。您可以访问需要使用个人信息的功能。有关更多信息,请下载示例的内容策略

我想在此标签中插入链接,如下所示:

通过单击“接受”,我同意示例的和。您可以访问需要使用个人信息的功能。有关更多信息,请下载示例*


我可以用NSD\U CreateLink创建链接,但我不知道如何制作如上所述的链接。

除了编写自己的插件来承载IE或类似的东西之外,没有什么完美的解决方案

RichEdit文本框应该支持这样的链接,但我从来并没有让它100%正常工作,你们可以尝试更多地使用RTF数据

如果您的目标是XP+,则可以使用SysLink控件。如果你搜索NSIS论坛,你会发现它和SetCtlColors有一些问题,但在Win7的nsDialogs页面上它似乎工作正常

!include nsDialogs.nsh
!define /math EM_SETBKGNDCOLOR ${WM_USER} + 67
!define /math EM_GETTEXTRANGE ${WM_USER} + 75
!define /math EM_AUTOURLDETECT ${WM_USER} + 91
!define /math EM_SETTEXTEX ${WM_USER} + 97
!define EM_SETEVENTMASK 0x0445
!define ES_NOOLEDRAGDROP 8
!define ENM_LINK 0x4000000
!define EN_LINK 0x70B
!define NM_CLICK -2
!define NM_RETURN -4

XPStyle On ; Required by syslink (ComCtl v6)
Page Custom mypage mypageleave

var syslink

Function mypage
nsDialogs::Create 1018
pop $0

nsDialogs::CreateControl RichEdit20A ${WS_VISIBLE}|${WS_CHILD}|${WS_TABSTOP}|${ES_READONLY}|${ES_NOOLEDRAGDROP} ${WS_EX_NOPARENTNOTIFY} 10u 10u 80% 10u ''
pop $0
System::Call user32::GetSysColor(i15)i.r1
SendMessage $0 ${EM_SETBKGNDCOLOR} 0 $1
SendMessage $0 ${EM_AUTOURLDETECT} 1 0
SendMessage $0 ${EM_SETEVENTMASK} 0 ${ENM_LINK}
System::Call *(i0,i0)i.r1
;//blogs.msdn.com/b/murrays/archive/2009/09/24/richedit-friendly-name-hyperlinks.aspx# but could not get it to fully work?
SendMessage $0 ${EM_SETTEXTEX} $1 'STR:{\rtf1{\field{\*\fldinst{HYPERLINK "http://example.org"}}{\fldresult{Richedit}}} says hello}'
System::Free $1
${NSD_OnNotify} $0 onrichclick

nsDialogs::CreateControl SysLink ${WS_CHILD}|${WS_VISIBLE}|${WS_TABSTOP} 0 10u 30u -20u 10u `Hello from <A>SysLink</A>...`
pop $syslink
${NSD_OnNotify} $syslink onsyslinkclick

nsDialogs::Show
FunctionEnd

Function mypageleave
System::Call 'user32::DestroyWindow(i $syslink)'
FunctionEnd

Function onrichclick
Pop $0
Pop $1
Pop $2
${If} $1 = ${EN_LINK}
    System::Call "*$2(i,i,i,i.r1,i,i,i.r2,i.r3)"
    ${If} $3 >= 0 ; Is it a CHARRANGE we can work with?
        ${If} $1 = ${WM_LBUTTONDOWN}
            IntOp $1 $3 - $2 ; length
            IntOp $1 $1 + 1 ; \0
            System::Call '*(ir2,ir3,i,i,&t$1)i.r1' ; TEXTRANGE + align + string
            IntOp $2 $1 + 16
            System::Call '*$1(i,i,ir2)'
            SendMessage $0 ${EM_GETTEXTRANGE} 0 $1
            System::Call "*$2(&t999.r2)"
            ExecShell open $2
            System::Free $1
        ${EndIf}
    ${EndIf}
${EndIf}
FunctionEnd

Function onsyslinkclick
Pop $0
Pop $1
Pop $2
${If} $0 = $syslink
    ${If} $1 = ${NM_CLICK}
    ${OrIf} $1 = ${NM_RETURN}
        System::Call `*$2(i,i,i,i,i.r3)`
        ${If} $3 == 0 ; link index
            ; This could probably be changed to extract the link from <A href="foo">...</A> in the syslink
            ExecShell open `http://example.com/`
        ${EndIf}
    ${EndIf}
${EndIf}
FunctionEnd
!包括nsDialogs.nsh
!define/math EM_SETBKGNDCOLOR${WM_USER}+67
!define/math EM_gettextange${WM_USER}+75
!define/math EM_autourldetch${WM_USER}+91
!define/math EM_SETTEXTEX${WM_USER}+97
!定义EM_SETEVENTMASK 0x0445
!定义ES_NOOLEDRAGDROP 8
!定义ENM_链接0x4000000
!定义EN_链接0x70B
!定义NM_单击-2
!定义NM_返回-4
xpon风格;syslink(ComCtl v6)所需
页面自定义mypage mypageleave
var系统链接
功能mypage
nsDialogs::创建1018
流行音乐$0
nsDialogs::CreateControl RichEdit20A${WS_VISIBLE}}${WS_CHILD}${WS_TABSTOP}|${ES_READONLY}|${ES_NOOLEDRAGDROP}${WS_EX NOPARENTNOTIFY}10u 80%10u''
流行音乐$0
System::Call user32::GetSysColor(i15)i.r1
SendMessage$0${EM_SETBKGNDCOLOR}0$1
SendMessage$0${EM_AUTOURLDETECT}1 0
SendMessage$0${EM_SETEVENTMASK}0${ENM_LINK}
系统::调用*(i0,i0)i.r1
;//blogs.msdn.com/b/murrays/archive/2009/09/24/richedit-friendly-name-hyperlinks.aspx#但无法使其完全工作?
SendMessage$0${EM_SETTEXTEX}$1'STR:{\rtf1{\field{\*\fldinst{HYPERLINK”http://example.org“}{\fldresult{Richedit}}}说你好}”
系统::免费1美元
${NSD_OnNotify}$0 onrichclick
nsDialogs::CreateControl系统链接${WS_CHILD}|${WS_VISIBLE}|${WS_TABSTOP}0 10u 30u-20u 10u`系统链接中的Hello from
ExecShell打开`http://example.com/`
${EndIf}
${EndIf}
${EndIf}
功能端

使用${NSD_CreateLabel}创建几个标签,如下(“|”是分隔符):

通过单击“接受我同意”示例的“许可协议”和“隐私政策”,您可以访问

因此,您的文本将由几个单独的标签组成,这些标签逐个放置以创建文本

然后简单地使用链接器插件(几天前我更新了它以支持透明文本)和那些应该是链接的标签:

Linker::link /NOUNLOAD $Label2Hwnd "http://www.unsigned-softworks.sk/"
Linker::link /NOUNLOAD $Label4Hwnd "http://www.graphical-installer.com/"
我最终:

使用此GetTextExtent: 并调用:GetSystemMetrics(SM_CXMENUCHECK)

以及一些小的垂直/水平像素固定

!define FIRST_PART "I have read and accepted the "

...

; Get the dialog's default font in $R1

SendMessage $DIALOG ${WM_GETFONT} 0 0 $R1

; Get width for text into $R2
${GetTextExtent} $R1 "${FIRST_PART}" $R2 $R3

; Get checkbox width into $0

System::Call 'user32::GetSystemMetrics(i 71) i .r0' ;SM_CXMENUCHECK = 71

IntOp $1 $R2 + $0 ; width of checkbox + text into $1
IntOp $1 $1 - 2 ; -2 fixes some checkbox extra padding

; $1 contains the required width ($R3 the line height)

${NSD_CreateCheckbox} ${TEXT_LEFT_START_POS}u ${CHECKBOX_TOP}u $1u $R3u ${FIRST_PART}


; And now, the next label or link can be positioned by:

IntOp $1 ${TEXT_LEFT_START_POS} + $1 ; position after checkbox and text

谢谢我认为这是迄今为止解决这个问题的最好方法。我不知道我做错了什么,但链接没有显示,代码是:
${NSD_CreateLabel}0 75u 100%10u“许可协议”Pop$label3${NSD_CreateLabel}0 85u 100%10u“隐私策略”Pop$label4 Linker::link/NOUNLOAD$label3http://www.unsigned-softworks.sk/"链接器::链接/加载$label4“http://www.graphical-installer.com/“
不要忘记链接器插件不会执行链接(单击文本)。您需要在函数中手动执行此操作。为控件添加onClick函数,例如GetFunctionAddress$0 MoreDetails单击nsDialogs::onClick$Labe$0Hi@Slappy,您能否用一个如何使用管道的示例更新答案?我尝试了几种方法,但都失败了,找不到关于这个话题的更多信息。感谢来自前方!没有管道在文本中标记一个标签的结尾和另一个标签的开头。谢谢。但我需要一些适用于较低窗口版本的东西。我认为Slappy的答案非常有用。虽然这只是一个简单的工作,但它是可靠的。你能格式化你的代码吗?
!define FIRST_PART "I have read and accepted the "

...

; Get the dialog's default font in $R1

SendMessage $DIALOG ${WM_GETFONT} 0 0 $R1

; Get width for text into $R2
${GetTextExtent} $R1 "${FIRST_PART}" $R2 $R3

; Get checkbox width into $0

System::Call 'user32::GetSystemMetrics(i 71) i .r0' ;SM_CXMENUCHECK = 71

IntOp $1 $R2 + $0 ; width of checkbox + text into $1
IntOp $1 $1 - 2 ; -2 fixes some checkbox extra padding

; $1 contains the required width ($R3 the line height)

${NSD_CreateCheckbox} ${TEXT_LEFT_START_POS}u ${CHECKBOX_TOP}u $1u $R3u ${FIRST_PART}


; And now, the next label or link can be positioned by:

IntOp $1 ${TEXT_LEFT_START_POS} + $1 ; position after checkbox and text