Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CALENDRIER INCRUSTÉ SUR LE BUREAU [WIN32]


Information sur la source

Catégorie :Graphique Niveau : Initié Date de création : 21/11/2003 Date de mise à jour : 22/11/2003 12:42:37 Vu / téléchargé: 5 775 / 624

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Cette source permet d'avoir un calendrier mensuel directement affiché sur le bureau.


Cette source permet notament de voir la techinque du double-buffering.

Pour ceux qui ne savent pas ce que c'est : rapide aperçu...
En gros si on dessine au fur et à mesure un dessin à l'écran à chaque fois qu'on recommence ça ferait apparaitre un clignotement. Pour éviter cela, on dessine dans un buffer (sorte d'écran virtuel) et quand le dessin est terminé on bascule le buffer à l'écran. Du coup on ne voit plus les étapes intermédiaires.


PS : pour configurer le calendrier (couelurs, positions, ...) c'est au tout début du code
 

Source

  • //////////////////////////////////////////////////////////////
  • // Include
  • //////////////////////////////////////////////////////////////
  • #include <windows.h>
  • #include <stdio.h>
  • //////////////////////////////////////////////////////////////
  • // Paramètres du calendrier
  • //////////////////////////////////////////////////////////////
  • #define POSITION_X 700
  • #define POSITION_Y 5
  • #define ESPACEMENT_HORIZONTAL 30
  • #define ESPACEMENT_VERTICAL 20
  • #define FORECOLOR RGB(0,0,0)
  • #define BACKCOLOR RGB(255,255,255)
  • #define JOURCOLOR RGB(255,32,32)
  • #define REFRESH_RATE 1000
  • //////////////////////////////////////////////////////////////
  • // Variables globales
  • //////////////////////////////////////////////////////////////
  • HWND hDesk;
  • RECT fullRect;
  • short nJours[6][7];
  • SYSTEMTIME st;
  • char* cJours[7];
  • //////////////////////////////////////////////////////////////
  • // Fonctions
  • //////////////////////////////////////////////////////////////
  • /**
  • * Récupère le HWND du bureau
  • */
  • HWND FindDesktopWindow()
  • {
  • HWND hWnd = FindWindow("Progman", "Program Manager");
  • if(GetParent(hWnd) == NULL)
  • {
  • HWND hWndEnfant = GetWindow(hWnd, GW_CHILD);
  • char szBuf[32];
  • while(hWndEnfant != NULL)
  • {
  • GetClassName(hWndEnfant, szBuf, sizeof(szBuf));
  • if(lstrcmp(szBuf, "SHELLDLL_DefView") == 0)
  • break;
  • hWndEnfant = GetWindow(hWndEnfant, GW_HWNDNEXT);
  • }
  • if(hWndEnfant != NULL)
  • {
  • hWndEnfant = GetWindow(hWndEnfant, GW_CHILD);
  • while(hWndEnfant != NULL)
  • {
  • GetClassName(hWndEnfant, szBuf, sizeof(szBuf));
  • if(lstrcmp(szBuf, "SysListView32") == 0)
  • break;
  • hWndEnfant = GetWindow(hWndEnfant, GW_HWNDNEXT);
  • }
  • if(hWndEnfant != NULL)
  • return hWndEnfant;
  • }
  • }
  • return GetDesktopWindow();
  • }
  • /**
  • * Dessine le calendrier sans ombre
  • *
  • * hDC : DC où le calendrier est dessiné
  • * bFore : TRUE si c'est le calendrier d'avant-plan qui doit être dessiné FALSE sinon (ombre)
  • */
  • void DessineCalendrierAux(HDC hDC, BOOL bFore)
  • {
  • int i, j;
  • char nDecalage;
  • RECT rect;
  • // Si c'est le dessin du texte d'avant plan il n'y a aps de décalage, sinon il y a un décalage de 1 pixel
  • nDecalage = bFore ? 0 : 1;
  • SetTextColor(hDC, bFore ? FORECOLOR : BACKCOLOR);
  • SetBkMode(hDC, TRANSPARENT);
  • for (j=0; j<7; j++)
  • {
  • // jours de la semaine
  • rect.left = nDecalage + j *ESPACEMENT_HORIZONTAL;
  • rect.right = nDecalage + (j+1)*ESPACEMENT_HORIZONTAL;
  • rect.top = nDecalage;
  • rect.bottom = nDecalage + ESPACEMENT_VERTICAL;
  • DrawText(hDC, cJours[j], 1, &rect, DT_CENTER);
  • for (i=0; i<6; i++)
  • {
  • // numéro des jours du mois
  • char numero[2] = "";
  • if (nJours[i][j]>0)
  • {
  • sprintf(numero, "%d", nJours[i][j]);
  • rect.top = nDecalage + (i+1)*ESPACEMENT_VERTICAL;
  • rect.bottom = nDecalage + (i+2)*ESPACEMENT_VERTICAL;
  • if (nJours[i][j]==st.wDay && nDecalage == 0)
  • Arc( hDC, rect.left, rect.top-1, rect.right, rect.bottom-1, 0, 0, 0, 0);
  • DrawText(hDC, numero, strlen(numero), &rect, DT_CENTER);
  • }
  • }
  • }
  • }
  • /**
  • * Dessine le calendrier ombré (utilisation du double buffering
  • */
  • void DessineCalendrier(HDC hDeskDC)
  • {
  • HDC hDC;
  • DWORD dwWidth, dwHeight, dwNumColors, dwBPP;
  • void *pBits;
  • HBITMAP hbmp;
  • BITMAPINFO bmpinfo;
  • HPEN hPen;
  • // Dimensions du buffer
  • dwWidth = fullRect.right - fullRect.left;
  • dwHeight = fullRect.bottom - fullRect.top;
  • dwBPP = GetDeviceCaps(hDeskDC, BITSPIXEL);
  • if(dwBPP <= 8)
  • dwNumColors = 256;
  • else
  • dwNumColors = 0;
  • // Initialisation du buffer
  • bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  • bmpinfo.bmiHeader.biWidth = dwWidth;
  • bmpinfo.bmiHeader.biHeight = dwHeight;
  • bmpinfo.bmiHeader.biPlanes = 1;
  • bmpinfo.bmiHeader.biBitCount = (WORD) dwBPP;
  • bmpinfo.bmiHeader.biCompression = BI_RGB;
  • bmpinfo.bmiHeader.biSizeImage = 0;
  • bmpinfo.bmiHeader.biXPelsPerMeter = 0;
  • bmpinfo.bmiHeader.biYPelsPerMeter = 0;
  • bmpinfo.bmiHeader.biClrUsed = dwNumColors;
  • bmpinfo.bmiHeader.biClrImportant = dwNumColors;
  • hbmp = CreateDIBSection(hDeskDC, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0);
  • // Création du buffer et copie de la zone de l'écran concernée
  • hDC = CreateCompatibleDC(hDeskDC);
  • SelectObject(hDC, hbmp);
  • BitBlt(hDC, 0, 0, dwWidth, dwHeight, hDeskDC, fullRect.left, fullRect.top, SRCCOPY);
  • // Couleur pour l'ellipse
  • hPen = CreatePen(PS_SOLID, 1, JOURCOLOR);
  • SelectObject(hDC, hPen);
  • // Dessine la partie en arriere plan (l'ombre)
  • DessineCalendrierAux(hDC, FALSE);
  • // Dessine la partie en avant-plan
  • DessineCalendrierAux(hDC, TRUE);
  • // Copie du buffer sur le bureau
  • BitBlt(hDeskDC, POSITION_X, POSITION_Y, dwWidth, dwHeight, hDC, 0, 0, SRCCOPY);
  • DeleteObject(hbmp);
  • DeleteObject(hPen);
  • DeleteDC(hDC);
  • }
  • /**
  • * Initialisation de valeurs necessaires au graphisme
  • */
  • void InitCalendrierGraphique()
  • {
  • // Rect du calendrier
  • fullRect.left = POSITION_X;
  • fullRect.top = POSITION_Y;
  • fullRect.right = POSITION_X + 7*ESPACEMENT_HORIZONTAL;
  • fullRect.bottom = POSITION_Y + 7*ESPACEMENT_VERTICAL;
  • }
  • /**
  • * Initialise le tableau du calendrier
  • */
  • void RemplitCalendrier()
  • {
  • short nPremierJour;
  • short nJoursParMois[13];
  • short nombreJours;
  • short nCase, day;
  • char i,j;
  • // Récupère la date du jour
  • GetLocalTime(&st);
  • // Le premier jour du mois est-il un lundi, mardi ,... ?
  • nPremierJour = (st.wDayOfWeek - st.wDay + 1 + 5*7) % 7;
  • if (nPremierJour==0)
  • nPremierJour=7;
  • // Nombre de jours par mois
  • nJoursParMois[0] = 0;
  • nJoursParMois[1] = 31;
  • nJoursParMois[2] = 28;
  • nJoursParMois[3] = 31;
  • nJoursParMois[4] = 30;
  • nJoursParMois[5] = 31;
  • nJoursParMois[6] = 30;
  • nJoursParMois[7] = 31;
  • nJoursParMois[8] = 31;
  • nJoursParMois[9] = 30;
  • nJoursParMois[10] = 31;
  • nJoursParMois[11] = 30;
  • nJoursParMois[12] = 31;
  • // Année bissextile (facile entre 1980 et 2099)
  • if (st.wMonth%4==0)
  • nJoursParMois[2]++;
  • // Nombre de jours pour le mois en cours
  • nombreJours = nJoursParMois[st.wMonth];
  • // On remplit le calendrier
  • for (i = 0; i<6; i++)
  • for (j = 0; j<7; j++)
  • {
  • nCase = 7*i + j;
  • day = nCase - nPremierJour + 2;
  • nJours[i][j] = day>0 && day<=nombreJours ? day :0;
  • }
  • // Lettres qui représentent les jours de la semaine
  • cJours[0] = "L";
  • cJours[1] = "M";
  • cJours[2] = "M";
  • cJours[3] = "J";
  • cJours[4] = "V";
  • cJours[5] = "S";
  • cJours[6] = "D";
  • }
  • /**
  • * Fonction appelée périodiquement pour relancer le dessin du calendrier
  • */
  • void CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT uTimerId, DWORD dwTime)
  • {
  • HDC hDC;
  • SYSTEMTIME st_recent;
  • // Si la date a changé, mettre à jour le calendrier
  • GetLocalTime(&st_recent);
  • if (st_recent.wDay != st.wDay || st_recent.wMonth != st.wMonth || st_recent.wYear != st.wYear)
  • {
  • InvalidateRect(NULL, NULL, TRUE);
  • RemplitCalendrier();
  • }
  • // Dessine le calendrier
  • if(hDC = GetDC(hDesk))
  • {
  • DessineCalendrier(hDC);
  • ReleaseDC(hDesk, hDC);
  • }
  • }
  • /**
  • * Point d'entrée
  • */
  • int WINAPI WinMain(HINSTANCE hThisInstance,
  • HINSTANCE hPrevInstance,
  • LPSTR lpszArgument,
  • int iCmdShow)
  • {
  • MSG msg;
  • DWORD dwPid;
  • hDesk = FindDesktopWindow();
  • InitCalendrierGraphique();
  • RemplitCalendrier();
  • dwPid = GetWindowThreadProcessId(hDesk, NULL);
  • if(!AttachThreadInput(dwPid, GetCurrentThreadId(), TRUE))
  • return 0;
  • SetTimer(NULL, 0, REFRESH_RATE, TimerProc);
  • while(GetMessage(&msg, NULL, 0, 0))
  • {
  • TranslateMessage(&msg);
  • DispatchMessage(&msg);
  • }
  • AttachThreadInput(dwPid, GetCurrentThreadId(), FALSE);
  • KillTimer(NULL, 0);
  • return msg.wParam;
  • }
