Api windows - deplacer un controle sur une page a l'aide de la souris (wndclassex)

Description

Voici un exemple d'utilisation de l'API Windows qui créé une fenêtre et teste le déplacement d'un contrôle sur la fenêtre.
Le pointeur de la souris permet de déplacer le contrôle.
Pour l'exemple, c'est un STATIC qui contient une image qui est déplacé.

Source / Exemple :


#define INITX 0
#define INITY 0
#define LARGEUR 800
#define HAUTEUR 600
#define ID_STATIC 500

#include <windows.h>

HINSTANCE _instance ;
BITMAP infosImage ;
HWND mainHWnd, hwndStatic ;
RECT dimensionsBitmap ;

LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain(HINSTANCE FirstInstance, HINSTANCE PrevInstance, LPSTR CmdLine, int nCmdShow)
{
	MSG msg ;
	WNDCLASSEX wc ;
	HBITMAP hBitmap ;
	
	RECT dimensionsFenetre ;

	_instance = FirstInstance ;

	wc.cbSize = sizeof(WNDCLASSEX) ; 
    wc.style = CS_DBLCLKS ;
    wc.lpfnWndProc = WinProc ;
	wc.lpszMenuName = NULL ;
    wc.lpszClassName = "objectMove" ;
    wc.cbClsExtra = 0 ;
    wc.cbWndExtra = 0 ;
    wc.hInstance = FirstInstance ;
	wc.hIcon = LoadIcon(NULL,IDI_APPLICATION) ;
	wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION) ;
	wc.hCursor = LoadCursor(NULL, IDC_ARROW) ;
    wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH)  ; 
    
	if (!RegisterClassEx(&wc))
	{
	 	MessageBox(NULL,"Erreur lors de l'enregistrement de la classe", "Erreur",MB_OK) ;
		return 0 ;
	}

	mainHWnd = CreateWindowEx(0
		, "objectMove"
		, "Application ObjectMove"
		, WS_OVERLAPPEDWINDOW
		, CW_USEDEFAULT
		, CW_USEDEFAULT
		, LARGEUR
		, HAUTEUR
		, HWND_DESKTOP
		, NULL
		, _instance
		, NULL) ;

	if (mainHWnd == NULL)
    {
		MessageBox(NULL, "Erreur lors de la création de la fenêtre.", "Erreur", MB_OK);
		return 0;
    }

	ShowWindow(mainHWnd , SW_SHOW) ;
	GetWindowRect (mainHWnd , &dimensionsFenetre);
	
	hBitmap = (HBITMAP)LoadImage(NULL , "01.bmp" , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE);
	if (hBitmap) GetObject(hBitmap , sizeof(BITMAP) , &infosImage);

	dimensionsBitmap.left = ((dimensionsFenetre.right - dimensionsFenetre.left  - infosImage.bmWidth) / 2);
	dimensionsBitmap.top = ((dimensionsFenetre.bottom - dimensionsFenetre.top - infosImage.bmHeight -60 ) / 2) ;
	dimensionsBitmap.right = dimensionsBitmap.left + infosImage.bmWidth ;
	dimensionsBitmap.bottom = dimensionsBitmap.top + infosImage.bmHeight ;

	hwndStatic = CreateWindowEx(WS_EX_STATICEDGE
		, "STATIC"
		, NULL
		, WS_VISIBLE|WS_CHILD|SS_BITMAP
		, dimensionsBitmap.left
		, dimensionsBitmap.top
		, dimensionsBitmap.right
		, dimensionsBitmap.bottom
		, mainHWnd
		, (HMENU)ID_STATIC
		, _instance
		, NULL);

	SendMessage(hwndStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);
	SetWindowPos(mainHWnd , NULL , INITX , INITY , LARGEUR , HAUTEUR , SWP_SHOWWINDOW) ;

	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg) ;
		DispatchMessage(&msg) ;
	}
	return msg.wParam ;
}

LRESULT CALLBACK WinProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	int posX , posY ;
	static int clique = 0, ecartX = 0, ecartY = 0 ;
	switch (msg){

	case WM_MOUSEMOVE:
		posX = LOWORD(lParam) ;
		posY = HIWORD(lParam) ;

		if ((posX >= dimensionsBitmap.left 
			&& posX <= dimensionsBitmap.right 
			&& posY >= dimensionsBitmap.top 
			&& posY <= dimensionsBitmap.bottom ) 
			&& (wParam == MK_LBUTTON) 
			&& (clique == 0))
		{
			clique = 1 ;
			ecartX = posX - dimensionsBitmap.left ;
			ecartY = posY - dimensionsBitmap.top ;
		}
		else if (wParam != MK_LBUTTON)
		{
			if (clique == 1)
			{
				dimensionsBitmap.left = posX - ecartX ;
				dimensionsBitmap.top = posY - ecartY ;
				dimensionsBitmap.right = dimensionsBitmap.left + infosImage.bmWidth ;
				dimensionsBitmap.bottom = dimensionsBitmap.top + infosImage.bmHeight ;
			}
			clique = 0 ;
		}
		if ((posX >= dimensionsBitmap.left && posX <= dimensionsBitmap.right && posY >= dimensionsBitmap.top && posY <= dimensionsBitmap.bottom) || (clique == 1))
		{
			SetCursor( LoadCursor( NULL , IDC_SIZEALL ));
		}
		if (clique == 1) SetWindowPos( hwndStatic , NULL , posX - ecartX  , posY - ecartY , infosImage.bmWidth , infosImage.bmHeight ,SWP_SHOWWINDOW ) ;
		break ;

	case WM_CLOSE:
		DestroyWindow(hwnd);
		break ;

	case WM_DESTROY:
		PostQuitMessage(0) ;
		break ;

	case WM_COMMAND:
		break;
		
	default:
		return DefWindowProc(hwnd,msg,wParam,lParam) ;
		break ;
	}
	return 0 ;
}

Conclusion :


Source -> Fichier ObjectMove.zip -

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.