Ветеран
Сообщения: 1264
Благодарности: 1024
|
Профиль
|
Отправить PM
| Цитировать
Цитата vint56:
но не чего не вышло с ComboBox »
|
vint56, либо субклассировать ComboBox и его ListBox и рисовать все, что душе угодно, в их оконных процедурах, либо использовать ComboBoxEx. Пример:
Скрытый текст
Код:
[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
Uninstallable=no
CreateUninstallRegKey=no
[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl
[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
WM_USER = $0400;
WC_COMBOBOXEX = 'ComboBoxEx32';
WS_CHILD = $40000000;
WS_VISIBLE = $10000000;
WS_TABSTOP = $10000;
CBS_DROPDOWNLIST = $0003;
CBS_SORT = $0100;
ILC_COLOR24 = $0018;
CBEIF_TEXT = $1;
CBEIF_IMAGE = $2;
CBEIF_SELECTEDIMAGE = $4;
CBEM_INSERTITEM = (WM_USER + {#ifndef UNICODE}1{#else}11{#endif});
CBEM_SETIMAGELIST = (WM_USER + 2);
CB_SETCURSEL = $014E;
type
TComboBoxExItem = record
mask: UINT;
iItem: INT_PTR;
pszText: string;
cchTextMax: Integer;
iImage: Integer;
iSelectedImage: Integer;
iOverlay: Integer;
iIndent: Integer;
lParam: Longint;
end;
function CreateWindowEx(dwExStyle: DWORD; lpClassName, lpWindowName: string; dwStyle: DWORD; x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance, lpParam: Longint): HWND; external 'CreateWindowEx{#A}@user32.dll stdcall';
function DestroyWindow(hWnd: HWND): BOOL; external 'DestroyWindow@user32.dll stdcall';
function ImageList_Create(cx, cy: Integer; flags: UINT; cInitial, cGrow: Integer): THandle; external 'ImageList_Create@comctl32.dll stdcall';
function ImageList_Destroy(himl: HIMAGELIST): BOOL; external 'ImageList_Destroy@comctl32.dll stdcall';
function ImageList_ReplaceIcon(himl: HIMAGELIST; i: Integer; hIcon: HICON): Integer; external 'ImageList_ReplaceIcon@comctl32.dll stdcall';
function SendMessageCBEI(hWnd: HWND; Msg: UINT; wParam: Longint; var lParam: TComboBoxExItem): Longint; external 'SendMessage{#A}@user32.dll stdcall';
var
GImageList: HIMAGELIST;
GComboBoxEx: HWND;
//////////////////////////////////////////////////////////
procedure CreateComboBoxExItem(Text: string; Icon: HICON);
var
ImageIndex: Integer;
CBItem: TComboBoxExItem;
begin
ImageIndex := ImageList_ReplaceIcon(GImageList, -1, Icon);
with CBItem do
begin
mask := CBEIF_TEXT or CBEIF_IMAGE or CBEIF_SELECTEDIMAGE;
iItem := -1;
pszText := Text;
iImage := ImageIndex;
iSelectedImage := ImageIndex;
end;
SendMessageCBEI(GComboBoxEx, CBEM_INSERTITEM, 0, CBItem);
end;
///////////////////////////
procedure CreateComboBoxEx;
begin
{ create comboex }
GComboBoxEx := CreateWindowEx(0, WC_COMBOBOXEX, '', WS_VISIBLE or WS_CHILD or WS_TABSTOP or CBS_DROPDOWNLIST or CBS_SORT, 0, 0, 320, 320, WizardForm.Handle, 0, HInstance, 0);
{ create imagelist }
GImageList := ImageList_Create(32, 32, ILC_COLOR24{ use ILC_COLOR32 for 32-bit icons }, 0, 0);
{ add items }
CreateComboBoxExItem('Test entry 1', Application.Icon.Handle);
CreateComboBoxExItem('Test entry 2', Application.Icon.Handle);
{ assign imagelist }
SendMessage(GComboBoxEx, CBEM_SETIMAGELIST, 0, GImageList);
{ set selected item }
SendMessage(GComboBoxEx, CB_SETCURSEL, 0, 0);
end;
////////////////////////////
procedure DestroyComboBoxEx;
begin
if GImageList <> 0 then
ImageList_Destroy(GImageList);
if GComboBoxEx <> 0 then
DestroyWindow(GComboBoxEx);
end;
///////////////////////////
procedure InitializeWizard;
begin
WizardForm.OuterNotebook.Hide;
CreateComboBoxEx;
end;
////////////////////////////
procedure DeinitializeSetup;
begin
DestroyComboBoxEx;
end;
|
Последний раз редактировалось El Sanchez, 25-12-2017 в 11:44.
Причина: DeleteObject -> ImageList_Destroy
Отправлено: 16:21, 06-05-2016
| #1532
|