Czy jest możliwe wyświetlanie dowolnej ikony z pliku w messagebox zamiast zapytajnika, krzyżyka itp?
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)
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.
zawsze możesz zrobić swoją formę udającą messagebox
tak ale zrobiłem program bez form żeby był mały. Jak je dodam to Od razu ma przynajmniej 400KB
Poczytaj o funkcji MessageBoxIndirect.
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ć?
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
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
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ę.
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.
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???
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.
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.
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
Zainteresuj się najlepiej funkcją LoadIcon(), powinna zadziałać w miejscu tego makeintresource.
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.
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
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>
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ć;))
aaaa to przepraszam [wstyd]
Dokładnie... samo winapi. Messageboxa juz sobie darowałem... wychodzi na to że łatwiej bedzie to zrobić na dialogach.