Introduction
This NSIS plug-in allows to skin all buttons and scroll bars of your installer and allows to select text colors on buttons even those on custom pages.
It was developed with an aim of integrate it in UltraModernUI, an new user interface with a style like the most recent installers for NSIS. (http://ultramodernui.sourceforge.net)
Screenshots
Usage
SkinnedControls::skinit Function
Skins the installer's buttons and scrollbars with selected bitmaps and sets colors for texts on buttons.
Parameters:
/SetReturn
Force the method to return "success" on the stack or an error string if there was an error.This parameter must be set first.
/scrollbar=$PLUGINSDIR\scrollbar.bmp
Scrollbar image (se below)./button=$PLUGINSDIR\button.bmp
Button image (se below)./disabledtextcolor=808080
Color of text when button is disabled (Format is in hex: RRGGBB as CSS colors)./selectedtextcolor=000080
Color of text when button is being clicked (Format is in hex: RRGGBB as CSS colors)./textcolor=000000
Color for normal state of button (Format is in hex: RRGGBB as CSS colors).One of /scrollbar and /button parameter is required, other is optionnal.
If /SetReturn is set, the method returns "success" on the stack or an error string if there was an error.
Else, error message boxes displayed automatically.
Parameter names are now ignore case.
SkinnedControls::setskin Function
Modifiy parameter. Use the same parameters as skinit
SkinnedControls::unskinit Function
Releases the plug-in resources (usually called in the (un).onGUIEnd function). This method is now optional thanks to the new NSIS plug-in API.
Usage without Modern UI
First, in the .onInit function, extract the button bitmap:
Function .onInit InitPluginsDir ; Extract bitmaps for buttons and scrollbars File "/oname=$PLUGINSDIR\button.bmp" \ "${NSISDIR}\Contrib\SkinnedControls\skins\defaultbtn.bmp" File "/oname=$PLUGINSDIR\scrollbar.bmp" \ "${NSISDIR}\Contrib\SkinnedControls\skins\defaultsb.bmp" FunctionEnd
Second, in the .onGUIInit function, it is time to let the plug-in do the work:
Function .onGUIInit SkinnedControls::skinit /NOUNLOAD \ /disabledtextcolor=808080 \ /selectedtextcolor=000080 \ /textcolor=000000 \ "/scrollbar=$PLUGINSDIR\scrollbar.bmp" \ "/button=$PLUGINSDIR\button.bmp" FunctionEndIt's the same thing for the uninstaller:
Function un.onInit InitPluginsDir File "/oname=$PLUGINSDIR\button.bmp" \ "${NSISDIR}\Contrib\SkinnedControls\skins\defaultbtn.bmp" File "/oname=$PLUGINSDIR\scrollbar.bmp" \ "${NSISDIR}\Contrib\SkinnedControls\skins\defaultsb.bmp" FunctionEnd Function un.onGUIInit SkinnedControls::skinit /NOUNLOAD \ /disabledtextcolor=808080 \ /selectedtextcolor=000080 \ /textcolor=000000 \ "/scrollbar=$PLUGINSDIR\scrollbar.bmp" \ "/button=$PLUGINSDIR\button.bmp" FunctionEnd
That's all!
Usage with Modern UI
First, in the .onInit function, extract the button bitmap:
Function .onInit InitPluginsDir ; Extract bitmaps for buttons and scrollbars File "/oname=$PLUGINSDIR\button.bmp" \ "${NSISDIR}\Contrib\SkinnedControls\skins\defaultbtn.bmp" File "/oname=$PLUGINSDIR\scrollbar.bmp" \ "${NSISDIR}\Contrib\SkinnedControls\skins\defaultsb.bmp" FunctionEnd
Second, create a function, for example, named myGUIInit, it is time to let the plug-in do the work:
Function myGUIInit SkinnedControls::skinit /NOUNLOAD \ /disabledtextcolor=808080 \ /selectedtextcolor=000080 \ /textcolor=000000 \ "/scrollbar=$PLUGINSDIR\scrollbar.bmp" \ "/button=$PLUGINSDIR\button.bmp" FunctionEndAnd add this line before the insertion of macro page.
!define MUI_CUSTOMFUNCTION_GUIINIT myGUIInit
It's the same thing for the uninstaller:
Function un.onInit InitPluginsDir File "/oname=$PLUGINSDIR\button.bmp" \ "${NSISDIR}\Contrib\SkinnedControls\skins\defaultbtn.bmp" File "/oname=$PLUGINSDIR\scrollbar.bmp" \ "${NSISDIR}\Contrib\SkinnedControls\skins\defaultsb.bmp" FunctionEnd Function un.myGUIInit SkinnedControls::skinit /NOUNLOAD \ /disabledtextcolor=808080 \ /selectedtextcolor=000080 \ /textcolor=000000 \ "/scrollbar=$PLUGINSDIR\scrollbar.bmp" \ "/button=$PLUGINSDIR\button.bmp" FunctionEnd
And add this line before the insertion of macro page.
!define MUI_CUSTOMFUNCTION_UNGUIINIT un.myGUIInit
That's all!
Usage with UltraModernUI and ModernUIEx
UltraModernUI and ModernUIEx natively integrate the SkinnedControls plug-in.
With MUIEx, all you need to do is to define some stuffs before the inclusion of macro pages.
With UMUI which enable this plug-in through its skins system, you can define the same stuffs before the UMUI_SKIN define to override default skin values:!define UMUI_BUTTONIMAGE_BMP \ "${NSISDIR}\Contrib\SkinnedControls\skins\defaultbtn.bmp" !define UMUI_SCROLLBARIMAGE_BMP \ "${NSISDIR}\Contrib\SkinnedControls\skins\defaultsb.bmp" !define UMUI_DISABLED_BUTTON_TEXT_COLOR 808080 !define UMUI_SELECTED_BUTTON_TEXT_COLOR 000080 !define UMUI_BUTTON_TEXT_COLOR 000000That's all!
BITMAPS
-
To skin the buttons, the plug-in need a bitmap image:
The image width must be, at least, 10 pixels.
The image height must be a multiple of three with, at least, 30 pixels.
The typical image size is 72*72 pixels for smoother gradients.
The first height third is for normal buttons,
the next third is for activated buttons and the last third is for disabled buttons. -
To skin the scrollbars, the plug-in need an other bitmap image:
The image image size is 134*34 pixels.
It is composed of several little images in one file for normal an clicked arrows and bars.
On the very right, three pixels appear for normal color, inverted color and deadarea color.
Problems and workarounds
During the installation, the "Show Detail" button is unskinned:
You can insert this instruction on your script to workaround this bug, for classic UI:
ChangeUI IDD_INSTFILES "${NSISDIR}\Contrib\UIs\default_sb.exe"for ModernUI:
ChangeUI IDD_INSTFILES "${NSISDIR}\Contrib\UIs\modern_sb.exe"When using the previous workaround the "Show Detail" button is invisible:
Modern UI set the XPStyle instruction to On automatically. XPStyle must be set to Off with the previous workaround otherwise the "Show Detail" button will disappear:
XPStyle Off
When you use MessageBox function on some page (or some other pop-up windows like Banner plug-in), the some page buttons and scrollbars got unskinned:
You can use this tricky workaround to fix this:
MessageBox MB_OK "This message causes SkinnedControls bug..." ; After clicking OK the buttons lost their skin SendMessage $HWNDPARENT ${WM_MENUDRAG} 0 0 ; Do this to force reskin ;If you use UMUI or MUIEx interfaces, you can simply insert macro: !insertmacro UMUI_FIX_BUTTONS_SKINWe used WM_MENUDRAG message (which is normally unused) to notify window to put another refresh message into queue -> to force redrawing. See the source code how it works.
The plug-in does not work on Windows 95:
Plug-ins compiled with Visual Studio 2008 is not executed... Microsoft says:
"Beginning with Visual C++ 2008, Visual C++ does not support targeting Windows 95, Windows 98, Windows ME, or Windows NT [4]."Scrollbars are not skinned on Windows 9x/Me:
The Cool Scrollbar Library, that the plug-in use, work only on Windows NT kernel.
Example Scripts
These examples are in the NSISDir\Examples\SkinnedControls folder:
- Classic UI example: Example.nsi
- Modern UI example: Example_MUI.nsi
- ModernUIEx example: Example_MUIEx.nsi
- SkinnedControls installer: SkinnedControls.nsi
TODO
Help wanted for improve this plug-in:
- Find better ways to fix buttons which unskin to avoid crappy workaround.
- Support transparency for buttons.
- Ability to skin checkboxes and radio buttons (transparency background required).
- Ability to skin dropdown scroll bars and arrow down button.
- Ability to skin MessageBox buttons and text and background colors.
Version History
- Version 1.4 - December 25, 2016
- Migrate to the new NSIS plug-in API;
- The unskinit function in now optional thanks to the new NSIS plug-in API;
- Parameter names are now ignore case.
- Version 1.3 - August 27, 2016
- Button image size are no more limited to allow smoother gradients (see above);
- "success" or error messages is no longer pushed in the stack by skinit and setskin methods unless the new /SetReturn parameter is set;
- Fix License text and other RichText scrollbars was not skinned in Unicode Build;
- Code cleanup;
- Rewritten documentation.
- Version 1.2 (by Slappy) - 2011
- Fixed unskinning buttons after MessageBox is shown (see above);
- Project was converted to Visual Studio 2008 format.
- Version 1.1 (by Tallmaris) - 2010
- Littles bug fixes & Unicode build.
- Version 1.0 - 2009
- First public release.
- Replace the former SkinnedButton plug-in.
Credits
Made by SuperPat
Based on wansis, a Plug-in written by Saivert that skins NSIS like Winamp
and use the wa_dlg.h courtesy of Nullsoft, Inc.
as well as the Cool Scrollbar Library Copyright (c) J Brown 2001.
Help
Please post questions at the Official NSIS Forum.
License
The zlib/libpng license applies to the SkinnedControls plug-in.
License Terms
Copyright © 2005-2019 SuperPat
Based on wansis, a Plug-in written by Saivert that skins NSIS like Winamp and use the wa_dlg.h courtesy of Nullsoft, Inc. as well as the Cool Scrollbar Library Copyright © J Brown 2001.
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any distribution.