Utilisation des contrôles communs (richedit) avec l'api

Contenu du snippet

Ce code explique la création d'une fenêtre et d'un controle commun de type RichEdit. Il est facilement adaptable aux autres controles communs, pour plus d'informations allez voir "Common Controls" dans win32.hlp

PS: j'ai mis des commentaires cette fois ;op

Source / Exemple :


// fichier inclus pour les applications windows
#include <windows.h>

// fichier contenant les définitions des contrôles communs
#include <commctrl.h>

// fichier contenant les définitions spécifiques au richedit
#include <richedit.h>

// définition de la classe de la fenêtre
#define WND_CLASS "GWIN32_RICHEDIT"

// définition de l'ID du richedit
#define ID_RICHSAMPLE 1

// handle de la fenêtre
HWND wndMain = NULL;

// handle du richedit
HWND edtSample = NULL;

// procédure de gestion des messages de la fenêtre
LRESULT CALLBACK wndMainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  switch (uMsg) {
  case WM_CLOSE:
    // fermeture de la fenêtre : quitter l'application
    PostQuitMessage(0);
    return 0;
  default:
    // autres messages : appeler le gestionnaire par défaut
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
  }
}

// point d'entrée de l'application
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
  // variable utilisée pour le chargement de la dll permettant l'utilisation des richedit
  HINSTANCE richDll = NULL;
  // classe de la fenêtre
  WNDCLASSEX wc;
  // messages envoyés par windows
  MSG msg;
  // initialisation de la classe de la fenêtre
  wc.cbSize = sizeof(WNDCLASSEX);
  wc.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc = wndMainProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = hInstance;
  wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = (HBRUSH) COLOR_WINDOW;
  wc.lpszMenuName = NULL;
  wc.lpszClassName = WND_CLASS;
  wc.hIconSm = NULL;
  // enregistrement de la classe
  RegisterClassEx(&wc);
  // création de la fenêtre
  wndMain = CreateWindowEx(WS_EX_APPWINDOW, WND_CLASS, "Test : Création d'un richedit", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, HWND_DESKTOP, NULL, hInstance, NULL);
  // chargement des contrôles communs
  InitCommonControls();
  // chargement du contrôle richedit
  richDll = LoadLibrary("RICHED32.DLL");
  // création du richedit
  edtSample = CreateWindowEx(0, "RichEdit", "Ceci est bien un RichEdit !", WS_CHILD | WS_BORDER | WS_HSCROLL | WS_VSCROLL | WS_VISIBLE | ES_LEFT | ES_MULTILINE | ES_WANTRETURN | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 10, 10, 300, 300, wndMain, (HMENU) ID_RICHSAMPLE, hInstance, NULL);
  // affichage de la fenêtre
  ShowWindow(wndMain, nCmdShow);
  // mise à jour de la fenêtre
  UpdateWindow(wndMain);
  // boucle de traitement des messages
  while (GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  // destruction de la fenêtre (facultatif)
  // note : la fenêtre détruit automatiquement toutes ses fenêtres enfants (WS_CHILD)
  DestroyWindow(wndMain);
  // déchargement du contrôle richedit
  FreeLibrary(richDll);
  // renvoyer le code de sortie à windows
  return msg.wParam;
}

Conclusion :


Il faudrait vérifier à chaque chargement de librairie/création de fenetre si tout s'est bien passé (valeur de retour != NULL)...

Les messages envoyés par le richedit peuvent etre traités via les messages WM_COMMAND et WM_NOTIFY, voir win32.hlp pour plus de détails (ou mon telnet graphique en C, qui gère des Edit multilignes normaux, via WM_COMMAND)

Bon courage ;o)

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.