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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 095 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

ladyfifine
Messages postés
2
Date d'inscription
mardi 22 décembre 2009
Statut
Membre
Dernière intervention
22 décembre 2009
-
j ai le maissage suivant
une erreur s'est produite lors de l'initialisation du programme d'instalation
code : 0x8007007e
source : RichEdit
ladyfifine
Messages postés
2
Date d'inscription
mardi 22 décembre 2009
Statut
Membre
Dernière intervention
22 décembre 2009
-
bonjour
j ai telecharger le fichier richedit car j avais des problemes de telechargement de logiciels mais maintenant et malgres le telechargement du fichier je continu a avoir le meme probleme pouvez vous m aidez svp
victorcoasne
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
3 -
essaye de mettre dans le linker :
-lcomctl32

Sous Dev-C++
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
minet03
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
1 -
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

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.