Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2013, 01:44   #1
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
Вопрос Создание модальной формы на чистом API

Доброго времени суток! Вопрос как создать модальное диалоговое окно на API?

Например я создаю главное окно программы, а на нем есть кнопка при нажатии на которую открывается новое модальное окно. Такое же, как, на VCL, при вызове:
Код:
Form.ShowModal;
Все остальные окна при этом блокируются и работаем только с этим модальным окном...

Вот, для наглядности, взял за пример такой код создания окна на API:
Код:
program Plain2;

uses
  Windows,
  Messages;

const
  id_Button = 100;

function PlainWinProc (hWnd: THandle; nMsg: UINT;
  wParam, lParam: Cardinal): Cardinal; export; stdcall;
var
  Rect: TRect;
begin
  Result := 0;
  case nMsg of
    wm_Create:
      // create button
      CreateWindowEx (0, // extended styles
        'BUTTON', // predefined class
        '&Click here', // caption
        ws_Child or ws_Visible or ws_Border
          or bs_PushButton, // styles
        0, 0, // position: see wm_Size
        200, 80, // size
        hwnd, // parent
        id_Button, // identifier (not a menu handle)
        hInstance, // application id
        nil); // init info pointer
    wm_Size:
    begin
      // get the size of the client window
      GetClientRect (hWnd, Rect);
      // move the button window
      SetWindowPos (
        GetDlgItem (hWnd, id_Button), // button handle
        0, // zOrder
        Rect.Right div 2 - 100,
        Rect.Bottom div 2 - 40,
        0, 0, // new size
        swp_NoZOrder or swp_NoSize);
    end;
    wm_Command:
      // if it comes from the button
      if LoWord (wParam) = id_Button then
        // if it is a click
        if HiWord (wParam) = bn_Clicked then
          MessageBox (hWnd, 'Button Clicked',
            'Plain API 2', MB_OK);
    wm_Destroy:
      PostQuitMessage (0);
    else
      Result := DefWindowProc (hWnd, nMsg, wParam, lParam);
  end;
end;

procedure WinMain;
var
  hWnd: THandle;
  Msg: TMsg;
  WndClassEx: TWndClassEx;
begin
  // initialize the window class structure
  WndClassEx.cbSize := sizeOf (TWndClassEx);
  WndClassEx.lpszClassName := 'PlainWindow';
  WndClassEx.style := cs_VRedraw or cs_HRedraw;
  WndClassEx.hInstance := HInstance;
  WndClassEx.lpfnWndProc := @PlainWinProc;
  WndClassEx.cbClsExtra := 0;
  WndClassEx.cbWndExtra := 0;
  WndClassEx.hIcon := LoadIcon (hInstance,
    MakeIntResource ('MAINICON'));
  WndClassEx.hIconSm  := LoadIcon (hInstance,
    MakeIntResource ('MAINICON'));
  WndClassEx.hCursor := LoadCursor (0, idc_Arrow);;
  WndClassEx.hbrBackground := GetStockObject (white_Brush);
  WndClassEx.lpszMenuName := nil;
  // register the class
  if RegisterClassEx (WndClassEx) = 0 then
    MessageBox (0, 'Invalid class registration',
      'Plain API', MB_OK)
  else
  begin
    hWnd := CreateWindowEx (
      ws_Ex_OverlappedWindow, // extended styles
      WndClassEx.lpszClassName, // class name
      'Plain API Demo', // title
      ws_OverlappedWindow, // styles
      cw_UseDefault, 0, // position
      cw_UseDefault, 0, // size
      0, // parent window
      0, // menu
      HInstance, // instance handle
      nil); // initial parameters
    if hWnd = 0 then
      MessageBox (0, 'Window not created',
        'Plain API', MB_OK)
    else
    begin
      ShowWindow (hWnd, sw_ShowNormal);
      while GetMessage (Msg, 0, 0, 0) do
      begin
        TranslateMessage (Msg);
        DispatchMessage (Msg);
      end;
    end;
  end;
end;

begin
  WinMain;
end.
Как при нажатии на кнопку, вместо:
Код:
if HiWord (wParam) = bn_Clicked then
  MessageBox (hWnd, 'Button Clicked', 'Plain API 2', MB_OK);
создать модальное окно? Ну, вот как, например, тот же MessageBox...
SalasAndriy вне форума Ответить с цитированием
Старый 06.10.2013, 01:57   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

А нафик всё это?
если вы гонетесь за размером то проще KOL взять, а на апи сейчас писать окна сильно геморно...

а так модальное окно кроме стилей ничем не отличается от не модального ..
eval вне форума Ответить с цитированием
Старый 06.10.2013, 02:05   #3
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
По умолчанию

Вообще хочу создать скиновой движок и скинировать свои окна через UpdateLayeredWindow...

Цитата:
а так модальное окно кроме стилей ничем не отличается от не модального ..
Ну, а какая же тогда разница между:
Код:
Form.Show; // не модальное
Form.ShowModal; // модальное
В том то и дело, что мне нужно на API создать аналог Form.ShowModal;. Так как модальное окно блокирует все остальные окна до тех пор, пока оно само не будет закрыто...

Я создаю свой класс для работы с окнами по типу TForm.
SalasAndriy вне форума Ответить с цитированием
Старый 06.10.2013, 02:12   #4
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
По умолчанию

Тему можно закрыть! Вопрос решен...

Программирование на основе Win32 API в Delphi - 3. Принципы построения API-библиотеки
SalasAndriy вне форума Ответить с цитированием
Старый 06.10.2013, 02:16   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Ну, а какая же тогда разница между:
так загляните в исходники, вкл же не закрыта
eval вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрытие модальной формы в другом потоке m9yt C# (си шарп) 6 19.04.2013 18:37
Уничтожение модальной формы AndreyK Общие вопросы Delphi 3 15.03.2011 01:24
Перемещение кнопок по форме на чистом API Dr.Shade Win Api 2 20.12.2010 01:39
Дисассемблировал прогу на чистом API... Олвин Win Api 2 11.04.2010 22:01
Проблема при использовании модальной формы a1ias Помощь студентам 10 14.11.2008 17:29