begin process at 2012 05 30 17:06:26
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Graphique

 > 

Screenmate defectueux


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Screenmate defectueux

vendredi 25 avril 2003 à 17:17:20 | Screenmate defectueux

anthraxx

Anthrax ignisque -- Le charbon et le feu

J'essaye de faire un screenmate (une petite bestiole se promenant sur les fenetres), mais n'etant pas tres experimenté en C++ j'arrive pas a faire un truc qui se deplace correctement tout en etant animé!

En effet, mon animal (un gentil petit ver de terre) laisse une trainée noire derriere lui après être passé!

C'est la faute de SetWindowPos: j'ai mis le flag SWP_NOREDRAW. Seulement, si je le mets pas, des evenements WM_PAINT arrivent en cascade et rien ne marche plus!
j'ai essaye de ne pas appeler SetWindowPos depuis l'evenement WM_PAINT, seulement depuis WM_TIMER, mais ça ne marche pas non plus (le ver clignote sans arret...)

Aidez-moi!!! Je suis sur que comme ce code est entierement made by moi il y a plein de choses qui peuvent

être ameliorees, en plus bien sur de mon probleme d'effaçage.

Le code entier est bcp trop long, mais voici les morceaux mis en cause...


LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc; // device context (DC) for window
PAINTSTRUCT ps; // paint data for BeginPaint and EndPaint
static bool mouseDown; // true si on est en train de bouger l'animal (un ver)
static int mouseX,mouseY; // position de la souris (coordonnees relatives à la fenetre)

switch (uMsg)
{
case WM_CREATE:
{
hdc=GetDC(hwnd); // obtient le hdc de la fenetre
hdcWorm = CreateCompatibleDC(hdc); // cree un hdc pour l'image du ver
DrawWorm(hwnd,hdc); // dessine le ver une premiere fois
ReleaseDC(hwnd,hdc);

UINT ret = SetTimer(hwnd, TIMER_ID, 50, NULL); //TIMER_ID est #defini =1
if(!ret) MessageBox(hwnd,"Could not SetTimer()!","Error",MB_OK|MB_ICONEXCLAMATION);
break;
}

case WM_TIMER:
hdc = GetDC(hwnd);
UpdateWorms(hwnd, hdc); // on deplace le ver et change l'image (il est animé!)
DrawWorm(hwnd, hdc); // puis on le dessine
ReleaseDC(hwnd, hdc);
break;

case WM_LBUTTONDBLCLK:
PostMessage(hwnd, WM_CLOSE, 0, 0); // ferme le programme qd on doubleclique
break;

case WM_PAINT:
hdc=BeginPaint(hwnd, &ps);
DrawWorm(hwnd,hdc); // dessine l'animal sans le Updater
EndPaint(hwnd, &ps);
break;

case WM_LBUTTONDOWN:
ReleaseCapture();
SetCapture(hwnd);
mouseDown=true;
mouseX=LOWORD(lParam);
mouseY=HIWORD(lParam);
break;

case WM_MOUSEMOVE:
if(mouseDown)
{
POINT pt={LOWORD(lParam),HIWORD(lParam)};
ClientToScreen(hwnd,&pt);
wWorm.x=pt.x-mouseX;
wWorm.y=pt.y-mouseY;
}
break;

case WM_LBUTTONUP:
mouseDown=false;
ReleaseCapture();
break;

case WM_DESTROY:
PostQuitMessage(0);
break;

case WM_CLOSE:
DeleteDC(hdcWorm);
DeleteObject(hBmpWorm);
DeleteObject(hWormRgn);
KillTimer(hwnd,TIMER_ID);
return DefWindowProc(hwnd, uMsg, wParam, lParam);

default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return (LRESULT) NULL;
}

void UpdateWorms(HWND hwnd,HDC hdc)
{
// ... ici du code qui change wWorm.x et y, et verifie si on est pas au bout de l'ecran
// ... ici du on modifie wWorm.frame pour avoir la ressource d'image souhaitée
SetWormImage(hwnd,hdc,MAKEINTRESOURCE(wWorm.frame));
}

void DrawWorm(HWND hwnd, HDC hdc)
{
SetWindowPos(hwnd,HWND_TOPMOST,wWorm.x,wWorm.y,wWorm.width,wWorm.height,SWP_NOREDRAW);
//NOREDRAW sinon on a des evenements WM_PAINT en cascade qui s'arretent pas
BitBlt(hdc,0,0,wWorm.width,wWorm.height,hdcWorm,0,0,SRCCOPY);
}

void SetWormImage(HWND hwnd, HDC hdc, LPCSTR resnumber)
{
// je sais pas trop a kwa sa sert, j'ai mis cette instruction pr essayer
// il se trouve que ça marche un peu mieux
// (le ver laisse une trainée noire au lieu d'une trainée colorée)...
SendMessage(hwnd,WM_ERASEBKGND,(WPARAM)hdc,NULL);

DeleteObject(hWormBmp);
hWormBmp = LoadBitmap(hInst, resnumber);
SelectObject(hdcWorm, hWormBmp); //copie le bitmap dans le device context

hWormRgn=BmpToRgn(hWormBmp,&wWorm.width,&wWorm.height,0); // change la region a partir du bitmap
// (les points noirs (d'ou le 0) deviennent transparents)
SetWindowRgn(hwnd,hWormRgn,FALSE);
}
vendredi 25 avril 2003 à 18:55:54 | Re : Screenmate defectueux

