Avatar billede athlon-pascal Juniormester
24. oktober 2003 - 17:54 Der er 2 kommentarer og
1 løsning

Meddelelsesboks med eget ikon (Windows.MessageBoxIndirect)

Jeg vil lave en meddelelses-boks som Windows.MessageBox, men med mit eget ikon (det store til venstre for teksten).
Windows-API bør understøtte det, så jeg vil ikke bruge en hjemmelavet løsning med en form, label, image og en button.

Jeg har lavet følgende, det virker også fint. Bortset fra, at der ikke bliver vist noget ikon i meddelelsen, men bare en tom "kasse" til venstre for teksten:

program Project1;

uses
  Windows, Forms;

{$R *.res}

function MessageDialog(Caption, Text: String): LongBool;
var
  mbp: TMsgBoxParams;
begin
  with mbp do
  begin
    cbSize := SizeOf(mbp);
    hwndOwner := Application.Handle;
    hInstance := Application.Handle;
    lpszText := PAnsiChar(Text);
    lpszCaption := PAnsiChar(Caption);
    dwStyle := MB_OK or MB_TOPMOST or MB_USERICON;
    lpszIcon := 'MAINICON';
    dwContextHelpId := 0;
    lpfnMsgBoxCallback := nil;
    dwLanguageId := LANG_NEUTRAL;
  end;

  Result := Windows.MessageBoxIndirect(mbp);
end;

begin
  Application.Initialize;
  Application.Run;
  MessageDialog('Heste-dialog', 'Vil du i dialog med heste?' + #13#10 + 'Det kommer du nu!');
end.

Hvis der også er en der kan løse det, så jeg ikke behøver bruge VCL (Forms-uniten, med Application), vil det være godt.

Jeg bruger Delphi 7 Personal under Windows XP Prof.

På forhånd tak :-)
Avatar billede stoney Nybegynder
24. oktober 2003 - 18:24 #1
procedure ShowMessageBoxW(AMessage, ATitle, AIcon: String);
var
  vMsgBoxParams : tagMSGBOXPARAMSW;
  vStrIcon : array[0..255] of WideChar;
  vStrTitle : array[0..255] of WideChar;
  vStrMsg : array[0..255] of WideChar;
begin

  StringToWideChar( AMessage, vStrMsg,
((Length(AMessage)+1)*SizeOf(vStrMsg)) ) ;
  StringToWideChar( ATitle, vStrTitle,
((Length(ATitle)+1)*SizeOf(vStrTitle)) ) ;
  StringToWideChar( AIcon, vStrIcon, ((Length(AIcon)+1)*SizeOf(vStrIcon)) )
;

  vMsgBoxParams.cbSize := SizeOf( vMsgBoxParams );
  vMsgBoxParams.hwndOwner := Application.Handle;
  vMsgBoxParams.hInstance := HInstance;
  vMsgBoxParams.lpszText := PWideChar( @vStrMsg );
  vMsgBoxParams.lpszCaption := PWideChar( @vStrTitle );
  vMsgBoxParams.dwStyle := MB_OK or MB_USERICON;
  vMsgBoxParams.lpszIcon := PWideChar( @vStrIcon );
  vMsgBoxParams.dwContextHelpId := 0;
  vMsgBoxParams.dwLanguageId := LANG_ENGLISH;

  MessageBoxIndirectW( vMsgBoxParams );

end;




procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessageBoxW( 'Vil du i dialog med heste?' + #13#10 + 'Det kommer du nu!', 'Heste-dialog', 'MAINICON' );

end;

Stoney
Avatar billede athlon-pascal Juniormester
24. oktober 2003 - 18:36 #2
Det virker jo :-)

Ved du hvorfor man skal bruge MessageBoxIndirectW for at få det til at virke?
Avatar billede stoney Nybegynder
24. oktober 2003 - 18:38 #3
Nej, desværre :-(

Stoney
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester