program Project1;
uses
Windows,
Messages;
const
WndClass = 'TWinApiWnd';
WndCaption = 'Form1';
wndWidth:integer=400; // длина окна
wndHeight:integer=200; // ширина окна
var
Wc: TWndClassEx;
Wnd: HWND;
Label1:HWND;
ComboBox1:HWND;
ComboBox2:HWND;
function WindowProc( Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall;
var buff: PChar;
bufflen: integer;
idx: integer;
//id:integer; // идентификатор ComboBox
begin
case Msg of
WM_DESTROY: begin
PostQuitMessage( 0 );
Result := 0;
Exit;
end;
WM_COMMAND: begin
if (HIWORD(wParam)=CBN_SELCHANGE) then
begin
// узнать какой ComboBox послал сообщение можно либо через его идентификатор - LOWORD(wParam)
// либо через его хэндл - lParam
//id:=LOWORD(wParam);
// индекс выбранной строки
idx := SendMessage( lParam, CB_GETCURSEL, 0, 0);
// длина выбранной строки
bufflen := SendMessage( lParam, CB_GETLBTEXTLEN, idx, 0 ) + 1;
GetMem(buff, bufflen);
//получаем выбранную строку
SendMessage( lParam, CB_GETLBTEXT, idx, Integer(buff));
//ставим текст в Label
SendMessage( Label1, WM_SETTEXT, 0, Integer(buff));
FreeMem(buff, bufflen);
Result := 0;
end
else Result := DefWindowProc( Wnd, Msg, wParam, lParam );
end;
else
Result := DefWindowProc( Wnd, Msg, wParam, lParam );
end;
end;
procedure InitWindowClass(out WindowClass:TWndClassEx);
begin
with WindowClass do
begin
cbSize := SizeOf( WindowClass );
style := CS_HREDRAW or CS_VREDRAW;
lpfnWndProc := @WindowProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := hInstance;
hIcon := LoadIcon( 0, IDI_APPLICATION );
hCursor := LoadCursor( 0, IDC_ARROW );
hbrBackground := COLOR_BTNSHADOW;
lpszMenuName := nil;
lpszClassName := WndClass;
end;
end;
function CreateWnd():HWND;
begin
Result := CreateWindowEx( {Создает окно и возвращает ссылку на окно типа HWnd.}
0,
WndClass, {Имя класса, к которому принадлежит создаваемое окно.}
WndCaption, {Заголовок окна.}
WS_OVERLAPPEDWINDOW,{Стиль окна, сейчас - комбинация стилей.}
(GetSystemMetrics(SM_CXFULLSCREEN)-wndWidth) div 2, {X - начальная позиция верхнего левого угла}
(GetSystemMetrics(SM_CYFULLSCREEN)-wndHeight) div 2, {Y - начальная позиция верхнего левого угла}
wndWidth, {Width - начальная длина окна}
wndHeight, {Height - начальная ширина окна}
0, {WndParent - родительское окно данного окна.}
0, {Menu - меню, используемое данным окном.}
hInstance, {Instance - указывает на экземпляр программы. этот параметр указывается, чтобы оконная функция имела доступ к сегменту данных программы.}
nil {Param - определяет дополнительную информацию, посылаемую через сообщение wm_Create.}
);
end;
function CreateLabel1(hParent:HWND):HWND;
begin
Result := CreateWindow('STATIC', 'Label1',
WS_CHILD or WS_VISIBLE,
8, 8, 150, 21, hParent, 0, hInstance, nil);
SendMessage( Result, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 );
end;
function CreateComboBox1(hParent:HWND):HWND;
begin
Result := CreateWindow('COMBOBOX', 'ComboBox1',
WS_CHILD or WS_VISIBLE or CBS_DROPDOWNLIST,
8, 32, 150, 250, hParent,
1, // идентификатор ComboBox - при посылке сообщения CBN_SELCHANGE передаётся в LOWORD(wParam)
hInstance, nil);
SendMessage( Result, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 );
// Добавляем строки
SendMessage(Result, CB_ADDSTRING, 0, Integer(PAnsiChar('Item1')));
SendMessage(Result, CB_ADDSTRING, 0, Integer(PAnsiChar('Item2')));
SendMessage(Result, CB_ADDSTRING, 0, Integer(PAnsiChar('Item3')));
// Выбираем первый элемент <=> ItemIndex := 0;
SendMessage(Result, CB_SETCURSEL, 0, 0);
end;
function CreateComboBox2(hParent:HWND):HWND;
begin
Result := CreateWindow('COMBOBOX', 'ComboBox2',
WS_CHILD or WS_VISIBLE or CBS_DROPDOWNLIST,
8, 58, 150, 250, hParent,
2, // идентификатор ComboBox - при посылке сообщения CBN_SELCHANGE передаётся в LOWORD(wParam)
hInstance, nil);
SendMessage( Result, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 );
// Добавляем строки
SendMessage(Result, CB_ADDSTRING, 0, Integer(PAnsiChar('String1')));
SendMessage(Result, CB_ADDSTRING, 0, Integer(PAnsiChar('String2')));
SendMessage(Result, CB_ADDSTRING, 0, Integer(PAnsiChar('String3')));
// Выбираем первый элемент <=> ItemIndex := 0;
SendMessage(Result, CB_SETCURSEL, 0, 0);
end;
var Msg: TMsg;
begin
InitWindowClass( Wc );
RegisterClassEx( Wc );
Wnd := CreateWnd();
Label1 := CreateLabel1( Wnd );
ComboBox1 := CreateComboBox1( Wnd );
ComboBox2 := CreateComboBox2( Wnd );
ShowWindow( Wnd, SW_SHOWNORMAL );
while GetMessage( Msg, 0, 0, 0 ) do
begin
TranslateMessage( Msg );
DispatchMessage( Msg );
end;
Halt( Msg.wParam );
end.