BruNews

Administrateur CodeS-SourceS
Salut,
c'est un bon début mais je pense que tu te focalises sur la résolution de ta méthode. Le prob est que c'est elle qu'il faut changer et non le code à améliorer. Le mouvement sans clignotement a besoin d'une autre approche.
Comme serait trop long à expliquer, tu vas voir:
ABOUTBOX SINUSOIDE
tu suis bien le deroulement du code pour voir les étapes des BitBlt() et autres. Devrait faire ton affaire.
BruNews, ciao...


-------------------------------
Réponse au message :
-------------------------------

> Anthrax ignisque -- Le charbon et le feu
>
> J'essaye de faire un screenmate (une petite bestiole se promenant sur les fenetres), mais n'etant pas tres experimenté en C++ j'arrive pas a faire un truc qui se deplace correctement tout en etant animé!
>
> En effet, mon animal (un gentil petit ver de terre) laisse une trainée noire derriere lui après être passé!
>
> C'est la faute de SetWindowPos: j'ai mis le flag SWP_NOREDRAW. Seulement, si je le mets pas, des evenements WM_PAINT arrivent en cascade et rien ne marche plus!
> j'ai essaye de ne pas appeler SetWindowPos depuis l'evenement WM_PAINT, seulement depuis WM_TIMER, mais ça ne marche pas non plus (le ver clignote sans arret...)
>
> Aidez-moi!!! Je suis sur que comme ce code est entierement made by moi il y a plein de choses qui peuvent
>
> être ameliorees, en plus bien sur de mon probleme d'effaçage.
>
> Le code entier est bcp trop long, mais voici les morceaux mis en cause...
>
>
> LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
> {
> HDC hdc; // device context (DC) for window
> PAINTSTRUCT ps; // paint data for BeginPaint and EndPaint
> static bool mouseDown; // true si on est en train de bouger l'animal (un ver)
> static int mouseX,mouseY; // position de la souris (coordonnees relatives à la fenetre)
>
> switch (uMsg)
> {
> case WM_CREATE:
> {
> hdc=GetDC(hwnd); // obtient le hdc de la fenetre
> hdcWorm = CreateCompatibleDC(hdc); // cree un hdc pour l'image du ver
> DrawWorm(hwnd,hdc); // dessine le ver une premiere fois
> ReleaseDC(hwnd,hdc);
>
> UINT ret = SetTimer(hwnd, TIMER_ID, 50, NULL); //TIMER_ID est #defini =1
> if(!ret) MessageBox(hwnd,"Could not SetTimer()!","Error",MB_OK|MB_ICONEXCLAMATION);
> break;
> }
>
> case WM_TIMER:
> hdc = GetDC(hwnd);
> UpdateWorms(hwnd, hdc); // on deplace le ver et change l'image (il est animé!)
> DrawWorm(hwnd, hdc); // puis on le dessine
> ReleaseDC(hwnd, hdc);
> break;
>
> case WM_LBUTTONDBLCLK:
> PostMessage(hwnd, WM_CLOSE, 0, 0); // ferme le programme qd on doubleclique
> break;
>
> case WM_PAINT:
> hdc=BeginPaint(hwnd, &ps);
> DrawWorm(hwnd,hdc); // dessine l'animal sans le Updater
> EndPaint(hwnd, &ps);
> break;
>
> case WM_LBUTTONDOWN:
> ReleaseCapture();
> SetCapture(hwnd);
> mouseDown=true;
> mouseX=LOWORD(lParam);
> mouseY=HIWORD(lParam);
> break;
>
> case WM_MOUSEMOVE:
> if(mouseDown)
> {
> POINT pt={LOWORD(lParam),HIWORD(lParam)};
> ClientToScreen(hwnd,&pt);
> wWorm.x=pt.x-mouseX;
> wWorm.y=pt.y-mouseY;
> }
> break;
>
> case WM_LBUTTONUP:
> mouseDown=false;
> ReleaseCapture();
> break;
>
> case WM_DESTROY:
> PostQuitMessage(0);
> break;
>
> case WM_CLOSE:
> DeleteDC(hdcWorm);
> DeleteObject(hBmpWorm);
> DeleteObject(hWormRgn);
> KillTimer(hwnd,TIMER_ID);
> return DefWindowProc(hwnd, uMsg, wParam, lParam);
>
> default:
> return DefWindowProc(hwnd, uMsg, wParam, lParam);
> }
> return (LRESULT) NULL;
> }
>
> void UpdateWorms(HWND hwnd,HDC hdc)
> {
> // ... ici du code qui change wWorm.x et y, et verifie si on est pas au bout de l'ecran
> // ... ici du on modifie wWorm.frame pour avoir la ressource d'image souhaitée
> SetWormImage(hwnd,hdc,MAKEINTRESOURCE(wWorm.frame));
> }
>
> void DrawWorm(HWND hwnd, HDC hdc)
> {
> SetWindowPos(hwnd,HWND_TOPMOST,wWorm.x,wWorm.y,wWorm.width,wWorm.height,SWP_NOREDRAW);
> //NOREDRAW sinon on a des evenements WM_PAINT en cascade qui s'arretent pas
> BitBlt(hdc,0,0,wWorm.width,wWorm.height,hdcWorm,0,0,SRCCOPY);
> }
>
> void SetWormImage(HWND hwnd, HDC hdc, LPCSTR resnumber)
> {
> // je sais pas trop a kwa sa sert, j'ai mis cette instruction pr essayer
> // il se trouve que ça marche un peu mieux
> // (le ver laisse une trainée noire au lieu d'une trainée colorée)...
> SendMessage(hwnd,WM_ERASEBKGND,(WPARAM)hdc,NULL);
>
> DeleteObject(hWormBmp);
> hWormBmp = LoadBitmap(hInst, resnumber);
> SelectObject(hdcWorm, hWormBmp); //copie le bitmap dans le device context
>
> hWormRgn=BmpToRgn(hWormBmp,&wWorm.width,&wWorm.height,0); // change la region a partir du bitmap
> // (les points noirs (d'ou le 0) deviennent transparents)
> SetWindowRgn(hwnd,hWormRgn,FALSE);
> }
dimanche 27 avril 2003 à 13:08:33 | Re : Screenmate defectueux

