• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed sf::Image setIcon() czy da się załadować obraz ikony bez pliku.

Object Storage Arubacloud
+2 głosów
505 wizyt
pytanie zadane 23 stycznia 2020 w C i C++ przez Utlamo Obywatel (1,540 p.)
zamknięte 27 stycznia 2020 przez Utlamo

Hej mam pytanie odnośnie SFML.

W pliku resource.rc ustawiłem ikonę programu co działa prawidłowo i jestem zadowolony, ale w lewym górnym rogu okna nie widać ikony programu.
Ikonę w lewym górnym rogu ustawiam tak:
 

    sf::Image icon; //nowy obraz sfml-a
    icon.loadFromFile("icon.png");  //ładowanie konkretnego pliku
    window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr()); // ustawianie ikony

Działa, tylko że nie do końca. W folderze z aplikacją "sfml.exe" musi być plik icon.png, jak go nie ma to nie załadowuje. Więc moje pytanie da się to jakoś obejść? Czyli czy da się zrobić coś w stylu:

sf::Image icon;
icon[1]=RGBA(10,10,50,10);

Po prostu chce jakoś połączyć ten plik graficzny ze skompilowanym programem i nie musieć go wrzucać obok pliku exe.

komentarz zamknięcia: Temat zamykam dziękuje bardzo Patrycjerz jak i jankowalski2019.

2 odpowiedzi

+1 głos
odpowiedź 24 stycznia 2020 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 27 stycznia 2020 przez Utlamo
 
Najlepsza

Spróbuj czegoś takiego:

HWND hwnd = window.getSystemHandle();
HINSTANCE hinst = (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);
SetClassLong(hwnd, GCL_HICON, (LONG) LoadIcon(hinst, MAKEINTRESOURCE(resourcenum))); 

Nie testowałem, ale może zadziała.

komentarz 24 stycznia 2020 przez Patrycjerz Mędrzec (192,320 p.)
Miałem właśnie chwilę, aby przetestować ten kod, i rzeczywiście działa.
komentarz 27 stycznia 2020 przez Utlamo Obywatel (1,540 p.)

@Patrycjerz,
Mógłbyś gdzieś to wrzucić? Prawdopodobnie dalej robię to źle. Chce po prostu prześledzić cały kod i zobaczyć co popsułem u siebie.

Dla pewności chodzi o ikonę w lewym górnym rogu programu, a nie tą na pasku szybkiego wyboru?

komentarz 27 stycznia 2020 przez Patrycjerz Mędrzec (192,320 p.)
edycja 27 stycznia 2020 przez Patrycjerz

Ten kod jedynie ma stworzyć okno oraz ustawić ikonę, więc jest dosyć trywialny:

#include <Windows.h>
#include <SFML/Graphics.hpp>
#include <iostream>
#define IDI_ICON 101

int main() {
	sf::RenderWindow window(sf::VideoMode(800, 600), "Test");
	HWND hwnd = window.getSystemHandle();
	HINSTANCE hinst = (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);
	SetClassLong(hwnd, GCL_HICON, (LONG) LoadIcon(hinst, MAKEINTRESOURCE(IDI_ICON)));
	std::cin.get();
	return 0;
}
#define IDI_ICON 101
IDI_ICON ICON "icon.ico"

Dla pewności chodzi o ikonę w lewym górnym rogu programu, a nie tą na pasku szybkiego wyboru?

Tak, chociaż Windows pokazuje ikonę z zasobów programu również w eksploratorze plików.

komentarz 27 stycznia 2020 przez Utlamo Obywatel (1,540 p.)
Dzięki wielkie :D

Działa lepiej niż sama funkcja window.setIcon() o to właśnie mi chodziło
+1 głos
odpowiedź 23 stycznia 2020 przez edwardkraweznik Dyskutant (9,930 p.)
edycja 23 stycznia 2020 przez edwardkraweznik

Musisz te 2 ikony umieścić w pliku zasobów (zasada jest taka, że pierwsza ikona jest zawsze ikoną aplikacji)

ta na pasku programu powinna być kolejną i mieć wymiar 16x16 *.ico

MOJAIKONA1 ICON "ikona1.ico"
MOJAIKONA2 ICON "ikona2.ico"

ikona1.ico będzie ikoną aplikacji ikona2.ico ---> możesz ją umieścić w dowolnym elemencie aplikacji

