Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свой ShowMessage 
V
    Опции темы
mspuz
Дата 3.2.2007, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



Решил написать свой вариант ShowMessage, но добавив некоторые украшательства smile 
Создал модуль, в который поместил код создания API окна.
1. Какой стиль нужно указать, чтобы окно было дочерним и желательно без заголовка.
2. Как закрыть именно это окошко при нажатии на кнопку (расположенную на этом окне).
Сейчас я использую WS_POPUP и закрытие Halt (закрывается все приложение).
В CreateWindowEx есть параметр(WndParent), который отвечает за отношение к главному окну, как его использовать?

PM MAIL   Вверх
mspuz
Дата 3.2.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



Разобрался, как вызвать окно, как дочернее. Но как сделать, чтобы родительское окно в это время стало недоступным, т.е. вызвать окно, как модальное.
И еще как правильно использовать DestroyWindow.
PM MAIL   Вверх
RideX
Дата 3.2.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 2
Всего: 7



Цитата(mspuz @  4.2.2007,  00:13 Найти цитируемый пост)
Решил написать свой вариант ShowMessage

Нет такой API функции, это всё происки Delphi. Используйте MessageBoxA/MessageBoxW, MessageBoxTimeoutA/MessageBoxTimeoutW, там есть и стандартные значки ошибки, предупреждения, вопроса, информации и кнопки какие хочешь в разном сочетании. Извините, но то что Вы задумали выглядит просто как-то несерьёзно, ИМХО  smile 
PM   Вверх
mspuz
Дата 3.2.2007, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



RideX, А если я хочу добавить возможность изменить цвет формы, цвет текста, прозрачность и форму окна - как мне поможет MessageBox?
Я использую DestroyWindow для созданного окна, но после этого мне нужно ДВАЖДЫ нажать на кнопку закрытия для главного окна,  чтобы приложение завершилось!!!! И что это значит???

Это сообщение отредактировал(а) mspuz - 3.2.2007, 22:23
PM MAIL   Вверх
RideX
Дата 3.2.2007, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 2
Всего: 7



Цитата(mspuz @  4.2.2007,  01:08 Найти цитируемый пост)
изменить цвет формы, цвет текста, прозрачность и форму окна

В таком случае конечно MessageBox не поможет.. Зачем всё это информационному сообщению? Программа, конечно, должна выглядеть стильно и выдержанно, а разукрашенные в разные цвета и нестандартные формы и шрифты выглядят по клоунски и больше самхивают на поделки какого-нибудь пятиклассника вызывают только раздражение. Всё это, конечно, только моё ИМХО.

Цитата(mspuz @  4.2.2007,  00:58 Найти цитируемый пост)
И еще как правильно использовать DestroyWindow

Код

BOOL DestroyWindow(HWND hWnd);

Parameters

hWnd
[in] Handle to the window to be destroyed. 
Return Value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.
PM   Вверх
Данкинг
Дата 3.2.2007, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Цитата(RideX @  3.2.2007,  22:37 Найти цитируемый пост)
Цитата(mspuz @  4.2.2007,  01:08 Найти цитируемый пост)
изменить цвет формы, цвет текста, прозрачность и форму окна

В таком случае конечно MessageBox не поможет.. Зачем всё это информационному сообщению? Программа, конечно, должна выглядеть стильно и выдержанно, а разукрашенные в разные цвета и нестандартные формы и шрифты выглядят по клоунски и больше самхивают на поделки какого-нибудь пятиклассника вызывают только раздражение. Всё это, конечно, только моё ИМХО.

BusinessSkinForm рулит. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
RideX
Дата 3.2.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 2
Всего: 7



Цитата(mspuz @  4.2.2007,  01:08 Найти цитируемый пост)
Я использую DestroyWindow для созданного окна

Вообще, конечно непонятно, зачем Вы это делаете? Посылайте сообщение
Код

SendMessage(hMainWnd, WM_CLOSE, 0, 0);

и
Код

    WM_DESTROY: PostQuitMessage(0);


После WinMain не забудьте про ExitProcess
Код

  hInstance := GetModuleHandle(nil);
  CommandLine := GetCommandLine;
  WinMain(hInstance, 0, CommandLine, SW_SHOWDEFAULT);
  ExitProcess(0);


PM   Вверх
mspuz
Дата 3.2.2007, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



RideX,  Мне нужно что бы закрылось только лишь дочернее окно. Если использовать ExitProcess(0), то завершается всё приложение.
Использую SendMessage(hMainWnd, WM_CLOSE, 0, 0) - окно исчезает, но сам процесс видимо остаётся, потому что для закрытия основного окна требуется выполнить комманду Close дважды!!!

