2017-08-09 122 views
0

我正在使用Nsis来安装我的项目。我需要改变richEdit背景颜色。我尝试SetCtlColors方法,但它没有做任何改变。这里是我的代码:NSIS:如何更改RichEdit背景颜色

; handle variables 
Var hCtl_FirstDialog 
Var hCtl_FirstDialog_RichText1 
Var hCtl_FirstDialog_Button1 


; dialog create function 
Function fnc_FirstDialog_Create 

    ; === FirstDialog (type: Dialog) === 
    nsDialogs::Create 1018 
    Pop $hCtl_FirstDialog 
    ${If} $hCtl_FirstDialog == error 
    Abort 
    ${EndIf} 
    !insertmacro MUI_HEADER_TEXT "Dialog title..." "Dialog subtitle..." 

    ; === RichText1 (type: RichText) === 
    nsDialogs::CreateControl /NOUNLOAD "RichEdit20A" ${WS_VISIBLE}|${WS_CHILD}|${WS_TABSTOP}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN} ${WS_EX_STATICEDGE} 12.51u 14.77u 261.32u 92.92u "" 
    Pop $hCtl_FirstDialog_RichText1 
    ; RichText1 ControlCustomScript 
    nsRichEdit::Load $hCtl_FirstDialog_RichText1 D:\temp\NsisProject\EULA.rtf 
    SetCtlColors $hCtl_FirstDialog_RichText1 ccff00 ccff00 

    ; === Button1 (type: Button) === 
    ${NSD_CreateButton} 225.11u 118.77u 49.37u 14.15u "Button1" 
    Pop $hCtl_FirstDialog_Button1 
    ${NSD_OnClick} $hCtl_FirstDialog_Button1 FillText 

FunctionEnd 

; dialog show function 
Function fnc_FirstDialog_Show 
    Call fnc_FirstDialog_Create 
    nsDialogs::Show 
FunctionEnd 
+0

我不知道如果Windows接受十六进制颜色这种格式。尝试'SetCtlColors $ hCtl_FirstDialog_RichText1 0xccff00 0xccff00' – idleberg

+0

@idleberg所以我也试过。同样的行为 – user2455111

回答

1

RichEdit控件不支持SetCtlColors,你必须使用其记录的信息来设置文本格式:

!include nsDialogs.nsh 
!include WinMessages.nsh 
!define /ifndef /math EM_SETBKGNDCOLOR ${WM_USER} + 67 
!define /ifndef /math EM_SETCHARFORMAT ${WM_USER} + 68 
!define /ifndef /math EM_SETTEXTEX ${WM_USER} + 97 
!define /ifndef ST_SELECTION 2 
!define /ifndef CFM_COLOR 0x40000000 
!define /ifndef SCF_DEFAULT 0x0000 
!define /ifndef SCF_ALL  0x0004 

Var hRichEd 


Function MyPageCreate 
nsDialogs::Create 1018 
Pop $0 

nsDialogs::CreateControl /NOUNLOAD "RichEdit20A" ${WS_VISIBLE}|${WS_CHILD}|${WS_TABSTOP}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN} ${WS_EX_STATICEDGE} 12.51u 14.77u 261.32u 92.92u "" 
Pop $hRichEd 
SendMessage $hRichEd ${EM_SETBKGNDCOLOR} 0 0x00ffcc 

!if 1 ; Set default 
    System::Call '*(i 60, i ${CFM_COLOR}, i0,i0,i0, i 0xcc00ff, i, &m32)p.r0' ; Note: 60 is the ANSI size 
    SendMessage $hRichEd ${EM_SETCHARFORMAT} ${SCF_ALL} $0 
    System::Free $0 
    ${nsD_SetText} $hRichEd "Text goes here" 
!else ; Import RTF 
    System::Call '*(i${ST_SELECTION},i0)p.r0' 
    SendMessage $hRichEd ${EM_SETTEXTEX} $0 "STR:{\rtf1\ansi\deff0{\colortbl;\red115\green0\blue25;}\cf1 Text goes here}" ; www.pindari.com/rtf1.html 
    System::Free $0 
    SendMessage $hRichEd ${EM_REPLACESEL} 0 "STR: and more text here" 
!endif 

nsDialogs::Show 
FunctionEnd 

Page Custom MyPageCreate 
+0

thx,如何在路径'D:\ temp \ NsisProject \ EULA.rtf'中设置'Import RTF'中的rtf路径 – user2455111

+1

它不需要路径,它需要实际的rtf代码。使用streamin消息或插件来加载.rtf文件。 – Anders