Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Свой ShowMessage


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

Автор: mspuz 3.2.2007, 21:58
Разобрался, как вызвать окно, как дочернее. Но как сделать, чтобы родительское окно в это время стало недоступным, т.е. вызвать окно, как модальное.
И еще как правильно использовать DestroyWindow.

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

Нет такой API функции, это всё происки Delphi. Используйте MessageBoxA/MessageBoxW, MessageBoxTimeoutA/MessageBoxTimeoutW, там есть и стандартные значки ошибки, предупреждения, вопроса, информации и кнопки какие хочешь в разном сочетании. Извините, но то что Вы задумали выглядит просто как-то несерьёзно, ИМХО  smile 

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

Автор: RideX 3.2.2007, 22:37
Цитата(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.

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

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

BusinessSkinForm рулит. smile 

Автор: RideX 3.2.2007, 22:47
Цитата(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);


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

Автор: VladBD 4.2.2007, 11:02
Посмотри 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;

Автор: mspuz 4.2.2007, 11:44
А как сделать, чтобы родительское окно стало недоступным? Нашел в справке:
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:54
При регистрации класса окна задаётся параметр hbrBackground, определяющий фон окна. Можно ли использовать любой цвет(и как его конвертировать, например $00FF000000), или только системные константы COLOR_? 

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

А при создании формы - есть canvas на котором можно рисовать и заливать цветом. 

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

http://msdn.microsoft.com/library/en-us/gdi/brushes_52y0.asp


Автор: mspuz 4.2.2007, 13:27
Damarus, Т.е. hbrBackground := CreateSolidBrush($00FFFFFF)? Не помогает!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)