begin process at 2012 05 27 18:32:21
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > LOUPE SIMPLE (WIN32)

LOUPE SIMPLE (WIN32)


 Information sur la source

Note :
9 / 10 - par 5 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Niveau :Débutant Date de création :12/06/2004 Date de mise à jour :12/06/2004 00:39:13 Vu / téléchargé :6 205 / 756

Auteur : ymca2003

Ecrire un message privé
Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

 Description

Suite à une question du forum j'ai fait cette petite loupe qui affiche la zone sous la souris avec un facteur 2. Un timer raffraichit la loupe toutes les 50ms.

Source

  • //***************************************************************************************
  • // Loupe.cpp :
  • //
  • //***************************************************************************************
  • #include <windows.h>
  • //=======================================================================================
  • // Variables globales.
  • //=======================================================================================
  • HINSTANCE g_hAppInstance = NULL; // instance de l'application
  • HWND g_hWndMainFrame = NULL; // fenêtre principale de l'application
  • //=======================================================================================
  • // Fonctions du module.
  • //=======================================================================================
  • BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
  • LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  • //***************************************************************************************
  • // WinMain :
  • //***************************************************************************************
  • int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
  • int nCmdShow)
  • {
  • // initialisation de l'application
  • if(!InitInstance(hInstance, nCmdShow))
  • return 0;
  • // boucle de messages
  • MSG msg;
  • while(GetMessage(&msg, NULL, 0, 0))
  • {
  • TranslateMessage(&msg);
  • DispatchMessage(&msg);
  • }
  • return msg.wParam;
  • }
  • //***************************************************************************************
  • // InitInstance :
  • //***************************************************************************************
  • BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  • {
  • // sauvegarde instance de l'application
  • g_hAppInstance = hInstance;
  • char szWndClass[] = "LoupeWnd";
  • char szWndTitle[] = "Loupe";
  • // initialisation classe de fenêtre
  • WNDCLASS wc;
  • ZeroMemory(&wc, sizeof(WNDCLASS));
  • wc.hInstance = g_hAppInstance;
  • wc.lpfnWndProc = WndProc;
  • wc.lpszClassName = szWndClass;
  • wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  • wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  • wc.style = CS_HREDRAW|CS_VREDRAW;
  • if(!RegisterClass(&wc))
  • return FALSE;
  • // création de la fenêtre principale
  • g_hWndMainFrame = CreateWindowEx(WS_EX_TOPMOST, szWndClass, szWndTitle,
  • WS_OVERLAPPED|WS_CAPTION|WS_THICKFRAME|WS_SYSMENU|WS_MINIMIZEBOX,
  • 0, 0, 200, 200, NULL, NULL, g_hAppInstance, NULL);
  • if(g_hWndMainFrame == NULL)
  • return FALSE;
  • // affichage et mise à jour
  • ShowWindow(g_hWndMainFrame, nCmdShow);
  • UpdateWindow(g_hWndMainFrame);
  • return TRUE;
  • }
  • //***************************************************************************************
  • // WndProc :
  • //***************************************************************************************
  • LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  • {
  • // en fonction du message
  • switch(uMsg)
  • {
  • case WM_CREATE :
  • {
  • // création timer
  • SetTimer(hWnd, 0x100, 50, NULL);
  • return 0;
  • }
  • case WM_DESTROY :
  • {
  • // suppression du timer, fin de l'application
  • KillTimer(hWnd, 0x100);
  • PostQuitMessage(0);
  • return 0;
  • }
  • case WM_TIMER :
  • {
  • // mise à jour de la fenêtre
  • InvalidateRect(hWnd, NULL, FALSE);
  • UpdateWindow(hWnd);
  • return 0;
  • }
  • case WM_PAINT :
  • {
  • // début du dessin
  • PAINTSTRUCT ps;
  • HDC hdc = BeginPaint(hWnd, &ps);
  • // taille zone cliente
  • RECT rcClient;
  • GetClientRect(hWnd, &rcClient);
  • SIZE sizeDst;
  • sizeDst.cx = rcClient.right-rcClient.left;
  • sizeDst.cy = rcClient.bottom-rcClient.top;
  • // création DC et bitmap en mémoire
  • HDC hMemDC = CreateCompatibleDC(hdc);
  • HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, sizeDst.cx, sizeDst.cy);
  • HBITMAP hOldMemBmp = (HBITMAP) SelectObject(hMemDC, hMemBmp);
  • // effacement du fond en blanc
  • HBRUSH hBrush = CreateSolidBrush(RGB(0xFF, 0xFF, 0xFF));
  • FillRect(hMemDC, &rcClient, hBrush);
  • DeleteObject(hBrush);
  • // position de la souris et de la fenêtre
  • POINT ptMouse;
  • GetCursorPos(&ptMouse);
  • RECT rcWnd;
  • GetWindowRect(hWnd, &rcWnd);
  • // faire un zoom de la zone sous la souris
  • if(!PtInRect(&rcWnd, ptMouse))
  • {
  • // zone source
  • SIZE sizeSrc;
  • sizeSrc.cx = sizeDst.cx/2;
  • sizeSrc.cy = sizeDst.cy/2;
  • RECT rcSrc;
  • rcSrc.left = ptMouse.x-sizeSrc.cx/2;
  • rcSrc.top = ptMouse.y-sizeSrc.cy/2;
  • rcSrc.right = rcSrc.left+sizeSrc.cx;
  • rcSrc.bottom = rcSrc.top+sizeSrc.cy;
  • // récupération DC de l'écran et recopie
  • HDC hScreenDC = GetDC(NULL);
  • StretchBlt(hMemDC, 0, 0, sizeDst.cx, sizeDst.cy, hScreenDC,
  • rcSrc.left, rcSrc.top, sizeSrc.cx, sizeSrc.cy, SRCCOPY);
  • ReleaseDC(NULL, hScreenDC);
  • }
  • // recopie du DC en mémoire, libération des ressources
  • BitBlt(hdc, 0, 0, sizeDst.cx, sizeDst.cy, hMemDC, 0, 0, SRCCOPY);
  • SelectObject(hMemDC, hOldMemBmp);
  • DeleteObject(hMemBmp);
  • DeleteDC(hMemDC);
  • // fin du dessin
  • EndPaint(hWnd, &ps);
  • return 0;
  • }
  • }
  • // traitement par défaut
  • return DefWindowProc(hWnd, uMsg, wParam, lParam);
  • }
