Dowolna ikona w messagebox... jak?

0

Czy jest możliwe wyświetlanie dowolnej ikony z pliku w messagebox zamiast zapytajnika, krzyżyka itp?

0

Ja robiłemto za pomocą edytora zasobów - skompilowałem program ze standardową ikoną a potem wymieniłem ikonę za pomocą edytora zasobów (np Resource Hacker)

0

hehe to mnie rozbawieś [rotfl]. Messagebox bierze ikonki z systemu i mało tego reshack nie widzi w zasobach messageboxa bo jest tworzony dynamicznie.

Ktoś ma jeszcze jakiś pomysł? bo ja kombinuje ale nic z tego nie wychodzi.

0

zawsze możesz zrobić swoją formę udającą messagebox

0

tak ale zrobiłem program bez form żeby był mały. Jak je dodam to Od razu ma przynajmniej 400KB

0

Poczytaj o funkcji MessageBoxIndirect.

0

No nareszcie coś sensownego. Mam całą procedurke ale mam też problem z podciągnięciem ikony pod ten parametr:

lpszIcon := ???

jest typu PAnsiChar

Wiesz może jak to zrobić?

0

Witam
Użyj MAKEINTRESOURCE :), poniżej zamieszczam przykład:

type
  USHORT = WORD;

function MAKELANGID(p, s: USHORT): Word;
begin
  result:= ((s shl 10) or p);
end;

var
  MsgBoxParam: MSGBOXPARAMSA;
begin
  MsgBoxParam.cbSize:= SizeOf(MsgBoxParam);
  MsgBoxParam.hwndOwner:= Handle;
  MsgBoxParam.hInstance:= hInstance;
  MsgBoxParam.lpszText:= 'Ten MessageBox ma ikonę aplikacji';
  MsgBoxParam.lpszCaption:= 'MessageBoxIndirect';
  MsgBoxParam.lpszIcon:= MAKEINTRESOURCE('MAINICON');
  MsgBoxParam.dwStyle:= MB_USERICON;
  MsgBoxParam.dwContextHelpId:= 0;
  MsgBoxParam.lpfnMsgBoxCallback:= nil;
  MsgBoxParam.dwLanguageId:= MAKELANGID(LANG_POLISH, SUBLANG_NEUTRAL);
  MessageBoxIndirect(MsgBoxParam);
end;

Pozdrawiam

0
procedure MojMessageBox(Text: String); 
var
   MsgPars: TMsgBoxParams;
begin
  with MsgPars do
  begin
    cbSize := SizeOf(MsgPars);
    hwndOwner := 0; //dałem 0 bo przy handle sie wywala
    hInstance := hinstance;


    lpszCaption := 'Info';
     lpszText := PChar(Text);
    dwStyle := MB_USERICON;
    lpszIcon:= MAKEINTRESOURCE('MAINICON');

    dwContextHelpId := 0;
    lpfnMsgBoxCallback := nil;
    dwLanguageId := LANG_NEUTRAL;
  end;
  MessageBoxIndirect(MsgPars);
end;

Zrobiłem tak i pokazuje sie komunikat ale bez ikony. Jednak mi nie chodzi o ikone z zasobów tylko z zewnętrznego pliku ikona.ico

0

Zrobiłem tak i pokazuje sie komunikat ale bez ikony. Jednak mi nie chodzi o ikone z zasobów tylko z zewnętrznego pliku ikona.ico

W Win32 Programmer's Reference jest napisane:

The MAKEINTRESOURCE macro converts an integer value to a resource type compatible with Win32 resource-management functions. This macro is used in place of a string containing the name of the resource.

Tak więc jeżeli używasz makra MAKEINTRESOURCE to musisz podać mu numer do zasobu a nie jego nazwę.

0

nie rozumiem... sam podałeś w przykładzie nazwe zasobu a nie numer. poza tym skąd miałbym odczytać ten numer? Jak pogdlądam zasób ikony to jest tam sama nazwa bez numeru.

Ale w sumie nie chodzi mi o odczyt ikony z zasobu tylko z zewnątrznego pliku. Więc co wpisać zamiast tego mekeintresource(). Byłbym bardzo wdzięczny za pomoc.

0
Ziele napisał(a)

nie rozumiem... sam podałeś w przykładzie nazwe zasobu a nie numer.

Na pewno ja??? :D

Ale w sumie nie chodzi mi o odczyt ikony z zasobu tylko z zewnątrznego pliku.