//////////////////////////////////////////////////////////////
// Include
//////////////////////////////////////////////////////////////

#include <windows.h>
#include <stdio.h>

//////////////////////////////////////////////////////////////
// Paramètres du calendrier
//////////////////////////////////////////////////////////////

#define POSITION_X	700
#define POSITION_Y	5

#define ESPACEMENT_HORIZONTAL	30
#define ESPACEMENT_VERTICAL		20

#define FORECOLOR	RGB(0,0,0)
#define BACKCOLOR	RGB(255,255,255)
#define JOURCOLOR	RGB(255,32,32)

#define REFRESH_RATE	1000

//////////////////////////////////////////////////////////////
// Variables globales
//////////////////////////////////////////////////////////////

HWND hDesk;
RECT fullRect;

short nJours[6][7];
SYSTEMTIME st;

char* cJours[7];

//////////////////////////////////////////////////////////////
// Fonctions
//////////////////////////////////////////////////////////////

/**
 * Récupère le HWND du bureau
 */
HWND FindDesktopWindow()
{
	HWND hWnd = FindWindow("Progman", "Program Manager");

	if(GetParent(hWnd) == NULL)
	{ 
		HWND hWndEnfant = GetWindow(hWnd, GW_CHILD);
		char szBuf[32];

		while(hWndEnfant != NULL)
		{
			GetClassName(hWndEnfant, szBuf, sizeof(szBuf));
			if(lstrcmp(szBuf, "SHELLDLL_DefView") == 0)
				break;
			hWndEnfant = GetWindow(hWndEnfant, GW_HWNDNEXT);
		}

		if(hWndEnfant != NULL)
		{
			hWndEnfant = GetWindow(hWndEnfant, GW_CHILD);
			while(hWndEnfant != NULL)
			{
				GetClassName(hWndEnfant, szBuf, sizeof(szBuf));
				if(lstrcmp(szBuf, "SysListView32") == 0)
					break;
				hWndEnfant = GetWindow(hWndEnfant, GW_HWNDNEXT);
			}
			if(hWndEnfant != NULL)
				return hWndEnfant; 
		}
	}

	return GetDesktopWindow(); 
}

/**
 * Dessine le calendrier sans ombre
 *
 * hDC : DC où le calendrier est dessiné
 * bFore : TRUE si c'est le calendrier d'avant-plan qui doit être dessiné FALSE sinon (ombre)
 */
void DessineCalendrierAux(HDC hDC, BOOL bFore)
{
	int i, j;
	char nDecalage;
	RECT rect;
	
	// Si c'est le dessin du texte d'avant plan il n'y a aps de décalage, sinon il y a un décalage de 1 pixel
	nDecalage = bFore ? 0 : 1;

	SetTextColor(hDC, bFore ? FORECOLOR : BACKCOLOR);


	SetBkMode(hDC, TRANSPARENT); 

	for (j=0; j<7; j++)
	{
		// jours de la semaine
		rect.left	= nDecalage +	 j *ESPACEMENT_HORIZONTAL;
		rect.right	= nDecalage + (j+1)*ESPACEMENT_HORIZONTAL;
		rect.top	= nDecalage;
		rect.bottom	= nDecalage +		ESPACEMENT_VERTICAL;

		DrawText(hDC, cJours[j], 1, &rect, DT_CENTER);

		for (i=0; i<6; i++)
		{
			// numéro des jours du mois
			char numero[2] = "";
			if (nJours[i][j]>0)
			{
				sprintf(numero, "%d", nJours[i][j]);

				rect.top	= nDecalage + (i+1)*ESPACEMENT_VERTICAL;
				rect.bottom	= nDecalage + (i+2)*ESPACEMENT_VERTICAL;

				if (nJours[i][j]==st.wDay && nDecalage == 0)
					Arc( hDC, rect.left, rect.top-1, rect.right, rect.bottom-1, 0, 0, 0, 0);

				DrawText(hDC, numero, strlen(numero), &rect, DT_CENTER);
			}
		}
	}
}