anthraxx


Anthrax ignisque -- Le charbon et le feu


-------------------------------
Réponse au message :
-------------------------------

> Salut,
> c'est un bon début mais je pense que tu te focalises sur la résolution de ta méthode. Le prob est que c'est elle qu'il faut changer et non le code à améliorer. Le mouvement sans clignotement a besoin d'une autre approche.
> Comme serait trop long à expliquer, tu vas voir:
> ABOUTBOX SINUSOIDE
> tu suis bien le deroulement du code pour voir les étapes des BitBlt() et autres. Devrait faire ton affaire.
> BruNews, ciao...

Hello, BruNews j'ai regardé ton code, il est super mais franchement il ne m'a pas beaucoup aidé.
Je ne pense pas que le probleme soit dans les BitBlt, mais plutot dans le processus d'effacer/deplacer/changer d'image/changer de region/redessiner, ça doit être la qu'il y a quelque chose qui cloche a mon avis...

Je suis toujours pret à entendre des conseils & des critiques constructives sur le code que G posté... Sa m'aiderait beaucoup!
salut --- Anthraxx


Cette discussion est classée dans : case, wm, hwnd, hdc, wworm


Répondre à ce message

Sujets en rapport avec ce message

Une fenetre animee transparente [ par anthraxx ] Anthrax ignisque -- Le charbon et le feu C la seconde foi ke je poste sur ce sujet, mais j'ai un autre probleme. En gros: j'ai une fenetre transparent Problème avec WM_KEYDOWN: [ par cognac ] Pourquoi est-ce que "j" est toujours égal à 2 lorsque je presse F1(même la première fois). Je pensais qu'à chaque fois que je presse F1 "j" augmente d CreateWindowEx [ par Galmiza ] Salut,J'ai fait une application en plein ecran en utilisant la fonction CreateWindowEx et directX. (pour l'instant j'ai desactivé les textures)L'appui Affichage bitmap [ par gregory6 ] GringoBonjour, je suis débutant ss visual C++ et j'aurai besoin d'un peu d'aide. Je crée un projet MFC ds lequel je crée une fenetre. Cette fenetre cr Decalement de 3 pixel dans le HDC [ par SnOOpss ] Bonjour !!! Pourquoi si je fait :     case WM_PAINT:         {     RECT rt;     PAINTSTRUCT ps;     HDC hdc = BeginPaint(GetParent(hwnd), &a Effacer les graphiques avec InvalidateRect !? [ par Suisse00 ] Dans plusieurs source je voie qu'il utilise InvalidateRect  pour "effacer". Mais dans mon cas sa fait en sorte que je recois toujours WM_PAINT (et don Open Gl pépin [ par DarkNavius ] Chères personnes lisant mon message d'appel à l'aide.J'ai besoin d'aide au sujet d'un programme en opengl que j'ai construit en copiant et collant que richedit bloquer la modification d'un document [ par babyboo1107 ] Bonjour j'aimerais savoir comment faire pour lorsque je fais fermer le document il me met une fenetre gisée(ca j'ai trouver) mais ou il ne soit pas po Récupérer les événements sur une frame dans C++ via JNI [ par PleoX ] Bonjour,(J'espère avoir mis mon sujet dans le bon thème. J'ai pas trouvé de thème plus aproprié.)Je suis en train de créer une application multi-touch Déplacement d'image BMP avec Win APi [ par hiroko ] En esperant etre dans la bonne catégorie...Voilà mon problème, je dois créer un Snake en C avec Win APIEt j'ai des gros problème d'affichage.Je cherch


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,967 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales