BMP wird nicht geblittet.
-
Hallo, Ich habe hier mal direkt den Code, der sich nicht sonderlich von meinem vorigen Posting unter dem Namen "Ressource Type not found" unterscheidet.Allerdings läuft er fehlerfrei durch, ohne Errorpopups, keine Compilerfehler, alles ist so wie es soll, ausser, dass das Bitmap einfach nicht
über das Fenster geblittet wird.
Anlehnung an Flipcode.com/articles : Window regions and skins
Eine Kompilierung mit Testweise eingesetzten Ressourcen ala Menü funktioniert allerdngs, nur ein BMP draufblitten nicht. Weiss jemand ,was ich nicht beachtet habe???!
Hier mal die Dateien://main: //--------- #define STRICT #include<windows.h> #include "flip.h" //---------------preprocessing-------------------------------------------------- LRESULT CALLBACK MessFunc(HWND, UINT, WPARAM,LPARAM); char szApNa[] = "Regions---the first trial"; HBITMAP hskin; //------global vars and apps---------------------------------------------------- int WINAPI WinMain(HINSTANCE hiact,HINSTANCE hiprev, LPSTR cmdline, int showhow) { MSG mess; WNDCLASS wcx; HWND thisone; wcx.cbClsExtra = 0; wcx.cbWndExtra = 0; wcx.hInstance = hiact; wcx.lpfnWndProc = MessFunc; wcx.lpszClassName = szApNa; wcx.lpszMenuName = NULL; wcx.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(120,140,200)); wcx.hIcon = LoadIcon(NULL,IDI_EXCLAMATION); wcx.hCursor = LoadCursor(NULL, IDC_ARROW); wcx.style = CS_VREDRAW | CS_HREDRAW; if(!RegisterClass(&wcx)) { MessageBox(NULL,"Error occured", "Registration failed",MB_OK); return 0; } thisone = CreateWindow( szApNa, szApNa, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,200,200, NULL, NULL, hiact, NULL ); ShowWindow(thisone,showhow); UpdateWindow(thisone); while(GetMessage(&mess,NULL,0,0)) { TranslateMessage(&mess); DispatchMessage(&mess); } return mess.wParam; } LRESULT CALLBACK MessFunc(HWND mwinhan,UINT mcode, WPARAM wm_Wflags,LPARAM wm_Lflags) { POINT a,b,c,d,e,f,g,h; a.x=110; a.y=30; c.x=180; c.y=70; d.x=180; d.y=150; e.x=110; e.y=190; g.x=40; g.y=150; h.x=40; h.y=70; HBITMAP oldbmp; HBITMAP hskin; HDC dcskin; switch(mcode) { case WM_CREATE: { const POINT pt[] = {a,c,d,e,g,h}; HRGN rg1 = CreatePolygonRgn(pt,6,ALTERNATE); SetWindowRgn(mwinhan,rg1,true); DeleteObject(rg1); HBITMAP hskin = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_BMP)); HDC dcskin = CreateCompatibleDC(0); oldbmp = (HBITMAP)SelectObject(dcskin,hskin); DWORD wndstyle = GetWindowLong(mwinhan,GWL_STYLE); // a very good and versatile function : with this function // we can retrieve several information about our used window class // it is also possible to retrieve information about predefined // classes like button or edit and to subclass them. wndstyle &=~(WS_CAPTION | WS_SIZEBOX); // very smooth: ouroverlapped window is now getting cut short and the // here mentioned elements are removed by an bit addition, using a //~ to remove and a pipe to line up, which we well remove SetWindowLong(mwinhan,GWL_STYLE,wndstyle); // here we replace the former Window style by this, which we have // defined one line before, now we habe an overlapped window without // a caption bar and without the possbility to resize it. InvalidateRect(mwinhan, NULL, true); //SetWindowPos(mwinhan,NULL,0,0,200,200,SWP_NOMOVE | SWP_NOZORDER); char ch[10]; if(!hskin) { MessageBox(NULL,itoa(GetLastError(),ch,10),"Error",MB_OK); return 0; } break; } case WM_LBUTTONDOWN: { break; } case WM_MOUSEMOVE: { break; } case WM_PAINT: { PAINTSTRUCT pskn; BeginPaint(mwinhan,&pskn); BitBlt(pskn.hdc,0,0,200,200,dcskin,0,0,SRCCOPY); EndPaint(mwinhan, &pskn); // InvalidateRect(mwinhan,NULL,true); break; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(mwinhan,mcode,wm_Wflags,wm_Lflags); } //---------------------------------------------------------------------------------------------------------
und die beiden ressourcedateien:
//flip.h //------ #define IDI_BMP 101 //--------------------------------------------------------------------------------------------------------- //flip.rc //-------- #include<windows.h> #include "flip.h" IDI_BMP BITMAP "Skin1.bmp" //---------------------------------------------------------------------------------------------------------
Es ist seltsam. Ich meine , ungefähr zu wissen woran es liegen könnte, nämlich in der WM_PAINT, da könnte etwas falsch sein, mit den device Contexten.
Aber ich habe schon einiges ausprobiert und er blittet einfach kein Skin drauf.
Wäre sehr nett, wenn mir da jemand n Hinweis geben könnte.
Danke.
Grüsse, me-$-on!
-
static ...
-
Und doch die Lösung?
Meinste static HBITMAP und static HDC?
Danke schonmal!
-----------
nun habe ich die beiden HBITMAPS und das HDC ge-statict.
Effekt = NULL.
Und nun?!??!?
-
Der Bezeichner "dcskin" wurde mehrfach deklariert (bekanntgegeben).
Das hat zur Folge, dass "dcskin" in "WM_CREATE" nicht der gleiche ist wie in "WM_PAINT".
-
Ja, stimmt, einmal funktionsglobal und einmal nachrichtenlokal.
Ich hätte mal den Typ weglassen sollen.
Man, das ich sowas nicht sah,aber es braucht seine Zeit bis guter Wein reift.
Probiere ich heute aus, wenn ich zu Hause bin.Denn aufer Arbeit haben wir nur Thin-Clients.
Stimmt das, das auch dumme Terminals ein OS im E-Prom haben müssen ( sorry wegen off-topic).??????
Danke bisher!
->
Ach, durscheinende Fenster, wie bei XP..... die Technik ist nicht "transparenz" sondern Alpha-Blending, oder?
Wie kann ich das denn auf dieses Bitmap anwenden?
-
GdiAlphaBlend ...
-
Ok, ich habe mal die Tydefinitionnen aus der WM_PAINT genommen.
Damit das sozusagen nicht überladen wird.
Nun klappt es.
---------------
Ok, nehmen wir mal an , die Idee dahinter sieht so aus:
Ich will ne Anwendung, mit nem coolen bmp als bg.
Darauf sitzen Polys oder rects, die sich wie buttons verhalten.
Das habe ich bisher gecheckt
---
Weiterhin: Ich habe mir ne Klasse für diese Buttons gebaut, in der WM_PAINT muss ich sie bisher zeichnen lassen, erstelle also das Objekt, welches im Konstruktor alles hat, was man braucht, um n rect zu zeichnen.
Allerdings kann ich in diese Klasse nicht die Funktionalitäten implementieren, die ich sonst für das Rect in der WM_MOUSEMOVE und WM_LBUTTONDOWN prozedural habe.
Mit anderen Worten:
Diese Klasse hat ne Methode hoverrect, die bei WM_MOUSEOVER bisher prozedural per mouseover n Rechteck umfärbt.
Wenn ich das Objekt aber in der WM_PAINT erzeuge, wird das Rechteck gemalt...
( ok, ausser bei dem blöden bmp background).
Nur habe ich das Objekt in der WM_PAINT erzeugt, damit es auch gemalt wird.
Würde ich es funktionsglobal in der WndProc erzeugen, dann würde es ja nur erzeugt werden, nicht aber gezeichnet.
Muss ich also ( obwohl ich es in der WndProc funktionsglobal erzeuge), für jede Methode , die dann jeweils ne andere WM_ abarbeiten soll, etwa mit GetWindowLong
die WndProc ermitteln und "subclassen"?????
Das ist n bisschen komplex, ich will halt eigene Buttons bauen, die sich auf dem Bmp gut abheben.
Mit nem hover und so weiter.
->
eine eigene Klasse für die Buttons bietet sich an, da dynamisch mehr erzeugt werden können, vom user. ( Ist mein hier schonmal besprochenes Projekt eines eigenen Kontextmenüs auf ner extramousetaste zum Selbergestalten ala Quicklaunch.)
Diese Klasse muss aber irgendwie die WM_'s spezfisch bearbeiten, was nicht so leicht ist...
..
.braucht Ihr codeschnipsel davon ,würde ich sie anfügen
Aber danke sehr bisher, auch wegen dem GDI Alpha blend.
Ist sicher GDI +. Weiss gar nicht ob das Dev-cpp von Anfang an aktiv hat, oder ob ich libs und PAKETe erstmal anfügen muss.
Aber ich check es mal aus.
Bis bald.
-
me-S-on schrieb:
Aber danke sehr bisher, auch wegen dem GDI Alpha blend.
Ist sicher GDI +. Weiss gar nicht ob das Dev-cpp von Anfang an aktiv hat, oder ob ich libs und PAKETe erstmal anfügen muss.
Aber ich check es mal aus.
Bis bald.Nein ist normale WinAPI-GDI. Allerdings ist die Funktion offiziell nicht dokumentiert, siehe:
http://www.helpedia.com/programming/apisecrets/GdiAlphaBlend-function272.html
http://www.codeproject.com/gdi/alphablend.asp?df=100&forumid=291&exp=0&select=431252
-
Cremial.
Das ist doch mal echt super.
Danke!