Comment faire pour créer une fenêtre de démarrage (écran titre)

Traductions disponibles Traductions disponibles
Numéro d'article: 230090 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Résumé

Un écran de « démarrage » (écran titre) utilisable par une application pour afficher des informations importantes sur un programme. L'écran de démarrage permet également d'indicateur activité lors du démarrage de l'application. Cet article explique comment créer un écran de démarrage à partir d'une fenêtre superposée avec aucun titre et bordure.

Plus d'informations

Un écran d'accueil est généralement utilisé lorsque l'on qu'une application prendra plus d'une seconde ou deux pour afficher ses éléments d'interface utilisateur première. L'écran de démarrage permet le retour visuel utilisateur qui démarre l'application. Si un écran de démarrage n'est pas utilisé, l'utilisateur peut supposons que la commande de démarrage a été exécutée pas correctement, et que l'utilisateur peut essayer de démarrer l'application à nouveau.

Pour afficher une fenêtre de démarrage, créer une fenêtre superposée. Dans WndProc de cette fenêtre, intercepter le message WM_NCCALCSIZE et renvoie NULL (au lieu de la fonction DefWindowProc ), qui empêche Microsoft Windows de redéfinir la taille de zone de la fenêtre maximale par défaut client plein écran pour prendre en charge bordures et la barre de légende.

Cette fenêtre peut être créée avant que l'application principale initialise. L'application principale peut envoyer des messages à cette fenêtre pour afficher ses informations d'initialisation ou une image bitmap.

Le code suivant illustre un moyen d'implémenter une fenêtre écran de démarrage :
#define SZ_INIT    TEXT("Initializing application...")
#define SZ_LOAD    TEXT("Loading resources...       ")
#define SZ_CLOSE   TEXT("Closing splash window...")
#define SZ_SPLASH  TEXT("Splash window")

#define ID_TIMER_CLOSE	0x1111
#define ID_TIMER_INIT	0x1112
#define ID_TIMER_LOAD	0x1113
#define ID_TIMER_DONE	0x1114

ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

HINSTANCE hInst = NULL;
TCHAR SplashWndClass[28];
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	MSG msg;

        lstrcpy(SplashWndClass,TEXT("SplashWindow"));

	MyRegisterClass(hInstance);

	// Perform application initialization:
	if (!InitInstance (hInstance, nCmdShow)) 
	{
		return FALSE;
	}

	// Main message loop:
	while (GetMessage(&msg, NULL, 0, 0)) 
	{
		TranslateMessage(&msg);
	        DispatchMessage(&msg);
	}

	return msg.wParam;
}

// 
//  FUNCTION: MyRegisterClass()
// 
//  PURPOSE: Registers the window class.
// 
//  COMMENTS:
// 
//   This function and its use is only necessary if you want 
//   this code to be compatible with Win32 systems prior to the 
//   'RegisterClassEx' function that was added to Windows 95. It is 
//   important to call this function so that the application will 
//   get 'well formed' small icons associated with it.

ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize             = sizeof(WNDCLASSEX); 
	wcex.style              = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc        = (WNDPROC)WndProc;
	wcex.cbClsExtra         = 0;
	wcex.cbWndExtra         = 0;
	wcex.hInstance          = hInstance;
	wcex.hIcon              = NULL; 
	wcex.hCursor            = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground      = (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName       = NULL; 
	wcex.lpszClassName      = SplashWndClass;
	wcex.hIconSm            = NULL; 

	return RegisterClassEx(&wcex);
}

// 
//   FUNCTION: InitInstance(HANDLE, int)
// 
//   PURPOSE: Saves instance handle and creates main window
// 
//   COMMENTS:
// 
//   In this function, we save the instance handle in a global    
//   variable and create and display the main program window.
// 
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   RECT rect;
   int  splashwidth  = 350;
   int  splashheight = 350;

   hInst = hInstance; // Store instance handle in this global variable

   SystemParametersInfo(SPI_GETWORKAREA, 0, (LPVOID) &rect, 0);

   hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, 
                         SplashWndClass,
                         NULL,
                         WS_OVERLAPPED,
                         (rect.right - rect.left - splashwidth)/2,
                         (rect.bottom - rect.top - splashheight)/2,   
		       splashwidth, 
                         splashheight, 
                         NULL,
                         NULL,
                         hInstance, 
                         NULL);
   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

// 
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
// 
//  PURPOSE:  Processes messages for the main window.
// 
//  WM_COMMAND	- Process the application menu
//  WM_PAINT	- Paint the main window
//  WM_DESTROY	- Post a quit message and return
// 
// 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message) 
	{
	        case WM_NCCALCSIZE:  //CAPTURE THIS MESSAGE AND RETURN NULL
		     return NULL;
	        case WM_CREATE:
		     SetTimer(hWnd, ID_TIMER_INIT, 1000, NULL);
		     SetTimer(hWnd, ID_TIMER_LOAD, 2000, NULL);
		     SetTimer(hWnd, ID_TIMER_DONE, 4000, NULL);
		     SetTimer(hWnd, ID_TIMER_CLOSE, 5000, NULL);
		     break;
	        case WM_PAINT:
		{
		     PAINTSTRUCT ps  = { 0 };
		     RECT rect  = { 0 };
		     HDC hDC = BeginPaint(hWnd, &ps);
		     GetClientRect(hWnd, &rect);
		     InflateRect(&rect, -2,-2);
		     Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom);
		     InflateRect(&rect, -15,-15);
		     HFONT hFont = CreateFont(-35,-35,0,0,0,0,0,0,0,0,0,0,0,TEXT("Arial"));
		     HFONT hOldFont = (HFONT) SelectObject(hDC, hFont);
		     DrawText(hDC, SZ_SPLASH, lstrlen(SZ_SPLASH), &rect, DT_WORDBREAK);
		     SelectObject(hDC, hOldFont);
		     EndPaint(hWnd, &ps);
		}
		break;
	        case WM_DESTROY:
		     PostQuitMessage(0);
		     break;
	        case WM_TIMER:
	        {
	             HDC hDC = GetDC(hWnd);
     	             RECT rect = { 0 };
	             GetClientRect(hWnd, &rect);
	             KillTimer(hWnd, wParam);
	             switch (wParam)
	             {
	                  case ID_TIMER_CLOSE:
	                       DestroyWindow(hWnd);
	                       break;
	                  case ID_TIMER_INIT:
	                       TextOut(hDC, rect.right-200, rect.bottom-20, SZ_INIT, lstrlen(SZ_INIT));
	                       break;
	                  case ID_TIMER_LOAD:
	                       TextOut(hDC, rect.right-200, rect.bottom-20, SZ_LOAD, lstrlen(SZ_LOAD));
	                       break;
	                  case ID_TIMER_DONE:
	                       TextOut(hDC, rect.right-200, rect.bottom-20, SZ_CLOSE, lstrlen(SZ_CLOSE));
	                       break;
	             }
	             ReleaseDC(hWnd, hDC);
	        }
	        break;
	        default:
		     return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}
				

Références

Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
101374 ADT/ODE : Comment faire pour créer un écran de démarrage de démarrage personnalisé

Propriétés

Numéro d'article: 230090 - Dernière mise à jour: lundi 11 juillet 2005 - Version: 1.3
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Platform Software Development Kit-January 2000 Edition
Mots-clés : 
kbmt kbhowto kbwndw KB230090 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 230090
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com