No właśnie, nie jestem pewien czy jest taka możliwość.... a dlaczego z pliku a nie z zasobów???

0

sorry pokopało mi się to nie ty :]... ale wszędzie w przykładach jest zrobione to w ten sposób.

Nie chce z zasobów bo ikone doklejam na koniec pliku (jak jeszcze wiele innych danych) i potem sobie ją odczytuje. Nie umiem dodawać dowolnych ikon do zasobów ... chyba ze masz jakiś sposób. Ale skoro nawet nie ładuje sie ikona programu to mnie to nie urządza.

0
Ziele napisał(a)

Nie umiem dodawać dowolnych ikon do zasobów ... chyba ze masz jakiś sposób.

Sprawa prosta, tylko nie wiem czy Delphi to przejdzie (w C++ Builderze da radę). Otwierasz notatnik i wpisujesz np:

1 ICON "ikona1.ico"
2 ICON "ikona2.ico"
3 ICON "ikona3.ico"

teraz plik zapisujesz z rozszerzeniem *.RC i dodajesz do projektu. Oczywiście pliki ikon powinny być w tym samym katalogu co plik *.rc ;)

Tak możesz przypisać MessageBox'owi ikonę z zasobów:

...
MsgBoxParam.lpszIcon:= MAKEINTRESOURCE(2); // powinna wyświetlić się ikona2.ico
...

Podobnie do zasobów dodajesz bitmapy, kursory itd.

0

chodziło mi o programowe dodawanie ikon :D Przed skompilowaniem równie dobrze mogę zrobić to restoratorem w pliku res.

chyba dam sobie z tym spokój i zrobie to na dialogach

0

Zainteresuj się najlepiej funkcją LoadIcon(), powinna zadziałać w miejscu tego makeintresource.

0

To ja już nie wiem o co ci chodzi [???] Piszesz że:

Nie chce z zasobów bo ikone doklejam na koniec pliku (jak jeszcze wiele innych danych) i potem sobie ją odczytuje. Nie umiem dodawać dowolnych ikon do zasobów...

a później piszesz:

chodziło mi o programowe dodawanie ikon :D Przed skompilowaniem równie dobrze mogę zrobić to restoratorem w pliku res.

Swoją drogą, jeżeli ikony są dodane jednorazowo to dlaczego nie skorzystać z zasobów??? Druga sprawa. Tak dodane ikony, przed wyświetleniem, wpierw będziesz musiał zapisać na dysk, a następnie załadować funkcją LoadImage :/

Ziele napisał(a)

chyba dam sobie z tym spokój i zrobie to na dialogach

Trzeba było od razu tak zrobić ;) MessageBox (jak sam się przekonałeś) ma ograniczone możliwości.

0

Od początku pisałem że chce z osobnego pliku. Programem (kreatorem) doklejam ikonke do tego programu co wyświatla messageboxa. Potem program z siebie zapisuje ikonke gdzies na dysk i następnie ładuje do messageboxa. No ale jak sie nie da to trudno... znowu M$ dał ciała hehe :D

co do loadicon() to nie działa bo jest typu HICON a lpszIcon jest PAnsiChar

0

a moze tak:

var F:TForm;
begin
F:=Dialogs.CreateMessageDialog('Jakis text',mtWarning,[mbYes]);
(F.Components[0] as TImage).Picture:=Image1.picture;
Result:=F.ShowModal;
F.Free;
end;

dodatkowo mozecie sobie zmienic captiony i inne rzeczy...

pozdrawia cimak [browar]

aha: a sumie to mozna od razu tak:

(F.Components[0] as TImage).Picture.LoadFromFile('asdpjfdsapoj.ico');
</delphi>
0
cimak napisał(a)

a moze tak:

var F:TForm;
begin
F:=Dialogs.CreateMessageDialog('Jakis text',mtWarning,[mbYes]);
(F.Components[0] as TImage).Picture:=Image1.picture;
Result:=F.ShowModal;
F.Free;
end;

dodatkowo mozecie sobie zmienic captiony i inne rzeczy...

pozdrawia cimak [browar]

Wszystko cacy tyle, że autorowi chodziło o czyste WinAPI (mogę się mylić;))

0

aaaa to przepraszam [wstyd]

0

Dokładnie... samo winapi. Messageboxa juz sobie darowałem... wychodzi na to że łatwiej bedzie to zrobić na dialogach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1