3

次の nsDialog ラベルがあるとします。

[同意する] をクリックすると、例の使用許諾契約とプライバシー ポリシーに同意します。個人情報の使用が必要な機能にアクセスする場合があります。詳細については、サンプルのコンテンツ ポリシーをダウンロードしてください。

以下のように、このラベルにリンクを挿入したいと思います。

[同意する] をクリックすると、例のライセンス契約プライバシー ポリシーに同意します。個人情報の使用が必要な機能にアクセスする場合があります。詳細については、例のコンテンツ ポリシーをダウンロードしてください。*

でリンクを作成できますがNSD_CreateLink、上記のように作成する方法がわかりません。

4

3 に答える 3

3

次のように ${NSD_CreateLabel} を使用して複数のラベルを作成します (「|」はセパレーターです):

              Label1             |    Label2     |Label3| Label4  |  Label5...

[同意する] をクリックすると、例の | に同意します。ライセンス契約 | と | プライバシーポリシー| アクセスできます...

したがって、テキストは、テキストを作成するために 1 つずつ配置された複数の個別のラベルから構成されます。

次に、Linker プラグイン ( http://nsis.sourceforge.net/Linker_plug-in - 数日前に透過テキストをサポートするように更新しました) を、リンクであるはずのラベルと共に使用します。

Linker::link /NOUNLOAD $Label2Hwnd "http://www.unsigned-softworks.sk/"
Linker::link /NOUNLOAD $Label4Hwnd "http://www.graphical-installer.com/"
于 2013-08-15T04:59:10.200 に答える
2

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
于 2013-08-14T21:32:14.053 に答える