Réponse acceptée !
Ah oki. C'est un peu plus clair là.
Voilà ce que ça me donne (Win32/Console/C/jeu de caractère MBCS, testé sous Code::Blocks/gcc et VC6) :
#include "windows.h"
HINSTANCE _hThisInstance; // Handle du module
HWND _hWnd; // Handle de la fenêtre
LPSTR _lpAppName = "TCHATTE"; // Nom de l'appli
HANDLE _hConsole; // Handle de la sortie standart
char _lpResult[50]; // Résultat
/**
* Affiche un message d'erreur correspondant à la dernière erreur Win32
*/
void ShowLastError()
{
DWORD nLastError;
LPSTR lpMessageBuffer;
// Récupération du numéro de l'erreur
nLastError = GetLastError();
// Formatage du message
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL);
// Affichage du message et fin de l'appli
MessageBox(NULL, lpMessageBuffer, "ERROR", MB_OK | MB_ICONERROR);
}
/**
* Traitement des messages
*/
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT uPaintInfo; // Information sur le dessin
HDC hDC;
switch (nMessage)
{
case WM_PAINT:
hDC = BeginPaint(hWnd, &uPaintInfo);
// Dessin de du résultat
SetBkMode(hDC, TRANSPARENT);
TextOut(hDC, 0, 0, _lpResult, lstrlen(_lpResult));
EndPaint(hWnd, &uPaintInfo);
return 0;
case WM_DESTROY:
// On signale que le thread va s'arrêter
PostQuitMessage(0);
break;
default:
// Application du traitement par défaut
return DefWindowProc(hWnd, nMessage, wParam, lParam);
}
return 0;
}
/**
* Initialise la fenêtre principale de l'appli.
*/
void InitWindow()
{
WNDCLASSEX wincl; // Classe de la fenêtre utilisée
// Création de la classe de fenêtre
wincl.cbSize = sizeof(WNDCLASSEX);
wincl.style = 0;
wincl.lpfnWndProc = WindowProcedure;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hInstance = _hThisInstance;
wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
wincl.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wincl.lpszMenuName = 0;
wincl.lpszClassName = _lpAppName;
wincl.hIconSm = NULL;
// Enregistrement de la classe
if (!RegisterClassEx(&wincl)) ShowLastError();
// Création de la fenêtre
_hWnd = CreateWindowEx(0, _lpAppName, _lpAppName, WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 300, 100, HWND_DESKTOP, NULL, _hThisInstance, NULL);
}
/**
* Fonction de démarrage du thread, affichant le résultat intermédiaire
*/
DWORD WINAPI DisplayResult(LPVOID lpParameter)
{
MSG messages; // Réception des messages envoyés à l'application
// Récupération du résultat dans une variable globale
lstrcpy(_lpResult, lpParameter);
InitWindow();
// Boucle de traitement des messages
while (GetMessage(&messages, NULL, 0, 0))
{
// Traduit certains messages
TranslateMessage(&messages);
// Distribution des messages aux fenêtres
DispatchMessage(&messages);
}
// Code d'erreur en sortie
return messages.wParam;
}
/**
* Attend que l'utilisateur presse une touche
*/
void Pause()
{
HANDLE hInput; // Handle de l'entrée standard
DWORD nRead; // Nombre d'octets lus
TCHAR buffer; // Réception du caractère
DWORD nOldMode; // Sauvegarde le mode précédent pour le restituer
hInput = GetStdHandle(STD_INPUT_HANDLE);
GetConsoleMode(hInput, &nOldMode);
SetConsoleMode(hInput, 0);
ReadConsole(hInput, &buffer, 1, &nRead, NULL);
SetConsoleMode(hInput, nOldMode);
}
/**
* Simule un calcul
*/
void calculate(char c)
{
int nCounter; // Affichage des lettres
DWORD nWritten; // Nombres d'octets écrits
// Ecrit régulièrement la lettre dans la console
for (nCounter = 0 ; nCounter < 10 ; nCounter ++)
{
Sleep(250);
WriteConsole(_hConsole, &c, 1, &nWritten, NULL);
}
}
/**
* Main
*/
#pragma comment(linker, "/entry:main")
int _cdecl main()
{
DWORD nWritten; // Nombres d'octets écrits
HANDLE hThread; // Handle du thread de la fenêtre du résultat
char * lpWait = "\nPresser une touche pour continuer\n";
char * lpResult = "Je suis le résultat";
// Récupération d'un handle sur la sortie standard
_hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// Récupération du handle du module
_hThisInstance = GetModuleHandle(NULL);
// Début du calcul
calculate('d');
// Affichage d'une fenêtre contenant un résultat intermédiaire
hThread = CreateThread(NULL, 0, DisplayResult, lpResult, 0, NULL);
// Fin du calcul
calculate('f');
// Attente d'une pression de touche
WriteConsole(_hConsole, lpWait, lstrlen(lpWait), &nWritten, NULL);
Pause();
// Demande de fermeture de la fenêtre et fermeture du thread
PostMessage(_hWnd, WM_CLOSE, 0, 0);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
return 0;
}