/**
 * Dessine le calendrier ombré (utilisation du double buffering
 */
void DessineCalendrier(HDC hDeskDC)
{
    HDC hDC;
    DWORD dwWidth, dwHeight, dwNumColors, dwBPP;
    void *pBits;
    HBITMAP hbmp;
    BITMAPINFO bmpinfo;
	HPEN hPen;

	// Dimensions du buffer
    dwWidth = fullRect.right - fullRect.left;
    dwHeight = fullRect.bottom - fullRect.top;
    dwBPP = GetDeviceCaps(hDeskDC, BITSPIXEL);
    if(dwBPP <= 8)
		dwNumColors = 256;
    else
		dwNumColors = 0;

	// Initialisation du buffer
    bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpinfo.bmiHeader.biWidth = dwWidth;
    bmpinfo.bmiHeader.biHeight = dwHeight;
    bmpinfo.bmiHeader.biPlanes = 1;
    bmpinfo.bmiHeader.biBitCount = (WORD) dwBPP;
    bmpinfo.bmiHeader.biCompression = BI_RGB;
    bmpinfo.bmiHeader.biSizeImage = 0;
    bmpinfo.bmiHeader.biXPelsPerMeter = 0;
    bmpinfo.bmiHeader.biYPelsPerMeter = 0;
    bmpinfo.bmiHeader.biClrUsed = dwNumColors;
    bmpinfo.bmiHeader.biClrImportant = dwNumColors;
    hbmp = CreateDIBSection(hDeskDC, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0);

	// Création du buffer et copie de la zone de l'écran concernée
    hDC = CreateCompatibleDC(hDeskDC);
    SelectObject(hDC, hbmp);
    BitBlt(hDC, 0, 0, dwWidth, dwHeight, hDeskDC, fullRect.left, fullRect.top, SRCCOPY);

	// Couleur pour l'ellipse
	hPen = CreatePen(PS_SOLID, 1, JOURCOLOR);
    SelectObject(hDC, hPen);

	// Dessine la partie en arriere plan (l'ombre)
	DessineCalendrierAux(hDC, FALSE);
	// Dessine la partie en avant-plan
	DessineCalendrierAux(hDC, TRUE);

	// Copie du buffer sur le bureau
    BitBlt(hDeskDC, POSITION_X, POSITION_Y, dwWidth, dwHeight, hDC, 0, 0, SRCCOPY);

	DeleteObject(hbmp);
	DeleteObject(hPen);
	DeleteDC(hDC);

}

