Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.12.2012, 12:20
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию Создание ListBox WinAPI

Код:
Код:
program JustProgram;

uses
  Windows, Messages;

var
  WC: TWndClassEx;
  Wnd: HWND;
  Msg: TMsg;

const
  WndClass = 'TWindow';
  WndCaption = 'Just Program';

{$R *.res}

function WindowProc(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM):
  LRESULT; stdcall;
begin
  // Обработка сообщений
  case Msg of
    // Сообщение при закрытии формы
    WM_DESTROY:
      begin
        // Запрос на закрытие
        PostQuitMessage(0);
        // Отрицательный результат
        Result := 0;
        // Завершаем процедуру
        Exit
      end;
  else
    // Положительний результат
    Result := DefWindowProc(Wnd, Msg, wParam, lParam)
  end;
end;

begin
  // Производим действия над TWndClassEx
  with WC do
  begin
    cbSize := SizeOf(WC);
    // Перериовывание при изменении размера формы
    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_WINDOW;
    // Указатель на главное меню
    lpszMenuName := nil;
    // Имя класса
    lpszClassName := WndClass;
  end;

  // Регистрируем класс
  RegisterClassEx(WC);
  // Создаем форму с заданными параметрами
  Wnd := CreateWindowEx(0, WndClass, WndCaption, WS_OVERLAPPEDWINDOW, 250, 60,
    300, 100, 0, 0, hInstance, nil);
  // Отображаем форму
  ShowWindow(Wnd, SW_SHOWNORMAL);

  ListBox := CreateWindowEx(WS_EX_CLIENTEDGE, 'ListBox', '',
    WS_CHILD or WS_VISIBLE or LBS_EXTENDEDSEL, 120, 40, 121, 97, WND, 0,
      hInst, nil);
  SendMessage(ListBox, WM_SETFONT, hFont, 0);

  // Обработка сообщений
  while GetMessage(Msg, 0, 0, 0) do
  begin
    // Транслирование сообщений
    TranslateMessage(Msg);
    // Посылаем сообщения оконной процедуре
    DispatchMessage(Msg);
  end;

  // Завершение приложения
  Halt(Msg.wParam);
end.
Но ругается на ListBox, подскажите как его объявить?..
Ответить с цитированием
  #2  
Старый 02.12.2012, 12:33
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
  CreateWindowEx(WS_EX_CLIENTEDGE, 'ListBox', '',
    WS_CHILD or WS_VISIBLE or LBS_EXTENDEDSEL, 120, 40, 121, 97, AWnd, 0,
    HInstance, nil);
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
sariman (02.12.2012)
  #3  
Старый 02.12.2012, 12:34
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,503
Версия Delphi: XE10
Репутация: выкл
По умолчанию

ListBox: THandle
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
sariman (06.12.2012)
  #4  
Старый 02.12.2012, 12:59
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Спасибо, а как сделать alBottom? В VCL такое без проблем, а в WinAPI как?
Ответить с цитированием
  #5  
Старый 02.12.2012, 13:02
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

SetWindowPos\MoveWindow
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
sariman (02.12.2012)
  #6  
Старый 02.12.2012, 13:17
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Код:
CreateWindowEx(WS_EX_CLIENTEDGE, 'ListBox', '', WS_CHILD or WS_VISIBLE or
    LBS_EXTENDEDSEL, 120, 40, 121, 97, Wnd, 0, HInstance, nil);
SetWindowPos(Wnd, HWND_BOTTOM, 0, 0, 0, 0, 0);
А как передать параметр именно ListBox'у?
Ответить с цитированием
  #7  
Старый 02.12.2012, 13:26
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Радость

нельзя передать то, чего нет.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 02.12.2012, 14:49
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

И как с этим быть? Как создать?
Ответить с цитированием
  #9  
Старый 02.12.2012, 16:24
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Код:
PlayList := CreateWindowEx(WS_EX_CLIENTEDGE, 'ListBox', '', WS_CHILD or WS_VISIBLE or
    LBS_EXTENDEDSEL, 120, 40, 121, 97, Wnd, 0, HInstance, nil);
  SetWindowPos(PlayList, HWND_BOTTOM, 0, 0, 50, 50, SWP_SHOWWINDOW);
Все отображается, но в верхнем левом углу, а нужно вниз по всей ширине формы, подскажите пожалуйста.
Ответить с цитированием
  #10  
Старый 02.12.2012, 16:28
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

установить ширину равную ширине клиентской области родителя, а top = parent.clientheight - height.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #11  
Старый 02.12.2012, 16:29
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

хм..форма ведь будет изменять размер, как-то это не правильно. Да и что в данном случае Top? Он ведь не объявлен.
Ответить с цитированием
  #12  
Старый 02.12.2012, 18:29
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

тогда нужно будет обрабатывать сообщение WM_SIZING и устанавливать новые размеры ListBox. Top это y в CreateWindowEx.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
sariman (02.12.2012)
  #13  
Старый 02.12.2012, 21:53
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вот вариант
Код:
procedure ResizeWnd(Wnd : HWND; wParam, lParam : Integer);
var
  aRect : TRect;
begin
  GetClientRect(Wnd, aRect);
  SetWindowPos(PlayList, 0, 0, aRect.Bottom - 100, aRect.Right, aRect.Bottom, SWP_NOZORDER);
end;

function WndProc(Wnd : HWND; Msg, wParam, lParam : Integer) : Integer; stdcall;
...
    WM_SIZE :  ResizeWnd(Wnd, wParam, lParam);
...

(aRect.Bottom - 100) здесь Top равен высоте главного окна - 100.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (02.12.2012)
  #14  
Старый 03.12.2012, 16:12
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Спасибо, возник другой вопрос: как отловить событие клика по ListBox'у?
Ответить с цитированием
  #15  
Старый 03.12.2012, 16:18
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

лови NM_CLICK в уведомлении WM_NOTIFY.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:42.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter   Ссылка на Telegram