SkinnedControls plug-in

From NSIS Wiki
Jump to navigationJump to search

Download Link

Zip.gif SkinnedControls1.4.zip (236 KB) Exe.gif SkinnedControls1.4.exe (512 KB)

SkinnedControls Forum Thread

Description

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)

This plugin was used in early version of Graphical Installer: www.graphical-installer.com (see image below) so I (Slappy) fixed some bugs in version 1.2.

SkinnedControls-Example.jpg

Two versions of the plugin are available: an ANSI and an UNICODE.

How To Use

See example and documentation in Examples\SkinnedControls\ from package

SkinnedControls::skinit Function

Skins the installer's buttons and scrollbars with selected bitmaps and sets colors for texts on buttons.

Syntax

; Skin the button
 
Function .onInit
  InitPluginsDir
  ; Extract bitmaps for buttons
  File "/oname=$PLUGINSDIR\button.bmp" "${NSISDIR}\Contrib\SkinnedControls\skins\defaultbtn.bmp"
  File "/oname=$PLUGINSDIR\scrollbar.bmp" "${NSISDIR}\Contrib\SkinnedControls\skins\defaultsb.bmp"
FunctionEnd
 
Function myGUIInit
  ; start the plugin
  ; the /disabledtextcolor, /selectedtextcolor and /textcolor parameters are optionnal
  SkinnedControls::skinit /NOUNLOAD \
			/disabledtextcolor=808080 \
			/selectedtextcolor=000080 \
			/textcolor=000000 \
			"/scrollbar=$PLUGINSDIR\scrollbar.bmp" \
			"/button=$PLUGINSDIR\button.bmp"

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 DLL Function

Modifiy parameter. Use the same parameters as skinit

SkinnedControls::unskinit DLL 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.

Syntax

Function .onGUIEnd
  ; stop the plugin
  SkinnedControls::unskinit
FunctionEnd

Problems

  • 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:

SkinnedControls-bug.jpg

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_SKIN

We 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.

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.

Versions History

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 now ignore case.
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.
1.2 (2011)
  • Fixed unskinning buttons after MessageBox is shown (see above)
  • Project was converted to Visual Studio 2008 format
1.1 (2010)
  • Little bug fixes & Unicode build
1.0 (2009)
  • First public release.
  • Replace the former SkinnedButton plug-in.

Credits

Based on [nsis.sourceforge.net/Wansis_plug-in 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.

  • Version 1.0, 1.3, 1.4, written by SuperPat