/**
 * Initialisation de valeurs necessaires au graphisme
 */
void InitCalendrierGraphique()
{
	// Rect du calendrier
	fullRect.left	= POSITION_X;
	fullRect.top	= POSITION_Y;
	fullRect.right	= POSITION_X + 7*ESPACEMENT_HORIZONTAL;
	fullRect.bottom	= POSITION_Y + 7*ESPACEMENT_VERTICAL;
}

/**
 * Initialise le tableau du calendrier
 */
void RemplitCalendrier()
{
	short nPremierJour;
	short nJoursParMois[13];
	short nombreJours;
	short nCase, day;
	char i,j;

	// Récupère la date du jour
	GetLocalTime(&st);

	// Le premier jour du mois est-il un lundi, mardi ,... ?
	nPremierJour = (st.wDayOfWeek - st.wDay + 1 + 5*7) % 7;
	if (nPremierJour==0)
		nPremierJour=7;
	
	// Nombre de jours par mois
	nJoursParMois[0]  = 0;
	nJoursParMois[1]  = 31;
	nJoursParMois[2]  = 28;
	nJoursParMois[3]  = 31;
	nJoursParMois[4]  = 30;
	nJoursParMois[5]  = 31;
	nJoursParMois[6]  = 30;
	nJoursParMois[7]  = 31;
	nJoursParMois[8]  = 31;
	nJoursParMois[9]  = 30;
	nJoursParMois[10] = 31;
	nJoursParMois[11] = 30;
	nJoursParMois[12] = 31;

	// Année bissextile (facile entre 1980 et 2099)
	if (st.wMonth%4==0)
		nJoursParMois[2]++;

	// Nombre de jours pour le mois en cours
	nombreJours = nJoursParMois[st.wMonth];

	// On remplit le calendrier
	for (i = 0; i<6; i++)
	for (j = 0; j<7; j++)
	{
		nCase = 7*i + j;

		day = nCase - nPremierJour + 2;

		nJours[i][j] = day>0 && day<=nombreJours ? day :0;
	}

	// Lettres qui représentent les jours de la semaine
	cJours[0] = "L";
	cJours[1] = "M";
	cJours[2] = "M";
	cJours[3] = "J";
	cJours[4] = "V";
	cJours[5] = "S";
	cJours[6] = "D";
}

/**
 * Fonction appelée périodiquement pour relancer le dessin du calendrier
 */
void CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT uTimerId, DWORD dwTime)
{
	HDC hDC;
	SYSTEMTIME st_recent;

	// Si la date a changé, mettre à jour le calendrier
	GetLocalTime(&st_recent);
	if (st_recent.wDay != st.wDay || st_recent.wMonth != st.wMonth || st_recent.wYear != st.wYear)
	{
		InvalidateRect(NULL, NULL, TRUE);
		RemplitCalendrier();
	}

	// Dessine le calendrier
	if(hDC = GetDC(hDesk))
	{
		DessineCalendrier(hDC);
		ReleaseDC(hDesk, hDC);
	}
}

/**
 * Point d'entrée
 */
int WINAPI WinMain(HINSTANCE hThisInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR     lpszArgument,
                   int       iCmdShow)
{
	MSG   msg; 
	DWORD dwPid;

	hDesk = FindDesktopWindow(); 
	InitCalendrierGraphique();
	RemplitCalendrier();

	dwPid = GetWindowThreadProcessId(hDesk, NULL);
	if(!AttachThreadInput(dwPid, GetCurrentThreadId(), TRUE))
	  return 0;

	SetTimer(NULL, 0, REFRESH_RATE, TimerProc);

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

	AttachThreadInput(dwPid, GetCurrentThreadId(), FALSE);
	KillTimer(NULL, 0);

	return msg.wParam;
}

Conclusion

Je me suis inspiré de 2 autres sources :
- celle de Brunews sur la sauvegarde des HDC dans des fichiers BMP :
http://www.cppfrance.com/code.aspx?ID=11128
-et celle de magma : "ANIMEZ VOTRE BUREAU"
http://www.cppfrance.com/code.aspx?ID=16843

Merci à eux


MISE A JOUR : 22/11/2003
Si la date change pendant le fonctionnement du calendrier, il se met à jour
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   Calendar
    • Debug
    •   Release
      • Calendar.exeTélécharger ce fichier [Réservé aux membres club]32 768 octets
    • Calendar.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier7 814 octets
    • Calendar.dspTélécharger ce fichier [Réservé aux membres club]Voir ce fichier3 940 octets
    • Calendar.dswTélécharger ce fichier [Réservé aux membres club]Voir ce fichier541 octets
    • Calendar.ncbTélécharger ce fichier [Réservé aux membres club]50 176 octets
    • Calendar.optTélécharger ce fichier [Réservé aux membres club]48 640 octets
    • Calendar.plgTélécharger ce fichier [Réservé aux membres club]1 244 octets

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de ymca2003 le 22/11/2003 22:13:03

Lors de la création du bitmap pour le double-buffering,
CreateCompatibleBitmap(hDeskDC, cx, cy) est plus simple car tu n'as pas à gérer la profondeur de couleurs et tout le reste, le bitmap est "compatible" avec le DC.

signaler à un administrateur
Commentaire de garslouche le 23/11/2003 02:17:41

C'était ce que j'avais fait au début mais il me semble que je n'arrivais pas à recopier le bureau dans mon buffer... je ne sais pas trop pourquoi.

Si tu y arrives ça m'interesse!

signaler à un administrateur
Commentaire de ymca2003 le 23/11/2003 19:10:36

J'ai tester, ça marche avec
hbmp = CreateCompatibleBitmap(hDeskDC, dwWidth, dwHeight);

signaler à un administrateur
Commentaire de magma le 24/11/2003 06:51:57


Les fonctions GetWindowThreadProcessId et AttachThreadInput
sont inutiles dans ton prog. Tu peux les supprimer.

Elle étaient dans la source "ANIMEZ VOTRE BUREAU" simplement
pour détecter un clic souris sur le bureau.

signaler à un administrateur
Commentaire de Suisse00 le 09/05/2004 00:32:01

Sous windows 98 il ne marche que quand il y a des îcone derrière, et on voie pas grand chose :( (la moitier des chiffre)

signaler à un administrateur
Commentaire de J6B le 05/08/2004 14:42:22

ta fonction FindDesktopWindow() est très simplifiable avec des FindWindowEx pour trouver les fenêtre filles plus facilement.


HWND FindDesktopWindow(){

   HWND hWnd=FindWindow("Progman","Program Manager");
   if(!GetParent(hWnd)){

      if(HWND hWndEnfant=FindWindowEx(hWnd,NULL,"SHELLDLL_DefView",NULL)){

         if(hWndEnfant=FindWindowEx(hWndEnfant,NULL,"SysListView32",NULL)) return hWndEnfant;
      };
   };
   return GetDesktopWindow();
};

signaler à un administrateur
Commentaire de dominion le 22/03/2005 21:38:18

2 choses :
1. Pourquoi GetDesktopWindow(); ne suffit pas pour trouver le handle du bureau ?
2. Ton prog c'est un dessin c'est ça ? Je cherche un moyen de détecter si on est sur le bureau pour afficher des windows... Si quelqu'un sait m'aider...

Merci.

signaler à un administrateur
Commentaire de garslouche le 23/03/2005 09:04:30

1. Je ne sais pas pourquoi mais GetDesktopWindow ne fonctionne pas. Comme c'est marqué je me suis largement inspiré de la source
http://www.cppfrance.com/code.aspx?ID=16843

2. Je ne comprends ce que tu veux dire par "si on est sur le bureau"

signaler à un administrateur
Commentaire de ymca2003 le 23/03/2005 09:08:30

GetDesktopWindow renvoi le handle de la fenêtre globale du bureau mais cette fenêtre contient d'autres fenêtres comme une ListView pour la zone de travail avec les icones et c'est cette ListView qui faut récupérer.

signaler à un administrateur
Commentaire de dominion le 23/03/2005 14:25:13

ymca : ok merci
garslouche : en fait je cherche à créer une fonction capable de savoir si la fenêtre active c'est le bureau... Le but est d'afficher une sorte de post it si c'est le cas. Par exemple si je clique sur l'icone bureau mon soft doit le détecter et afficher le postit.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.