//***************************************************************************************
// Loupe.cpp :
//
//***************************************************************************************

#include <windows.h>

//=======================================================================================
// Variables globales.
//=======================================================================================
HINSTANCE	g_hAppInstance	= NULL;	// instance de l'application
HWND		g_hWndMainFrame	= NULL;	// fenêtre principale de l'application

//=======================================================================================
// Fonctions du module.
//=======================================================================================
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);


//***************************************************************************************
// WinMain :
//***************************************************************************************
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
				   int nCmdShow)
{
	// initialisation de l'application
	if(!InitInstance(hInstance, nCmdShow))
		return 0;

	// boucle de messages
	MSG msg;
	while(GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

//***************************************************************************************
// InitInstance :
//***************************************************************************************
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	// sauvegarde instance de l'application
	g_hAppInstance = hInstance;
	char szWndClass[] = "LoupeWnd";
	char szWndTitle[] = "Loupe";

	// initialisation classe de fenêtre
	WNDCLASS wc;
	ZeroMemory(&wc, sizeof(WNDCLASS));
	wc.hInstance		= g_hAppInstance;
	wc.lpfnWndProc		= WndProc;
	wc.lpszClassName	= szWndClass;
	wc.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);
	wc.style			= CS_HREDRAW|CS_VREDRAW;
	if(!RegisterClass(&wc))
		return FALSE;

	// création de la fenêtre principale
	g_hWndMainFrame = CreateWindowEx(WS_EX_TOPMOST, szWndClass, szWndTitle,
			WS_OVERLAPPED|WS_CAPTION|WS_THICKFRAME|WS_SYSMENU|WS_MINIMIZEBOX,
			0, 0, 200, 200, NULL, NULL, g_hAppInstance, NULL);
	if(g_hWndMainFrame == NULL)
		return FALSE;

	// affichage et mise à jour
	ShowWindow(g_hWndMainFrame, nCmdShow);
	UpdateWindow(g_hWndMainFrame);
	return TRUE;
}

