amiga-virus nachprogrammieren ;-)
-
....
....
ihr beiden scheint guten plan zu haben mit den winapi funktionen ..!kann mir von euch jemand seine icq nummer geben, oder sagen, in welchem irc channel er sich öfters aufhält, sofern vorhanden.. ?
wäre net echt net mich etwas mit einem erfahrenen zu unterhalten..
mir fehlt halt der überblick über die fktnen. , bzw. viele kenn ich noch gar net und ich weiss net wo ich nachschauen soll...ich weiss ich bin zu gierig :), hab erst vor 8 wochen mit c/c++ angefangen, und hab schon n winsocket-consolen chatprog erstellt...
jetz will ich mir winapi geben und unbedingt meinen traum erfüllen, den ich schon seit 3 jahren hatte... den desktop-roboter, der die maus verschluckt !danach steig ich um auf libSDLlets rock!
mfg haMMer
-
Original erstellt von Hammer:
**was genau sind dialoges und regions im vergleich zu fenstern ??
und warum werden die hier verwendet im code ?
**Also, erstmal heißt das "Dialoge". Ein Dialog ist ein Fenster. Mehr nicht. Man kann aber ein solches Fenster in einer Resource ganz einfach erstellen. Zum Beispiel:
//////////////////////////////////////////////// //// About Dialog //// //////////////////////////////////////////////// ID_DLG_ABOUT DIALOG 0, 0, 164, 94 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "About Metronomania" LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL FONT 8, "MS Sans Serif" { CONTROL "" , ID_WND_STC_IMG , STATIC, WS_CHILD | WS_VISIBLE | SS_ICON , 10, 18, 21, 20 CONTROL "Metronomania" , ID_WND_STC_TITLE, STATIC, WS_CHILD | WS_VISIBLE | SS_LEFT , 46, 9, 129, 16 CONTROL "Böna Company 2000 - 2002", ID_WND_STC_BOENA, STATIC, WS_CHILD | WS_VISIBLE | SS_LEFT , 49, 32, 92, 10 CONTROL "FritzPhilipp@web.de" , ID_WND_STC_MAIL , STATIC, WS_CHILD | WS_VISIBLE | SS_LEFT | SS_NOTIFY, 49, 48, 69, 10 CONTROL "OK" , ID_WND_BUT_OK , BUTTON, WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON , 57, 67, 53, 16 }
Ebenso einfach kann man z.B. Menus erstellen. Wegen dieser Einfachheit benutzen viele Dialoge, anstatt CreateWindow() zu benutzen.
ausserdem wundert mich noch, dass para keine getmessage-schleife in der WinMain verwendet ... ? wie funktioniert das da dann ? ich mein irgendwo müssen doch die messages eingefangen werden die das os zum programm sendet ...
Recht hast du! Das ist auch eine Eigenheit von Dialogen. Man benutzt einfach DialogBox() und gibt dort im letzten Parameter die DLGPROC (entspricht der WINDOWPROC bei Fenstern) an. In der angegebenen DLGPROC werden dann die Messages verarbeitet, die an den Dialog gehen.
wäre dankbar wenn einer den code vonn para etwas erklären könnte zum thema messages einfangen und regions und dialoges...
Nö, hab ich jetzt keine Lust zu. Ich kann dir noch schnell was zu Regions sagen. Du kannst dir eine Region vorstellen wie einen Bereich, in dem einige Punkte enthalten sind und andere nicht. Also irgendeine beliebige Form. Eine solche Form kannst du jetzt per SetWindowRgn() deinem Fenster zuweisen. Die Form wird dann sozusagen über das Fenster "gestülpt", und nur da, wo die Form über dem Fenster liegt, wird das Fenster auch gezeichnet. Alles andere gehört dann nicht mehr zum Fenster. Ja, so ist das.
-
Original erstellt von paranoiac.org:
Ich meinte damit nur, das es Unsinn ist, wenn man doch nur testen will, extra ein Programm zu benutzen welches 5 min länger braucht um das Ding zu speichern aber dann bei der Anwendung ein paar Sekunden schneller läuft.5 Minuten???
Ich wähne, du kennst das Programm wirklich nicht. Naja - zumindest nicht gut. OK, wir gehen das ganze mal durch. Also, du willst plötzlich ein neues Bmp für dein Window haben - und damit auch eine neue Region. OK, du änderst also erstmal den Namen des Bmps in der Resource. Soweit, so gut. Wir gehen mal von einem komplizierten BMP aus. Wenn du jetzt immer wieder im Programm deine Funktionen darüber laufen lässt, dauert das superlange! Was spricht nun dagegen, einmal den RegionBuilder anzuschmeißen und die Routine (die schneller ist als die in deinem Proggi) darüber laufen zu lassen? Dann bist du fertig. Den Namen der RGNDATA-Resourcendatei hast du doch in deinem Resourcenscript. Die wurde vom RegionBuilder schnell geändert. Alles, was jetzt in der Vorbereitung länger dauert, sind ein paar Klicks - einmal RegionBuilder öffnen (am besten, du hast ihn bei sowas die ganze Zeit geöffnet), einmal die BMP-Datei öffnen, einmal Region generieren (wie gesagt - schneller als in deinem Code) und einmal speichern. Das war's. Höchstens ne halbe Minute! Und: du bist das Warten in deinem Programm los.
P.S.: Sorry, dass ich nochmal darauf rumreiten musste. Aber ich muss doch mein Programm verteidigen.
-
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.