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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 044 fois - Téléchargée 35 fois

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

Ajouter un commentaire

Commentaires

cs_Urgo
Messages postés
780
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
16 avril 2009
1 -
Je t'ai mis 10
Merci à toi pour ce code ;)
ciddu42
Messages postés
21
Date d'inscription
dimanche 11 avril 2004
Statut
Membre
Dernière intervention
30 janvier 2007
-
j'avais absolument besoin de savoir comment on incorporais les richedit dans un programme, maintenant j'ai la reponse :)
minet03
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
-
Je n'ai pas encore essayé, mais je doit dire que ça c'est un exemple/tuto comme je les aime : court et superbien expliqué.
Bravo, 10/10
cs_LaPatoshe
Messages postés
53
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
19 décembre 2009
-
Merci pour ce tuto bien commenté. Par contre, le prog bug à la compilation chez moi sur VC++6 et sur devCpp
J'ai le message suivant :
richf1.obj : error LNK2001: unresolved external symbol __imp__InitCommonControls@0
Debug/richpat.exe : fatal error LNK1120: 1 unresolved externals
LaPatoshe
victorcoasne
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
2 -
essaye de mettre dans le linker :
-lcomctl32

Sous Dev-C++

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.