#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