Когда то
kotkovets сотворил интересный и полезный код -
кнопочный тулбар из bmp
читать дальше »
Код:

!include "CommCtrl.nsh"
!include "MUI2.nsh"
OutFile "ToolbarButton-test.exe"
ShowInstDetails Show
Page custom CreatePage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
xpstyle off
var dlg
var toolbar
!define ID_0 100
!define ID_1 101
!define ID_2 102
!define ID_3 103
!define ID_4 104
!define ID_5 105
!define ID_6 106
!define ID_7 107
!define ID_8 108
!define ID_9 109
Function CreatePage
System::Call "comctl32::ImageList_Create(i32,i32,i${ILC_MASK}|${ILC_COLORDDB},i1,i0)i.R8" ;создаем имеджлист
System::Call 'user32::LoadImage(i0,t"image-line.bmp",i${IMAGE_BITMAP},i0,i0,i${LR_LOADFROMFILE}|${LR_DEFAULTSIZE})i.R9'
;загружаем картинку в имеджлист первая картинку имеет индекс - 0
System::Call "comctl32::ImageList_AddMasked(iR8,iR9,i${CLR_DEFAULT})"
System::Call "gdi32::DeleteObject(iR9)"
nsDialogs::Create 1044
Pop $dlg
${NSD_CreateToolbar} 20u 5u 100% 40u ""
Pop $toolbar
${NSD_AddStyle} $toolbar ${WS_BORDER}
SendMessage $toolbar ${TB_BUTTONSTRUCTSIZE} 20 0
SendMessage $toolbar ${TB_SETIMAGELIST} 0 $R8 ;созданный имеджлист помещаем на тулбар
${NSD_OnNotify} $toolbar toolbar
${NSD_TB_ADDBUTTONS} $toolbar ${ID_0} 0 ; ${NSD_TB_ADDBUTTONS} [хэндл контрола] [ID кнопки] [индекс картинки]
${NSD_TB_ADDSEPARATOR} $toolbar ; добавляем сепаратор(разделитель)
${NSD_TB_ADDBUTTONS} $toolbar ${ID_1} 1
${NSD_TB_ADDBUTTONS} $toolbar ${ID_2} 2
${NSD_TB_ADDBUTTONS} $toolbar ${ID_3} 3
${NSD_TB_ADDBUTTONS} $toolbar ${ID_4} 4
${NSD_TB_ADDBUTTONS} $toolbar ${ID_5} 5
${NSD_TB_ADDBUTTONS} $toolbar ${ID_6} 6
${NSD_TB_ADDBUTTONS} $toolbar ${ID_7} 7
${NSD_TB_ADDBUTTONS} $toolbar ${ID_8} 8
${NSD_TB_ADDBUTTONS} $toolbar ${ID_9} 9
nsDialogs::Show
System::Call "comctl32::ImageList_Destroy(iR8)"
FunctionEnd
Function ID_LOAD
MessageBox MB_OK "$R1 --> ID_0" IDOK
FunctionEnd
Function ID_1
MessageBox MB_OK "$R1 --> ID_1" IDOK
FunctionEnd
Function ID_2
MessageBox MB_OK "$R1 --> ID_2" IDOK
FunctionEnd
Function ID_3
MessageBox MB_OK "$R1 --> ID_3" IDOK
FunctionEnd
Function ID_4
MessageBox MB_OK "$R1 --> ID_4" IDOK
FunctionEnd
Function ID_5
MessageBox MB_OK "$R1 --> ID_5" IDOK
FunctionEnd
Function ID_6
MessageBox MB_OK "$R1 --> ID_6" IDOK
FunctionEnd
Function ID_7
MessageBox MB_OK "$R1 --> ID_7" IDOK
FunctionEnd
Function ID_8
MessageBox MB_OK "$R1 --> ID_8" IDOK
FunctionEnd
Function ID_9
MessageBox MB_OK "$R1 --> ID_9" IDOK
FunctionEnd
Function toolbar
System::Store SR2R1R0
; NM_CLICK уведомляет родительское окно органа управления, что пользователь щелкнул левой кнопкой мыши в пределах органа управления
${If} $R1 == ${NM_CLICK} ;уведомление о клике мыши по тулбару
System::Call "*$R0(i,i,i,i.R1)"
${Select} $R1 ; в $R1 - возвращенный идентификатор кнопки
${Case} ${ID_0}
Call ID_LOAD
${Case} ${ID_1}
Call ID_1
${Case} ${ID_2}
Call ID_2
${Case} ${ID_3}
Call ID_3
${Case} ${ID_4}
Call ID_4
${Case} ${ID_5}
Call ID_5
${Case} ${ID_6}
Call ID_6
${Case} ${ID_7}
Call ID_7
${Case} ${ID_8}
Call ID_8
${Case} ${ID_9}
Call ID_9
${EndSelect}
${EndIf}
System::Store L
FunctionEnd
Section ""
SectionEnd
Но к сожалению этот код нормально компилится только в версии NSIS 2.46. В NSIS 3 получаем ошибку...
И дело похоже в CommCtrl.nsh. Даже откорректированная для NSIS 3 ( из справочника) - не работает.
А не работает наверное потому , что в этом варианте CommCtrl.nsh нет макросов для Toolbar_а (__NSD_TB_ADDBUTTONS и сопутствующее добро... )
Как бы это дело подретушировать для NSIS 3 ? Я в сети находил вариант CommCtrl.nsh с нужными макросами, но подстановка их в CommCtrl.nsh всё равно приводит к ошибке...
читать дальше »
Код:

