Ändra bakgrund på ett fönster? [Visual C++]

Permalänk

Ändra bakgrund på ett fönster? [Visual C++]

Hur ändrar jag bakgrunden på ett Windowsfönster till en egen .bmp (förmodar att det är .bmp som gäller (?) ).

Jag tänker då på program såsom Ad-Aware som, med mina ögon sett har en helt egen bakgrund gjord speciellt för just det programmet. Dessutom egna knappar. (Funktioner till hur man använder dem skulle också vara glädjande).

Hade varit intressant att se vad detta ger för möjligheter i ett eget program, då det blir mer ens eget program.

(Har sökt på MSDN men inte kommit fram till något, deras sökfunktion är inte världens bästa - man bör nästan veta precis vad det är man letar efter för att ha någon nytta av den... )

Visa signatur

iBook 12" G4 1,2 GHz 60 GB HDD 768 MB RAM Mac OS X 10.3

Permalänk
Medlem

Ett sätt är iaf. att hantera meddelandet WM_PAINT och kopiera den ytan som ska uppdateras från bitmappen som du måste ha laddat i minnet till fönstret. Kanske finns det något enklare sätt. Använder du MFC eller kör du direkt mot API:et?

Permalänk

Jag programmerar direkt mot API:t.
Har du någon länk eller exempel på hur man gör?

Visa signatur

iBook 12" G4 1,2 GHz 60 GB HDD 768 MB RAM Mac OS X 10.3

Permalänk
Inaktiv

Jag har inget fint litet färdigt exempel utan klipper och klistrar lite snuttar ur min gamla Winamp-klon.

I WndProc:

case WM_PAINT: PAINTSTRUCT ps; // Antagligen inte nödvändig. InvalidateRect(hWnd, NULL, true); BeginPaint(hWnd, &ps); BitBlt(ps.hdc, 0, 0, m_iWinWidth, m_iWinHeight, hdcBitmap, 0, 0, SRCCOPY); EndPaint(hWnd, &ps); return 0;

hdcBitmap är en HDC som pekar/whatever på bilden. Obs, stor risk att det är något fel i koden

Permalänk

hur lägger jag till bilden menar du då?
likadant, skulle behöva liknande som infogar custom button också.

Visa signatur

iBook 12" G4 1,2 GHz 60 GB HDD 768 MB RAM Mac OS X 10.3

Permalänk
Medlem

// Kod för att ladda in en bitmap från disk till minne. (Kräver att du har en ett handtag till ett fönster (hWnd). (Reservation för något småfel.)

HBITMAP hMyBitmap;
HDC hWndDC, HDCBitmap;
hWndDC=GetDC(hWnd);
HDCBitmap=CreateCompatibleDC(hWndDC);
hMyBitmap=LoadImage(0, "alpha.bmp", IMAGE_BITMAP, 0, 0,
LR_DEFAULTCOLOR|LR_LOADFROMFILE);
SelectObject(HDCBitmap, hMyBitmap);
ReleaseDC(hWnd, hWndDC);

Koden för WM_PAINT har poppeman redan givit. Den kan dock förbättras på en punkt. i ps.rcPaint finns koordinaterna för vilka yta som ska uppdateras. poppeman:s kod ritar om hela bakgrunden även om windows egentligen bara vill rita om en liten del. Däremot om alla rektangel koordinater är noll, då ska du rita om hela fönstret. Mycket riktigt är InvalidateRect anropet onödigt. Detta används för att tvinga fram en uppdatering av skärmen vilket betyder att windows skickar meddelandet WM_PAINT till fönstret. Man borde hamna i en evighetsloop, men windows hanterar det på något sätt.

Vad menar du med custom button?

Permalänk

med custom button menar jag en knapp som jag själv gör.
om jag t.ex vill ha en grön/röd prickig knapp grundad på en egen bild jag gjort..

Förresten finns det någon tutorial som går igenom detta? Har kollat på länkarna i FAQ:n men de går inte igenom speciellt mycket.

Visa signatur

iBook 12" G4 1,2 GHz 60 GB HDD 768 MB RAM Mac OS X 10.3

Permalänk
Inaktiv

Tja, går att fixa skinnade knappar på lite olika sätt. Ett sätt är att leka med hooks, fast det har jag ingen vidare erfarenhet av så det kan jag inte hjälpa dig med. Ett lite mer invecklat sätt är att göra en egen knapp mer eller mindre från scratch, dvs RegisterWindowClassEx och hela köret och ha en WndProc som har typ samma WM_PAINT som ovan. Själv kör jag inte med "HWND-knappar" utan har gjort ett eget system för det där. Antagligen det mest bökiga sättet då man får skriva om alla kontroller själv

Edit: Kolla http://www.flipcode.com/articles/article_win32skins.shtml

Permalänk

Precis vad jag letade efter!!
Stort tack poppeman!!!

Visa signatur

iBook 12" G4 1,2 GHz 60 GB HDD 768 MB RAM Mac OS X 10.3