Показать сообщение отдельно
  #13  
Старый 06.11.2009, 22:21
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
Сообщение

Через обработку сообщения WM_COMMAND всё оказалось очень просто:
Код:
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.
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887
Ответить с цитированием