${DEFINE} CMB_MASKED 0x02
${DEFINE} TBSTATE_CHECKED 0x01
${DEFINE} TBSTATE_PRESSED 0x02
${DEFINE} TBSTATE_ENABLED 0x04
${DEFINE} TBSTATE_HIDDEN 0x08
${DEFINE} TBSTATE_INDETERMINATE 0x10
${DEFINE} TBSTATE_WRAP 0x20
${DEFINE} TBSTATE_ELLIPSES 0x40
${DEFINE} TBSTATE_MARKED 0x80
${DEFINE} TB_ADDBUTTONS 1044
${DEFINE} TB_INSERTBUTTON 1045
${DEFINE} TB_DELETEBUTTON 1046
${DEFINE} TB_GETBUTTON 1047
${DEFINE} TB_BUTTONCOUNT 1048
${DEFINE} TB_COMMANDTOINDEX 1049
${DEFINE} TB_HITTEST 1093
#################################################################
# ${NSD_TB_ADDBUTTONS} #
#################################################################
!macro __NSD_TB_ADDBUTTONS htoolbar_ ID_CODE_ IMAGE_
!verbose push
!verbose ${_COMMCTRL_NSH_VERBOSE}
Push `${htoolbar_}`
Push `${ID_CODE_}`
Push `${IMAGE_}`
${CallArtificialFunction} __NSD_TB_ADDBUTTONS_Call
!verbose pop
!macroend
!macro __NSD_TB_ADDBUTTONS_Call
System::Store SR2R1R0
System::Call "*(iR2, iR1, i${TBSTATE_ENABLED}, i${TBSTYLE_BUTTON}, i0, i0)i.R1"
SendMessage $R0 ${TB_ADDBUTTONS} 1 $R1
System::Free $R1
System::Store L
!macroend
${DEFINE} NSD_TB_ADDBUTTONS "!insertmacro __NSD_TB_ADDBUTTONS"
#################################################################
!macro __NSD_TB_ADDSEPARATOR htoolbar_
!verbose push
!verbose ${_COMMCTRL_NSH_VERBOSE}
Push `${htoolbar_}`
${CallArtificialFunction} __NSD_TB_ADDSEPARATOR_Call
!verbose pop
!macroend
!macro __NSD_TB_ADDSEPARATOR_Call
System::Store SR0
System::Call "*(i-1, i0, i0, i${TBSTYLE_SEP}, i0, i0)i.R1"
SendMessage $R0 ${TB_ADDBUTTONS} 1 $R1
System::Free $R1
System::Store L
!macroend
${DEFINE} NSD_TB_ADDSEPARATOR "!insertmacro __NSD_TB_ADDSEPARATOR"
!define __NSD_Toolbar_CLASS ${TOOLBARCLASSNAME}
;!define __NSD_Toolbar_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${TBSTYLE_TOOLTIPS}|${TBSTYLE_TRANSPARENT} ;|${CCS_NORESIZE}|${CCS_ADJUSTABLE}
!define __NSD_Toolbar_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${TBSTYLE_TOOLTIPS}|${TBSTYLE_TRANSPARENT}|${CCS_NORESIZE}|${CCS_ADJUSTABLE}|${CCS_NODIVIDER}
!define __NSD_Toolbar_EXSTYLE 0
!insertmacro __NSD_DefineControl Toolbar