//***************************************************************************************
// WndProc :
//***************************************************************************************
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	// en fonction du message
	switch(uMsg)
	{
	case WM_CREATE :
		{
			// création timer
			SetTimer(hWnd, 0x100, 50, NULL);
			return 0;
		}
	case WM_DESTROY :
		{
			// suppression du timer, fin de l'application
			KillTimer(hWnd, 0x100);
			PostQuitMessage(0);
			return 0;
		}
	case WM_TIMER :
		{
			// mise à jour de la fenêtre
			InvalidateRect(hWnd, NULL, FALSE);
			UpdateWindow(hWnd);
			return 0;
		}
	case WM_PAINT :
		{
			// début du dessin
			PAINTSTRUCT ps;
			HDC hdc = BeginPaint(hWnd, &ps);

			// taille zone cliente
			RECT rcClient;
			GetClientRect(hWnd, &rcClient);
			SIZE sizeDst;
			sizeDst.cx = rcClient.right-rcClient.left;
			sizeDst.cy = rcClient.bottom-rcClient.top;

			// création DC et bitmap en mémoire
			HDC hMemDC = CreateCompatibleDC(hdc);
			HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, sizeDst.cx, sizeDst.cy);
			HBITMAP hOldMemBmp = (HBITMAP) SelectObject(hMemDC, hMemBmp);

			// effacement du fond en blanc
			HBRUSH hBrush = CreateSolidBrush(RGB(0xFF, 0xFF, 0xFF));
			FillRect(hMemDC, &rcClient, hBrush);
			DeleteObject(hBrush);

			// position de la souris et de la fenêtre
			POINT ptMouse;
			GetCursorPos(&ptMouse);
			RECT rcWnd;
			GetWindowRect(hWnd, &rcWnd);

			// faire un zoom de la zone sous la souris
			if(!PtInRect(&rcWnd, ptMouse))
			{
				// zone source
				SIZE sizeSrc;
				sizeSrc.cx = sizeDst.cx/2;
				sizeSrc.cy = sizeDst.cy/2;
				RECT rcSrc;
				rcSrc.left		= ptMouse.x-sizeSrc.cx/2;
				rcSrc.top		= ptMouse.y-sizeSrc.cy/2;
				rcSrc.right		= rcSrc.left+sizeSrc.cx;
				rcSrc.bottom	= rcSrc.top+sizeSrc.cy;

				// récupération DC de l'écran et recopie
				HDC hScreenDC = GetDC(NULL);
				StretchBlt(hMemDC, 0, 0, sizeDst.cx, sizeDst.cy, hScreenDC,
						rcSrc.left, rcSrc.top, sizeSrc.cx, sizeSrc.cy, SRCCOPY);
				ReleaseDC(NULL, hScreenDC);
			}
			
			// recopie du DC en mémoire, libération des ressources
			BitBlt(hdc, 0, 0, sizeDst.cx, sizeDst.cy, hMemDC, 0, 0, SRCCOPY);
			SelectObject(hMemDC, hOldMemBmp);
			DeleteObject(hMemBmp);
			DeleteDC(hMemDC);

			// fin du dessin
			EndPaint(hWnd, &ps);
			return 0;
		}
	}

	// traitement par défaut
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture SPLITTER API WIN32
Source avec Zip Source avec une capture UTILISATION DE LA LIB SHLWAPI.DLL (FONCTIONS DIVERSES SUR LE...
Source avec Zip Source avec une capture WIN32ACTIVEX : CONTENEUR DE CONTRÔLES ACTIVEX EN WIN32 (API ...
Source avec Zip Source avec une capture UTILISATION SPLITTER AVEC MFC
Source avec Zip Source avec une capture EXTRACTION DES ICONES DES EXÉCUTABLES (.EXE, .DLL), (VC++, W...

 Sources de la même categorie

Source avec Zip Source avec une capture PLANNING D'EQUIPE par grephit
Source avec Zip APPLICATION DE DESSIN DE QUELQUES FIGURES par laguchori
Source avec Zip Source avec une capture HDR EXPOSURE FUSION par mecrosoft
Source avec Zip Source avec une capture IRC CLIENT MULTISERVEUR EN MFC (TXIRC) par TeniX
Source avec Zip ENTETE DU FICHIER BMP (BIPMAP) par k.Lutchi

Commentaires et avis

Commentaire de neo_00110010101 le 12/06/2004 11:14:06

et bien que dire à part que cela marche ? ^^
(je suis en train de regarder ce que j'écris ici avec ta loupe en même temps c'est sympa :])

en fait pour les améliorations :

- possibilté de voir le pointeur de la souris (on voit celui quand on clique sur la roulette mais pas la flèche habituelle)
- quand on se dirige vers un coin, ta loupe nous affiche ce coin mais avec du blanc autour alors que normalement, après ce coin il n'y a rien (j'espere que tu as compris :S)

Mais j'ai bien aimé le fait que la fenêtre ne disparaisse pas !
et pour une loupe c'est une super loupe !
Si tu veux fais en sorte qu'on puisse choisir le grossissement :)

Commentaire de Vamps le 12/06/2004 16:38:50

Je trouve cela très bien :), la je le lance avec wine sous Linux et sa marche tres bien :)

