amiga-virus nachprogrammieren ;-)
-
ich habe 1 minute und 8 sekunden gebraucht :o
-
Hmm. Dann lad dir mal die neue Version runter.
P.S.: Das Ganze wird bald NOCH schneller.
-
hmm und um die form und größe der region zu ermitteln, benutzt er die
ScanRegion() funktion...
jetz versteh ich ...wenn ich scanregion weglass, dann zeigt er nämlich noch die komplette dialoge an ... wenns dazukommt, dann sieht man nur die bitmap, und wenn ich weiss bei mir auf transparent setze, dann sehe ich nur meinen Roboter (sprite) ...
womit ich aber noch net so klar komm sind die 2 externe funktionen ScanRegion() und Get24BitPixels ... noch etwas zu hoch für mich..
hab die beiden funktionen deshalb 1zu1 kopiert
jetz fehlt mir noc der algorithmus für die bewegung... bei mir isses aber easy, da er sich gleichförmig bewegen soll ..
ich hab aber zusätzlich da prob, dass er je nach cursor position eine andere bitmap einladen soll... soll er nach links gehen, nach rechts, nach oben, oder unten...
könnt etwas größer werden das prog...kann man eigentlich auch gifs verwenden anstatt bitmaps ?
-
Original erstellt von Hammer:
kann man eigentlich auch gifs verwenden anstatt bitmaps ?Ja, steht in der FAQ.
-
ich habe 3 verschiedene bitmaps , die er nach einer bestimmten zeit immer nacheinander anzeigen soll und das immer von vorn
nur hab ich jetz da ein prob!
und zwar bräuchte ich einen befehl, den dialoge neu zu generieren, sodass die 3 verschiedenen regions pro bitmap wieder nach jedem durchlauf neu gesetzt werden... da es sonst zu überlappungen kommt und er immer die region der vorherigen bitmap weiterverendet und dort die nächste drübersetzt, was natürlich falsch ist, es soll sich ja immer auf die ganze dlg beziehen !
einen fortschritt hab ich gemacht indem ich in der WM_INITDIALOGE die Regions getrennt mit GetWindowsRgn() abgespeichert hab!
hat wunderbar funktioniert...
nur nach dem ersten durchlauf, fängt das gleich prob wieder von vorne an...hier der code:
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBitmap, hBitmap2, hBitmap3, hBitmapAttack;
HDC hdc, hdcMem;
PAINTSTRUCT ps;
static int bmp_counter = 1;switch (message)
{
case WM_INITDIALOG:hBitmap = LoadBitmap(hPubInst, MAKEINTRESOURCE(BMP_ROBO));
hBitmap2 = LoadBitmap(hPubInst, MAKEINTRESOURCE(BMP_ROBO2));
hBitmap3 = LoadBitmap(hPubInst, MAKEINTRESOURCE(BMP_ROBO3));
if(hBitmap==NULL || hBitmap2==NULL || hBitmap3==NULL)
{
MessageBox(0, "Bitmap konnte nicht geladen werden", "ERROR", MB_OK);
PostQuitMessage(0);
}GetObject(hBitmap, sizeof (BITMAP), &bitmap);
GetObject(hBitmap2, sizeof (BITMAP), &bitmap2);
GetObject(hBitmap3, sizeof (BITMAP), &bitmap3);hRgn = ScanRegion(hBitmap, 255, 255, 255);
GetWindowRgn(hDlg, hRgn);
hRgn2 = ScanRegion(hBitmap2, 255, 255, 255);
GetWindowRgn(hDlg, hRgn2);
hRgn3 = ScanRegion(hBitmap3, 255, 255, 255);
GetWindowRgn(hDlg, hRgn3);SetWindowPos(hDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE);
SetTimer(hDlg, TIMER_MOVE, 20, NULL);
SetTimer(hDlg, TIMER_BMP, 1000, NULL);
SetTimer(hDlg, TIMER_ATTACK, 2000, NULL);
SetTimer(hDlg, TIMER_RUSH, 20, NULL);return TRUE;
case WM_PAINT:
hdc = BeginPaint (hDlg, &ps);
hdcMem = CreateCompatibleDC (hdc);
if (bmp_counter == 1)
{
SetWindowRgn(hDlg, hRgn, true);
SelectObject (hdcMem, hBitmap);
BitBlt (hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
}
if (bmp_counter == 2)
{
SetWindowRgn(hDlg, hRgn2, true);
SelectObject (hdcMem, hBitmap2);
BitBlt (hdc, 0, 0, bitmap2.bmWidth, bitmap2.bmHeight, hdcMem, 0, 0, SRCCOPY);
}
if (bmp_counter == 3)
{
SetWindowRgn(hDlg, hRgn3, true);
SelectObject (hdcMem, hBitmap3);
BitBlt (hdc, 0, 0, bitmap3.bmWidth, bitmap3.bmHeight, hdcMem, 0, 0, SRCCOPY);
}
if (bmp_counter == 4)
{
SetWindowRgn(hDlg, hRgn2, true);
SelectObject (hdcMem, hBitmap2);
BitBlt (hdc, 0, 0, bitmap2.bmWidth, bitmap2.bmHeight, hdcMem, 0, 0, SRCCOPY);
}
DeleteDC (hdcMem);EndPaint (hDlg, &ps);
return TRUE;case WM_TIMER:
if (wParam == TIMER_MOVE && RemoveCursor() == false)
{MoveRobo(hDlg);}if (wParam == TIMER_BMP)
{
bmp_counter++;if(bmp_counter == 5)
{bmp_counter = 1;}InvalidateRect(hDlg, NULL, false);
}if (wParam == TIMER_RUSH && RemoveCursor() == true)
{}if (wParam == TIMER_ATTACK && RemoveCursor() == true && Rush(hDlg) == true)
{}return TRUE;
...
vielleicht sieht jemand was...also ich möchte nach möglichkeit nicht zu arg von meiner variante abweichen...
d.h. das grundprinzip zur lösung möchte ich nach möglichkeit beibehaltenthx
mfg haMMer
[ Dieser Beitrag wurde am 26.02.2003 um 17:40 Uhr von Hammer editiert. ]
-
Du setzt bei jedem WM_PAINT eine neue WindowRgn. Das ist nicht gut! Mach das beim Eingang von WM_TIMER mit wParam TIMER_BMP. Aber bevor du SetWindowRgn() aufrufst, rufst du nocheinmal GetWindowRgn() auf mit der upzudatenden Region im 2. Parameter. Zum Beispiel:
if(bmp_counter == 3) { // Vorige "aktive" Region war hRgn2 GetWindowRegion(hDlg, hRgn2); // Neue Region setzen SetWindowRgn(hDlg, hRgn3, TRUE); }
-
das versteh ich jetz gar nicht...
mit der ScanRegion leg ich ja die 3 verschiedenen regions fest in die hRgn1-3
ich dachte mit GetRegion kann ich die region sozusagen backuppen, sodass ich die
zu jeder zeit mit setregion verwenden kann...warum merkst du dir immer die vorherige region ? die is doch gar nich mehr relevant, ... ich brauch doch immer die region, wo auch meine neue bitmap vollständig hineinpasst...
ich dachte das getregion wäre nur zum abspeichern der einzelnen regionen ??
-
Erstmal heißt es Get/SetWindowRgn(). OK, nun zum Punkt: Wenn du SetWindowRgn() aufrufst, dann "gehört" dir die angegebene Region nicht mehr, sondern dem System. Sie ist dir u.U. verlorengegangen. Du brauchst sie also wieder. Dafür gibt es 2 Möglichkeiten: (a)Du benutzt andauernd Scanregion(), um die aktuelle Region neu zu erstellen; (b)Du benutzt GetWindowRgn(), um die verlorengegangene Region wiederzubekommen.
Verstanden?
-
also bei mir will er nich !
k.a. spiel schon seit 3 stunden mit GetWindowRgn() rum...einzigste was geht is in der WM_INITDIALOGE die dinger mit GetWindowRgn() festzuhalten, nur da hat man das prob, dass die dann wie du schon sagtest, nach einen durchgang verloren sind
die andere variante mit scanregion hab ich schon am anfang getestet.. die hat funktioniert, nur das prob da is, dass es nach jedem timer kurz ruckelt..
ich denke mal dass das ScanRegion() zu viel performance schluckt...aber das verschickt mich, wenns in der WM_INITDIALOGE geht, musses doch auch in der WM_TIMER gehen...
-
also ich kriegs mit GetWindowRgn() nich hin...
past mal deinen kompletten TIMER durchlauf... (bitte
)
ich will wissen ob ich n grundlegenden fehler mach oder obs
nur an ner kleinigkeit liegt...
ich lass das prob jetz mal auf mich liegen...
hab halt vorher die ganzen befehle noch nie verwendet
kein plan auf was man achten muss..
-
Scheinbar hast du GetWindowRgn() noch nicht ganz verstanden. Jedenfalls muss das aus WM_INITDIALOG raus! Sorry, hatte ich übersehen. Aus der MSDN über den 2. Parameter von GetWindowRgn():
Handle to a region. This region receives a copy of the window region.
Was passiert also wohl in den Zeilen
hRgn = ScanRegion(hBitmap, 255, 255, 255); GetWindowRgn(hDlg, hRgn);
Zunächst holen wir uns die "richtige" Region per ScanRegion() und dann weisen wir dem eben neu erstellten Handle schon wieder eine neue Region zu - nämlich die Window-Region, die zu dem Zeitpunkt von WM_INITDIALOG noch das ganze Rechteck beinhaltet. Das KANN nicht richtig sein!
-
OK, also
1. Die GetWindowRgn()s aus der WM_INITDIALOG raus;
2. Die SetWindowRgn()s aus der WM_PAINT raus;
3. Die SetWindowRgn()s in die WM_TIMER rein:if (wParam == TIMER_BMP) { bmp_counter++; if(bmp_counter == 5) bmp_counter = 1; if (bmp_counter == 1) { GetWindowRgn(hDlg, hRgn2); SetWindowRgn(hDlg, hRgn, true); } if (bmp_counter == 2) { GetWindowRgn(hDlg, hRgn); SetWindowRgn(hDlg, hRgn2, true); } if (bmp_counter == 3) { GetWindowRgn(hDlg, hRgn2); SetWindowRgn(hDlg, hRgn3, true); } if (bmp_counter == 4) { GetWindowRgn(hDlg, hRgn3); SetWindowRgn(hDlg, hRgn2, true); } InvalidateRect(hDlg, NULL, TRUE); }
-
hmm...
k.a. also ich denke ich habs so gemacht wie dus gesagt hast...
es will einfach nicht:BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBitmap, hBitmap2, hBitmap3, hBitmapAttack;
HDC hdc, hdcMem;
PAINTSTRUCT ps;
static int bmp_counter = 1;switch (message)
{
case WM_INITDIALOG:hBitmap = LoadBitmap(hPubInst, MAKEINTRESOURCE(BMP_ROBO));
hBitmap2 = LoadBitmap(hPubInst, MAKEINTRESOURCE(BMP_ROBO2));
hBitmap3 = LoadBitmap(hPubInst, MAKEINTRESOURCE(BMP_ROBO3));
if(hBitmap==NULL || hBitmap2==NULL || hBitmap3==NULL)
{
MessageBox(0, "Bitmaps konnten nicht geladen werden !", "ERROR", MB_OK);
PostQuitMessage(0);
}GetObject(hBitmap, sizeof (BITMAP), &bitmap);
GetObject(hBitmap2, sizeof (BITMAP), &bitmap2);
GetObject(hBitmap3, sizeof (BITMAP), &bitmap3);hRgn = ScanRegion(hBitmap, 255, 255, 255);
hRgn2 = ScanRegion(hBitmap2, 255, 255, 255);;
hRgn3 = ScanRegion(hBitmap3, 255, 255, 255);SetWindowPos(hDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE);
SetTimer(hDlg, TIMER_MOVE, 20, NULL);
SetTimer(hDlg, TIMER_BMP, 1000, NULL);
SetTimer(hDlg, TIMER_ATTACK, 2000, NULL);
SetTimer(hDlg, TIMER_RUSH, 20, NULL);return TRUE;
case WM_PAINT:
hdc = BeginPaint (hDlg, &ps);
hdcMem = CreateCompatibleDC (hdc);
if (bmp_counter == 1)
{
SelectObject (hdcMem, hBitmap);
BitBlt (hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
}
if (bmp_counter == 2)
{
SelectObject (hdcMem, hBitmap2);
BitBlt (hdc, 0, 0, bitmap2.bmWidth, bitmap2.bmHeight, hdcMem, 0, 0, SRCCOPY);
}
if (bmp_counter == 3)
{
SelectObject (hdcMem, hBitmap3);
BitBlt (hdc, 0, 0, bitmap3.bmWidth, bitmap3.bmHeight, hdcMem, 0, 0, SRCCOPY);}
if (bmp_counter == 4)
{
SelectObject (hdcMem, hBitmap2);
BitBlt (hdc, 0, 0, bitmap2.bmWidth, bitmap2.bmHeight, hdcMem, 0, 0, SRCCOPY);
}
DeleteDC (hdcMem);EndPaint (hDlg, &ps);
return TRUE;case WM_TIMER:
if (wParam == TIMER_MOVE && RemoveCursor() == false)
{MoveRobo(hDlg);}if (wParam == TIMER_BMP)
{
bmp_counter++;if(bmp_counter == 5)
bmp_counter = 1;if(bmp_counter == 1)
{
GetWindowRgn(hDlg, hRgn2);
SetWindowRgn(hDlg, hRgn, true);
}
if(bmp_counter == 2)
{
GetWindowRgn(hDlg, hRgn);
SetWindowRgn(hDlg, hRgn2, true);
}
if(bmp_counter == 3)
{
GetWindowRgn(hDlg, hRgn2);
SetWindowRgn(hDlg, hRgn3, true);
bmp_counter = 0;
}
if(bmp_counter == 4)
{
GetWindowRgn(hDlg, hRgn3);
SetWindowRgn(hDlg, hRgn2, true);
//bmp_counter = 1;
}
//bmp_counter++;InvalidateRect(hDlg, NULL, true);
}
jetz isses noch komischer als am anfang, als ich das ganze zeug noch in der WM_PAINT hatte... da hat er wenigstens noch den ersten durchgang korrekt angezeigt... sobald ich was in der TIMER mach, spinnts schon am anfang rum
[ Dieser Beitrag wurde am 26.02.2003 um 22:51 Uhr von Hammer editiert. ]
-
was ich mir überlegt hab, dass es am bmp_counter liegen könnte ..!
und zwar weiss ich nicht inwieweit WM_TIMER und WM_PAINT miteinander richtig
kooperieren ...
an was ich gedacht hab , dass der timer gleich am anfang schon bmp_counter um eins erhöht ! und das PAINT dann bei counter 2 anfängt und der timer erst noch bei 1 ist...
weil ich habe festgestellt, dass es fast keinen unterschied macht ob ich GetWindowRgn() im TIMER lasse oder komplett raushau...was mir auch noch aufgefallen ist, gerade jetz wo ich das SetWindowRgn im TIMER drin hab, dass er am anfang gar keine Rgn setzt, erst beim nächsten bild...
d.h. er zeigt am anfang erst das komplette Dlg-Rechteck an, erst beim nächsten counter verschwindet der Dlg und nur die Region wird angezeigt...das sagt mir eigentlich nur eines, dass der fehler im counter liegt, also in dem falle schon gleich am anfang... das würde dann auch erklären warum GetWindowRgn gar keinen Effekt hat...
naja habs aber noch nich hinbekommen, ... wenn dir was einfällt , kannst ja nochmal posten
mfg haMMer
[ Dieser Beitrag wurde am 27.02.2003 um 14:36 Uhr von Hammer editiert. ]
-
Hab deine Mail erhalten.
Und ich hab, glaube ich, das best mögliche draus gemacht. Aber es flackert immernoch ein wenig. Ich bin mir nicht sicher, ob man das überhaupt wegmachen kann. Ich schreib dir den Code hier herein, denn sooo viel ist es auch wieder nicht.
[EDIT] Dein Robo ist dermaßen hässlich... Ich würde nochmal nen anderen machen. Aber vielleicht hattest du das auch vor. [/EDIT]
#include <windows.h> #include "Resource.h" #include "skin.h" //--------------------------------------------------------------------------- #define TIMER_MOVE 1 #define TIMER_BMP 2 #define TIMER_RUSH 3 #define TIMER_ATTACK 4 HBITMAP hBitmap[3]; BITMAP bitmap[3]; // Variablen der Bitmaps RGNDATA* RgnData[3]; HDC hdcMem[3]; HRGN hRgn; HINSTANCE hPubInst;// Handle der main-Instanz POINT pCursor; // Koordinaten des MouseCursors POINT pRobo; // Koordinaten der Bitmap POINT pIcon; int iSize; BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM) { HDC hdc; PAINTSTRUCT ps; static int i, bmp_counter = 0; switch (message) { case WM_INITDIALOG: hBitmap[0] = LoadBitmap(hPubInst, MAKEINTRESOURCE(BMP_ROBO1)); hBitmap[1] = LoadBitmap(hPubInst, MAKEINTRESOURCE(BMP_ROBO2)); hBitmap[2] = LoadBitmap(hPubInst, MAKEINTRESOURCE(BMP_ROBO3)); if(!hBitmap[0] || !hBitmap[1] || !hBitmap[2]) { MessageBox(0, "Bitmaps konnten nicht geladen werden !", "ERROR", MB_OK); PostQuitMessage(0); } hdc = GetDC(hDlg); for(i=0; i < 3; i++) { hdcMem[i] = CreateCompatibleDC(hdc); SelectObject(hdcMem[i], hBitmap[i]); GetObject(hBitmap[i], sizeof(BITMAP), &bitmap[i]); hRgn = ScanRegion(hBitmap[i], 255, 255, 255); iSize = GetRegionData(hRgn, 0,0); RgnData[i] = new RGNDATA[iSize]; GetRegionData(hRgn, iSize, RgnData[i]); DeleteObject(hRgn); } ReleaseDC(hDlg, hdc); hRgn = ExtCreateRegion(NULL, iSize, RgnData[0]); SetWindowRgn(hDlg, hRgn, TRUE); SetWindowPos(hDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE); SetTimer(hDlg, TIMER_MOVE, 20, NULL); SetTimer(hDlg, TIMER_BMP, 1000, NULL); //SetTimer(hDlg, TIMER_ATTACK, 2000, NULL); //SetTimer(hDlg, TIMER_RUSH, 20, NULL); return TRUE; case WM_PAINT: hdc = BeginPaint (hDlg, &ps); i = (bmp_counter == 3) ? 1 : bmp_counter; BitBlt(hdc, 0, 0, bitmap[i].bmWidth, bitmap[i].bmHeight, hdcMem[i], 0, 0, SRCCOPY); EndPaint (hDlg, &ps); return TRUE; case WM_TIMER: if(wParam == TIMER_MOVE && RemoveCursor() == false) MoveRobo(hDlg); if (wParam == TIMER_BMP) { bmp_counter++; if(bmp_counter == 4) bmp_counter = 0; i = (bmp_counter == 3) ? 1 : bmp_counter; DeleteObject(hRgn); hRgn = ExtCreateRegion(NULL, (RgnData[i]->rdh.nCount)*sizeof(RECT) + sizeof(RGNDATAHEADER), RgnData[i]); SetWindowRgn(hDlg, hRgn, TRUE); InvalidateRect(hDlg, NULL, TRUE); } if(wParam == TIMER_RUSH && RemoveCursor() == true) Rush(hDlg); if (wParam == TIMER_ATTACK && RemoveCursor() == true && Rush(hDlg) == true) {} return TRUE; case WM_DESTROY: for(i = 0; i < 3; i++) { SelectObject(hdcMem[i], (HBITMAP)NULL); DeleteObject(hBitmap[i]); DeleteDC(hdcMem[i]); delete[] RgnData[i]; } PostQuitMessage (0) ; return TRUE; } return FALSE; } int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR, int) { hPubInst = hI; DialogBox(hI, MAKEINTRESOURCE(DLG_ROBO), 0, (DLGPROC)DlgProc); return 0; }
[ Dieser Beitrag wurde am 28.02.2003 um 21:41 Uhr von WebFritzi editiert. ]
-
re:
also erstmal vielen dank für die mühe und deinen einsatz !
aber ich muss leider gestehen, dass es bei mir immernoch probs gibt...
ich habs identisch umgeändert in deiner variante, aber er zeigt nur die erste sekunde die erste bitmap korrekt an, danach erscheint die Dialoge und innerhalb der Dlg werden alle 3 bitmaps überlappend angezeigt, also sprich es passiert gar nix mehr, ausser dass es sich bewegt...
also er fängt richtig an, aber sobald der nächste timertakt kommt, zeigt er alles von einmal an,
sieht so aus als würde er die regions dann gar nich mehr setzen...
oder besser gesagt er klatscht die 2 anderen bitmaps über die erste bitmap drüber, ohne aber vorher die Regions für die 2te und dritte bitmap auszuwählen
und zu setzen!also erstmal muss ich sagen, dass ich selber jetzt gar nix mehr testen kann, da
gewisse sachen komplett neu sind, wie zb. RGNDATA
oder die Schreibweise i = (bmp_counter == 3) ? 1 : bmp_counter; oder das
hRgn = ExtCreateRegion(NULL, RgnData[i]->rdh.nCount, RgnData[i]);dazu müsst ich mich erst reinarbeiten und massiv neue tuts lesen,
klar werde ich auch machen... aber es wäre für mich psychologisch befriedigender, wenn das prob mal vorübergehend beseitigt wäre...hmm, ich dachte bei dir gehts, also muss es bei mir auch gehen...
vielleicht gibt es unterschiede zwischen winXP und win2k ?? weiss ja nich was du fürn OS verwendest
weil ich hab mal das prog bei einem getestet, der hat winXP, und da kam ne windows-fehlermeldung beim starten, obwohls bei mir daheim astrein lief
(das wäre aber ein grund für mich nie wieder unter windows zu coden)
naja was meinst du dazu ?
mfg haMMer
[ Dieser Beitrag wurde am 28.02.2003 um 21:48 Uhr von Hammer editiert. ]
-
Ich hab Win98, glaube aber nicht, dass es an der Windoof-Version liegt. Zunächst mal habe ich noch nen Fehler gefunden bei mir. Aber leider wird das dein Problem nicht beheben. Egal, ich korrigiere ihn erstmal: In WM_TIMER bei wParam == TIMER_BMP müssen die drei letzten Zeilen lauten
hRgn = ExtCreateRegion(NULL, (RgnData[i]->rdh.nCount)*sizeof(RECT) + sizeof(RGNDATAHEADER), RgnData[i]); SetWindowRgn(hDlg, hRgn, TRUE); InvalidateRect(hDlg, NULL, TRUE);
So funzt es bei mir jedenfalls ganz gut. Ich hab das oben nochmal berichtigt. Damit dein Projekt genauso aussieht wie meines, solltest du vielleicht dein Resourcen-Skript nochmal ändern. Da habe ich ne Menge rausgenommen, so dass mein Resourcen-Compiler das überhaupt angenommen hat. Bei mir sieht das so aus:
[code]
// Die Header-Datei heißt Resource.rh
#ifndef RESOURCE_RH
#define RESOURCE_RH#define DLG_ROBO 103
#define BMP_ROBO1 104
#define BMP_ROBO2 105
#define BMP_ROBO3 106#endif
// Das Skript
#include "Resource.rh"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//DLG_ROBO DIALOGEX 0, 0, 122, 74
STYLE WS_POPUP
EXSTYLE WS_EX_TOOLWINDOW
CAPTION ""
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
FONT 8, "MS Sans Serif"
{
}/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//
BMP_ROBO1 BITMAP DISCARDABLE "roboter.bmp"
BMP_ROBO2 BITMAP DISCARDABLE "roboter2.bmp"
BMP_ROBO3 BITMAP DISCARDABLE "roboter3.bmp"
/////////////////////////////////////////////////////////////////////////////[/code]
Vielleicht bringt das was, wenn du deines änderst. Ach ja, und außerdem habe ich die Bitmaps so klein wie möglich gemacht. Alle haben jetzt die Größe 52x55. Das verringert den Zeitaufwand bei ScanRegion.Zu deinen Problemen mit den Funktionen:
1.) RGNDATA ist eine Struktur, die (wie der Name schon sagt) Daten für eine Region speichert. Wie das intern genau aussieht braucht dich nicht zu interessieren. Wichtig ist, dass die Regions in meiner Version binär im Speicher vorliegen - in Form von 3 RGNDATA-Strukturen. Das Problem war, dass die Regions nach einmaligem Benutzen wieder "weg waren", wie du ja selber mitbekommen hast. Also muss man sie vor der Benutzung wieder laden. Das kann man per ScanRegion machen, was aber viel zu lange dauert. Also habe ich das mit RGNDATA's gelöst. Am Anfang werden die Regionen gescannt und in danach in den RGNDATA-Strukturen gespeichert. Wenn man eine Region braucht (siehe in WM_TIMER), dann kann man sie einfach per ExtCreateRegion() aus der entsprechenden RGNDATA-Struktur erstellen.
-
diese Denkweise gefällt mir, mit dem abspeichern der regions in die RGNDATA's !
klar, weil mit ScanRegion() hab ichs auch schon hinbekommen, nur dann wirds ziemlich lahm das ganze...(ruckelt immer nach jedem Scan)hmm, ich probiers jetz nochmal mit meinem alten code, mit den if's und so...
hab jetz auch arrays verwendet, is besser... und jo, jetzt probier ichs selbst
nochmal mit RGNDATA.
Weil prinzipiell hat ja alles funktioniert bei mir, nur dass halt die Regions immer verloren gingen nach jedem SetWindowRgn()
Naja und wenn alle stricke reissen, dann nimm ich deinen code wieder !hätte nicht gedacht, dass dieses prog so viel wissen zur winapi benötigt !
krass...aber ich kann nur thx sagen, dass du mir da so viel hilfst
mfg haMMer
-
Klar helfe ich dir. Aber lass dir eins sagen: sooo schwer ist das nicht. Nur ein bisschen fummelig.
-
LOOL!!! jetz gehts! habs selber hingekriegt mit ExtCreateRegion
läuft astrein bei mir, ruckelt nix, gar nix...!DANKE DANKE DANKE !
----------------------------------Wenn wir jetz schon so tief in der thematik drin sind, kannst mir ev. noch
zeigen, wie man diese bitmap nach links rechts spiegeln kann...?
weil ich will noch in abhängigkeit, ob die maus links oder rechts vom robo steht, dass sich der robo dann immer den mauszeiger anguckt-> wieso findest du den Robo hässlich ? also die Form wollte ich auf jeden Fall
so lassen... er soll ja auch den cursor verschlucken können, deshalb der mund..
und naja n zweibeiner solls auch sein...
hey, das ding hab ich mit dem PaintProg unter zubehör gemalt :pmfg haMMer