Это сообщение отредактировал(а) mspuz - 3.2.2007, 23:40
PM MAIL   Вверх
VladBD
Дата 4.2.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 19.11.2006

Репутация: 1
Всего: 5



Посмотри Dialogs.pas - может имеет смысл сделать также как там, только со своими цветами и примочками. Вот как рисуется InputQuery.

Код

function InputQuery(const ACaption, APrompt: string;
  var Value: string): Boolean;
var
  Form: TForm;
  Prompt: TLabel;
  Edit: TEdit;
  DialogUnits: TPoint;
  ButtonTop, ButtonWidth, ButtonHeight: Integer;
begin
  Result := False;
  Form := TForm.Create(Application);
  with Form do
    try
      Canvas.Font := Font;
      DialogUnits := GetAveCharSize(Canvas);
      BorderStyle := bsDialog;
      Caption := ACaption;
      ClientWidth := MulDiv(180, DialogUnits.X, 4);
      Position := poScreenCenter;
      Prompt := TLabel.Create(Form);
      with Prompt do
      begin
        Parent := Form;
        Caption := APrompt;
        Left := MulDiv(8, DialogUnits.X, 4);
        Top := MulDiv(8, DialogUnits.Y, 8);
        Constraints.MaxWidth := MulDiv(164, DialogUnits.X, 4);
        WordWrap := True;
      end;
      Edit := TEdit.Create(Form);
      with Edit do
      begin
        Parent := Form;
        Left := Prompt.Left;
        Top := Prompt.Top + Prompt.Height + 5;
        Width := MulDiv(164, DialogUnits.X, 4);
        MaxLength := 255;
        Text := Value;
        SelectAll;
      end;
      ButtonTop := Edit.Top + Edit.Height + 15;
      ButtonWidth := MulDiv(50, DialogUnits.X, 4);
      ButtonHeight := MulDiv(14, DialogUnits.Y, 8);
      with TButton.Create(Form) do
      begin
        Parent := Form;
        Caption := SMsgDlgOK;
        ModalResult := mrOk;
        Default := True;
        SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth,
          ButtonHeight);
      end;
      with TButton.Create(Form) do
      begin
        Parent := Form;
        Caption := SMsgDlgCancel;
        ModalResult := mrCancel;
        Cancel := True;
        SetBounds(MulDiv(92, DialogUnits.X, 4), Edit.Top + Edit.Height + 15,
          ButtonWidth, ButtonHeight);
        Form.ClientHeight := Top + Height + 13;          
      end;
      if ShowModal = mrOk then
      begin
        Value := Edit.Text;
        Result := True;
      end;
    finally
      Form.Free;
    end;
end;

PM MAIL   Вверх
mspuz
Дата 4.2.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



А как сделать, чтобы родительское окно стало недоступным? Нашел в справке:
wm_Activate
 Уведомляет окно, что оно становится активным или неактивным.
 Паpаметpы:
    wParam: Если wParam=0, окно активно. Если wParam=1, окно активизиpуется чем то дpугим, а не щелчком мыши. Если wParam=2, окно активизиpуется щелчком мыши.

Посылаю сообщение с  wParam=1, но окно становится активным при щелчке мыши!

Кстати, чтобы закрыть дочернее окно помогло:
 PostQuitMessage(0);
 DestroyWindow(DHwn);

Это сообщение отредактировал(а) mspuz - 4.2.2007, 12:14
PM MAIL   Вверх
mspuz
Дата 4.2.2007, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



При регистрации класса окна задаётся параметр hbrBackground, определяющий фон окна. Можно ли использовать любой цвет(и как его конвертировать, например $00FF000000), или только системные константы COLOR_? 
PM MAIL   Вверх
VladBD
Дата 4.2.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 19.11.2006

Репутация: 1
Всего: 5



При создании формы сообщения там указан ShowModal - это скорей всего и есть то, что указывает на недоступность главной формы пока не закрыто это окно.

А при создании формы - есть canvas на котором можно рисовать и заливать цветом. 
PM MAIL   Вверх
Damarus
Дата 4.2.2007, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: нет
Всего: 29



Цитата(mspuz @  4.2.2007,  12:54 Найти цитируемый пост)
Можно ли использовать любой цвет(и как его конвертировать, например $00FF000000)

CreateSolidBrush


PM MAIL ICQ Jabber   Вверх
mspuz
Дата 4.2.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



Damarus, Т.е. hbrBackground := CreateSolidBrush($00FFFFFF)? Не помогает!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1387 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.