Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Jak w WinAPI zrobić przycisk z grafiką z zasobów?

Ostatnio zmodyfikowano 2025-02-16 14:04
Autor Wiadomość
tBane
» 2025-01-26 20:02:59
Wrzuciłem w ChatGPT i wypluł coś takiego. Może to pomoże..

1. Konwersja PNG do BMP
Najprostszym rozwiązaniem jest konwersja obrazów PNG do BMP przy użyciu dowolnego programu graficznego, np. Paint lub GIMP. Następnie możesz używać LoadBitmap bez dodatkowych problemów.

2. Ładowanie PNG za pomocą GDI+
Jeśli chcesz zachować format PNG, możesz użyć GDI+ do wczytania obrazu i przekonwertowania go na bitmapę zgodną z WinAPI.

Kod przykład:
C/C++
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")

HBITMAP LoadPNGAsBitmap( HINSTANCE hInstance, LPCWSTR filename ) {
   
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
   
ULONG_PTR gdiplusToken;
   
Gdiplus::GdiplusStartup( & gdiplusToken, & gdiplusStartupInput, NULL );
   
   
Gdiplus::Bitmap * bitmap = Gdiplus::Bitmap::FromFile( filename );
   
if( !bitmap ) {
       
MessageBox( NULL, L"Nie można załadować obrazu PNG", L"Błąd", MB_OK | MB_ICONERROR );
       
return NULL;
   
}
   
   
HBITMAP hBitmap = NULL;
   
bitmap->GetHBITMAP( Gdiplus::Color( 0, 0, 0 ), & hBitmap );
   
delete bitmap;
   
   
Gdiplus::GdiplusShutdown( gdiplusToken );
   
return hBitmap;
}

Jak używać:
Zamiast LoadBitmap, wywołaj:

C/C++
tekstura_przycisku1 = LoadPNGAsBitmap( hInstance, L"button1.png" );
if( !tekstura_przycisku1 ) {
   
MessageBox( NULL, L"Błąd ładowania PNG", L"Informacja", MB_OK );
}

3. Ustawienie bitmapy w przycisku
Po załadowaniu bitmapy (czy to BMP, czy PNG przekonwertowanego przez GDI+), ustaw ją w przycisku za pomocą SendMessage:

C/C++
SendMessage( hButton1, BM_SETIMAGE, IMAGE_BITMAP,( LPARAM ) tekstura_przycisku1 );
P-182058
AP1994
Temat założony przez niniejszego użytkownika
» 2025-01-26 22:38:31
tBane chyba nie zwróciłeś uwagi na to że napisałem że problemu nie stanowi format tylko to że zmienne tekstur przycisków mają wartość NULL. A poza tym ChatGPT podał ci kod dla ścieżek plików a nie dla zasobów
P-182060
pekfos
» 2025-01-26 23:02:55
Użyj zasobu typu BITMAP do LoadBitmap.
https://learn.microsoft.com/en-us/windows/win32/menurc/bitmap-resource
C/C++
IDB_bon1_png BITMAP "PNG/mysz.png"
I nie używaj kropek w nazwie makra, to będziesz mógł też tej nazwy użyć w C++ zamiast wpisywać z czapy "3001" w kodzie.
P-182062
AP1994
Temat założony przez niniejszego użytkownika
» 2025-01-28 12:32:01
problem w tym że nawet pliki bmp mi nie chcą działać nawet po zmienieniu w pliku rc  RCDATA na BITMAP
P-182066
pekfos
» 2025-01-30 01:50:30
A inne zasoby działają? To jest wszystko czego potrzebujesz.
C/C++
1001 BITMAP "my.bmp"
C/C++
#include <windows.h>
#include <cstdio>

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
   
HBITMAP hbmObraz = LoadBitmap( hInstance, MAKEINTRESOURCE( 1001 ) );
   
printf( "bitmap: %p\n", hbmObraz );
   
return 0;
}
Jeżeli to nie działa, to masz coś nie tak z projektem. Na przykład nie dołączasz zasobów do programu, plik RC musi być skompilowany kompilatorem zasobów i linkowany z resztą programu.
C:\stuff\_test_>windres res.rc -o res.o

C:\stuff\_test_>g++ a.cpp res.o

C:\stuff\_test_>a
bitmap: ffffffff8c05141d
Ale jak na przykład nie podam zasobów to program dalej się zbuduje:
C:\stuff\_test_>g++ a.cpp

C:\stuff\_test_>a
bitmap: 0000000000000000
P-182069
AP1994
Temat założony przez niniejszego użytkownika
» 2025-01-31 12:14:14
kompiluje program w Code::Blocks mingw mam zainstalowany osobno
w konsoli dostałem bitmap: 0000000000000000
P-182070
pekfos
» 2025-01-31 22:10:40
Masz plik RC dodany do projektu? Podaj logi kompilacji.
» KonfiguracjaPełne logi w Code::Blocks artykuł
P-182072
AP1994
Temat założony przez niniejszego użytkownika
» 2025-02-01 17:00:14


-------------- Build: Debug in open GL (compiler: GNU GCC Compiler)---------------

Target is up to date.
Nothing to be done (all items are up-to-date).


-------------- Run: Debug in open GL (compiler: GNU GCC Compiler)---------------

Checking for existence: C:\Users\Adam\Desktop\eksperymenty informatyczne\Map editor v0.2\Debug\bin\open GL.exe
Set variable: PATH=.;C:\Users\Adam\Desktop\eksperymenty informatyczne\Map editor v0.2\DLL;C:\Users\Adam\Documents\moje programy\biblioteki\allegro-x86_64-w64-mingw32-gcc-12.1.0-posix-seh-dynamic-5.2.8.0\lib;C:\MinGW\bin;C:\MinGW;C:\Windows\System32;C:\Windows;C:\Windows\System32\wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\dotnet;C:\Users\Adam\AppData\Local\Microsoft\WindowsApps;C:\Users\Adam\.dotnet\tools
Executing: "C:\Program Files (x86)\Code Blocks\x64\CodeBlocks/cb_console_runner.exe" "C:\Users\Adam\Desktop\eksperymenty informatyczne\Map editor v0.2\Debug\bin\open GL.exe"  (in C:\Users\Adam\Desktop\eksperymenty informatyczne\Map editor v0.2\.)
Process terminated with status -1073741510 (0 minute(s), 4 second(s))
skopiowałem to z Build log
P-182081
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona