С помощью графического установщика и NS текст метки перекрывался, когда я динамически изменял ее

#label #refresh #nsis

#этикетка #освежить #nsis

Вопрос:

Я создал пользовательскую страницу, которая содержит метку и две кнопки для управления содержимым метки. Я предполагаю установить текст метки в обратных вызовах кнопок в виде следующих кодов:

 Function FuncShowNewFeature  ; ...  ; Add Controls    ${NSD_CreateLabel} 0 13u 100% 12u "Show new features here"  Pop $lblContents  ${GraphicalInstallerRedrawLabel} $lblContents    ${NSD_CreateButton} 0 -13u 40u 13u "Prev"  Pop $btnPrev  ${NSD_OnClick} $btnPrev PrevFeature ; callback    ${NSD_CreateButton} -40u -13u 40u 13u "Next"  Pop $btnNext  ${NSD_OnClick} $btnNext NextFeature ; callback    # Put this macro before EACH calling nsDialogs::Show to draw background properly  ${GraphicalInstallerRedrawnsDialogsPage}  nsDialogs::Show FunctionEnd  Function NextFeature  ${NSD_SetText} $lblContents "To show the next tip of new-feature"  ${GraphicalInstallerRedrawLabel} $lblContents ;I don't know whether this macro is necessary here FunctionEnd  Function PrevFeature  ${NSD_SetText} $lblContents "To show the previous tip of new-feature"  ${GraphicalInstallerRedrawLabel} $lblContents ;I don't know whether this macro is necessary here FunctionEnd  

Но результат показывает что-то неправильное, из-за чего «новый» текст накладывается на старый, точно так же, как метка не была обновлена/очищена перед перерисовкой.

введите описание изображения здесь

Пропустил ли я какие-либо необходимые вызовы в своем процессе?

Ответ №1:

Вам не хватает GraphicalInstaller::Метка подкласса /NOUNLOAD $variable_name

Правильный код:

 Function FuncShowNewFeature  ; ...  ; Add Controls    ${NSD_CreateLabel} 0 13u 100% 12u "Show new features here"  Pop $lblContents  ${GraphicalInstallerRedrawLabel} $lblContents  GraphicalInstaller::SubclassLabel /NOUNLOAD $lblContents # lt;lt;lt; ADDED HERE    ${NSD_CreateButton} 0 -13u 40u 13u "Prev"  Pop $btnPrev  ${NSD_OnClick} $btnPrev PrevFeature ; callback    ${NSD_CreateButton} -40u -13u 40u 13u "Next"  Pop $btnNext  ${NSD_OnClick} $btnNext NextFeature ; callback    # Put this macro before EACH calling nsDialogs::Show to draw background properly  ${GraphicalInstallerRedrawnsDialogsPage}  nsDialogs::Show FunctionEnd  Function NextFeature  ${NSD_SetText} $lblContents "To show the next tip of new-feature" FunctionEnd  Function PrevFeature  ${NSD_SetText} $lblContents "To show the previous tip of new-feature" FunctionEnd  

GraphicalInstaller::Подкласс[ЭЛЕМЕНТ управления] является частью макроса ${GraphicalInstallerRedraw[ЭЛЕМЕНТ УПРАВЛЕНИЯ]}.

Это прекрасно работает для [ЭЛЕМЕНТА управления] типа RadioButton или флажка, но он отсутствует в метке.

Мы исправим это в следующем выпуске, извините за эту несогласованность.

Ответ №2:

Один простой обходной путь-просто скрыть метку, пока вы обновляете ее текст:

 !include nsDialogs.nsh Page Custom gfxpage  Function onClick Pop $0 System::Call 'kernel32::GetTickCount()i.r0' ; "Arbitrary" number ShowWindow $2 0 ${NSD_SetText} $2 "$0$0$0" ShowWindow $2 1 FunctionEnd  Function .onInit InitPluginsDir File /oname=$PLUGINSDIRimage.bmp "${NSISDIR}ContribGraphicsHeadernsis-r.bmp" FunctionEnd  Function gfxpage nsDialogs::Create 1018 Pop $0  ${NSD_CreateButton} 0 -13u 100% 12u "Click me" Pop $1 ${NSD_OnClick} $1 onClick  ${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!" Pop $2 SetCtlColors $2 000000 transparent  ${NSD_CreateBitmap} 0 0 100% 12u "" Pop $3 ${NSD_SetBitmap} $3 $PLUGINSDIRimage.bmp $4  nsDialogs::Show ${NSD_FreeBitmap} $4 FunctionEnd