Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1218
Благодарности: 955

Профиль | Отправить 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