ikonę dla aplikacji warto stworzyć w kilku rozmiarach (wtedy będzie zawsze widoczna, w każdym widoku)

Tu masz prosty przykład jak tworzyć kilka wymiarów ikon w jednym pliku

https://www.youtube.com/watch?v=fkuZqJCFaog

komentarz 23 stycznia 2020 przez Utlamo Obywatel (1,540 p.)

Ikona w lewym górnym rogu dalej nie jest widoczna. Plik zasobów wygląda tak:
 

ICON_EXE ICON "icon.ico"
ICON_WINDOW_TITLE ICON "icon.ico"

Rozumiem że

window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr());

powinienem za komentować tak? Ikona okna powinna ustawić się samodzielnie bez kodu tak jak ikona pliku?

 

ikona2.ico ---> możesz ją umieścić w dowolnym elemencie aplikacji

Użyć ikona2.ico bezpośrednio w kodzie? Jak to zrobić?

komentarz 23 stycznia 2020 przez Utlamo Obywatel (1,540 p.)
Okej teraz widzę przykład prześledzę go.
komentarz 23 stycznia 2020 przez edwardkraweznik Dyskutant (9,930 p.)
edycja 23 stycznia 2020 przez edwardkraweznik

Nie przetestowałem ale raczej tak:

window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr());

tam gdzie "icon" podstaw IKONA2 czy jak tam to nazwałeś w rcfile

Nie sprawdziłem kompilując aplikację ale raczej tak powinno to wyglądać

EDIT:

https://github.com/SFML/SFML/wiki/Source%3A-Load-Image-From-Resource

jednak nie do końca :)

 

To co ci podałem nie zadziała sory

https://www.sfml-dev.org/documentation/2.0-fr/classsf_1_1Window.php#a63af61e026fba08e3153fd013620bcc0

komentarz 23 stycznia 2020 przez Utlamo Obywatel (1,540 p.)
No właśnie staram się to połączyć, ale nie chce się załączyć. Wpadłem teraz na może trochę głupi pomysł. Zamiast wyszukiwać jak to zrobić poprzeglądam na git hubie projekty. Może ktoś to zrobił inaczej

Myślę że twoja odpowiedź mnie w jakimś stopniu zbliżyła.
komentarz 23 stycznia 2020 przez edwardkraweznik Dyskutant (9,930 p.)
edycja 23 stycznia 2020 przez edwardkraweznik

możesz jeszcze sprawdzić:

w pliku zasobów :

ICON_EXE ICON "icon.ico"
ICON_WINDOW_TITLE RCDATA "icon.ico"

a w projekcie:

sf::Image ikonaapp = LoadImageFromResource("ICON_WINDOW_TITLE");
window.setIcon(ikonaapp.getSize().x, ikonaapp.getSize().y, ikonaapp.getPixelsPtr());

Nie mam aktualnie sfmla dlatego tak po omacku :)

Nie nie pamiętam jak ja to robiłem daję sobie spokój :(

komentarz 23 stycznia 2020 przez Utlamo Obywatel (1,540 p.)

No niestety normalnie w SFMLu nie ma funkcji LoadImageFromResource()
a kiedy wrzucam podaną w linku funkcję do swojego kodu pisze tylko

error: 'HRSRC' was not declared in this scope|

Próbowałem zaimportować

#include <hrsrc>
#include "resources.h"

i podobne ale takiego czegoś po prostu nie ma. W linku podany jest przykład do visual studio.

https://github.com/SFML/SFML/wiki/Source:-Load-Image-From-Resource

Więc mogę jedynie założyć że HRSRC to coś ze środowiska :/ no chyba że czegoś nie zauważyłem.
Ja pisze w Code::Blocks i zauważam różnice między moim środowiskiem a Visual Studio.

komentarz 23 stycznia 2020 przez edwardkraweznik Dyskutant (9,930 p.)
edycja 24 stycznia 2020 przez edwardkraweznik
no nie ma, ja to robiłem i jakoś banalnie prosto... nie pamiętam już jak, może znajdzie się ktoś kto podpowie.

EDIT:

Postanowiłem, że po powrocie z trasy specjalnie dla ciebie to ogarnę (nie wiem kiedy ale kilka dni) pozdro :)

Podobne pytania

0 głosów
1 odpowiedź 414 wizyt
0 głosów
0 odpowiedzi 142 wizyt
pytanie zadane 19 maja 2017 w C i C++ przez Knayder Nałogowiec (37,640 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...