Commentaire de Kirua le 13/06/2004 00:51:30

super chouette :)
n'affiche surtout pas le curseur ds la zone zoomée, sinon on verra rien, c'est très bien comme ça!

pr un zomm x4, faut juste mettre la fenetre de zomm à côté de la zone à SuperZoomer. Comme la souris est assez proche de la fenetre, une partie de la fenetre sera rezoomée, et donc on obtient un x4 ^^

Commentaire de neo_00110010101 le 13/06/2004 08:59:23

marrante ton idée de zoom x4 ^^
En fait la loupe d'XP affiche bien le curseur mais bon, la zone zoomée et très grande !

Commentaire de NeoUmbrella le 10/01/2005 22:21:37

Tres bonne source, bien présentée.
Un bon exemple pour les débutants.

Merci

NeoUmbrella Corp.

Commentaire de Ombitious_Developper le 15/12/2005 17:44:01

Votre source est excellente.

Commentaire de pnb666 le 26/04/2006 16:26:31

je suis peut etre exigent mais serai til possible ke la fenetre de la loupe reste center sur le curseur de la souris ?
comme le plugin de firefox image zoom http://imagezoom.yellowgorilla.net/
merci ! :p

Commentaire de Ombitious_Developper le 27/04/2006 15:58:04

Salut :

Pouvez vous m'aidez à convertir votre source en MFC.

Et Merci ...

Commentaire de maladedede le 04/08/2006 22:59:42

Tré bonne source pour une fois que je comprend tout dans une source windows :)

Et non pas de FMC !!!! lol

Commentaire de julien_boss le 25/05/2007 22:34:07

Bonjour,

je peux savoir à quoi servent ces lignes, stp :

// création DC et bitmap en mémoire
HDC hMemDC = CreateCompatibleDC(hdc);
HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, sizeDst.cx, sizeDst.cy);
HBITMAP hOldMemBmp = (HBITMAP) SelectObject(hMemDC, hMemBmp);  //Celle ci

// recopie du DC en mémoire, libération des ressources
BitBlt(hdc, 0, 0, sizeDst.cx, sizeDst.cy, hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hOldMemBmp);   // Et celle ci

Merci ;)

Commentaire de Ombitious_Developper le 25/05/2007 23:05:39

Salut:

Dans la programmation Windows, tu ne peux pas afficher une image directement sur une fenêtre, tu dois passer par une image qui se trouve en mémoire. Les deux premières lignes font ça:

Création d'un contexte d'affichage en mémoire compatible avec celui de la fenêtre.
Création d'une image compatible avec le contexte d'affichage de la fenêtre.

Dans la toisième ligne tu séléctionne ce bitmap dans le hMemDC et ça retourne le bitmap par défaut que tu enregistre dans une variable pour le restaurer après avoir finir le dessin, sinon tu auras une fuite de mémoire [memory leak].

Le 4eme ligne contient la fameuse fonction BitBlt (notament la plus heureuse) qui effectue des transferts de bloques de bits de la mémoire vers la fenêtre pour dessiner l'image en question.
SRCCOPY veut dire transfert sans modification.

La dernière ligne est déja expliquée elle fait retourner le HBITMAP par défaut du hMemDC.

J'espère que ça t'aides au moins.

Bye.  

Commentaire de Ombitious_Developper le 25/05/2007 23:06:45

Salut:

C'est la philosophie de Windows, c'est tout.

Commentaire de julien_boss le 26/05/2007 13:17:05

Ah ok je ne savais pas que (HBITMAP) SelectObject(hMemDC, hMemBmp);  retournait le bitamp "par défaut". Je comprends mieux merci. Je vais donc réintégrer ces lignes à ma source pour être tout à fait propre ^^

Commentaire de julien_boss le 26/05/2007 13:22:36

Euh enfaite je ne comprends pas :
si on souhaite restaurer le bitmap "par défaut", pourquoi ne pas le restaurer dans le DC "par défaut" ; pourquoi ca : SelectObject(hMemDC, hOldMemBmp); et non SelectObject(hdc, hOldMemBmp);
?

 Ajouter un commentaire




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,359 sec (4)

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