begin process at 2012 05 30 06:43:41
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

GUI

 > 

Recuperer la notification EN_CHANGE


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Recuperer la notification EN_CHANGE

lundi 11 janvier 2010 à 15:33:39 | Recuperer la notification EN_CHANGE

KinNoShishi

Bonjour à tous,

Je suis dans impasse depuis plusieurs heures maintenant... Je n'arrive pas à récupérer le message EN_CHANGE qui me permettrait de pouvoir, avant de creer une nouvelle feuille dans mon Richedit, sauver le contenu si il y eu modification du texte.

J'ai pourtant bien parametrer le EM_SETEVENTMASK => SendMessage(hWndEdit,EM_SETEVENTMASK,0,ENM_CHANGE).

La partie en rouge étant le probleme, pourriez-vous m'aider?

Voici le code:

/ ToolBarEdit.c
// Une fenêtre d'édition (RichEdit) avec dialogue "Chercher" non-modal

#include "ToolBarEdit.h" // les ID du menu et autres
#include <richedit.h> // UTILITAIRES POUR LE RICHEDIT

#define TAILLENOMFICH 256 // pour nom (et chemin) de fichier

// Charge la fenêtre avec le contenu d'un fichier choisi par l'utilisateur
// Utilise une boîte de dialogue standard
void ChargeFenetre(HWND hWnd);
void SaveAsFenetre(HWND hWnd);
BOOL Save(HWND hWnd);

void Chercher(HWND hWnd); // ouvrir le dialogue chercher

PSTR szProgName = "ToolBarEdit"; // le nom du programme
extern HWND hWndToolbar;
static HWND hWndEdit; // sous-fenêtre (garde sa valeur)
extern int affichage; // ETAT D'AFFICHAGE DE LA TOOLBAR
char szNomFichier[TAILLENOMFICH]; // NOM ET CHEMIN DU FICHIER A SAUVER

LRESULT CALLBACK WndProc(HWND hWnd, // handle de notre fenêtre
UINT nMsg, // numéro du message
WPARAM wParam, // 1ère info supplémentaire
LPARAM lParam) { // 2ème info supplémentaire
HINSTANCE hInst; // processus propriétaire
// entre les appels de WndProc
RECT TRect;
int hEdit;

switch(nMsg) { // quel message ?
case WM_CREATE : // on va créer une sous-fenêtre
// le processus propriétaire
hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
LoadLibrary("RICHED32.DLL"); // librairie contenant RichEdit
hWndEdit = CreateWindowEx(
0, // style étendu (rien de particulier)
"RICHEDIT", // nom de la classe
NULL, // pas de titre
WS_CHILD | // fenêtre fille
WS_VISIBLE | // visible
WS_VSCROLL | // avec défilement vertical
ES_NOHIDESEL| // texte sélectionné tj. visible
ES_MULTILINE, // édition sur plusieurs lignes
0, 0, 0, 0, // dimension spécifiée ailleurs
hWnd, // handle fenêtre parente
NULL, // pas de menu
hInst, // processus propriétaire
NULL); // pas de data supplémentaires
SendMessage(hWndEdit,EM_SETEVENTMASK,0,ENM_CHANGE);
return 0; // message traité
case WM_SETFOCUS : // on reçoit la main
SetFocus(hWndEdit); // la passer à la fenêtre fille
return 0; // message traité
case WM_SIZE : // dimension de fenêtre ajustée
// redimensionner fenêtre fille

GetWindowRect(hWndToolbar,&TRect);
hEdit = TRect.bottom - TRect.top;
MoveWindow(hWndEdit, // handle fenêtre fille
0, // bord gauche
0, // BORD SUPERIEURE = LA HAUTEUR DE LA TOOLBAR
LOWORD(lParam), // largeur
HIWORD(lParam), // - hEdit, // HAUTEUR - LA HAUTEUR DE LA TOOLBAR (COMMENCEMENT DE LA TOOLBAR)
TRUE); // repeint la fenêtre fille
return 0; // message traité
case WM_COMMAND : // notification ou menu
switch (LOWORD(wParam)) { // SI UN DES SOUS MENUS A ETE SELECTIONNE
case ID_FICHIER_NOUVEAU : // CREATION D'UN NOUVEAU FICHIER
if (HIWORD(wParam) == EN_CHANGE) {
if (MessageBox(hWndEdit,
"Votre fichier a été modifié. Voulez-vous le sauver?",
szProgName,
MB_ICONINFORMATION | MB_YESNOCANCEL) == IDYES) {
SaveAsFenetre(hWndEdit);
SendMessage(hWndEdit, WM_SETTEXT, 0, 0);
}
}
break;
case ID_FICHIER_QUITTER :
if (!*szNomFichier) // (HIWORD(wParam)) == EN_CHANGE)
switch (MessageBox(hWndEdit,
"Votre fichier a été modifié. Voulez-vous le sauver?",
szProgName,
MB_ICONINFORMATION | MB_YESNOCANCEL)) {
case IDYES :
SaveAsFenetre(hWndEdit);
break;
case IDNO :
DestroyWindow(hWnd);
}
break;
}
if(HIWORD(wParam) == 0) { // entrée du menu sélectionnée
switch(LOWORD(wParam)) { // laquelle ?
/*case ID_FICHIER_NOUVEAU : // CREATION D'UN NOUVEAU FICHIER
SendMessage(hWndEdit,ID_FICHIER_ENREGISTRER_SOUS,0,0);
SendMessage(hWndEdit, WM_SETTEXT, 0, 0);
break;*/
case ID_FICHIER_OUVRIR : // utilise GetOpenFileName
ChargeFenetre(hWndEdit); // pour charger la fenêtre
break;
case ID_FICHIER_QUITTER : // fermer la fenêtre
PostMessage(hWnd, WM_CLOSE,0, 0); // envoyer message WM_CLOSE
break;
case ID_EDITER_COUPER : // envoie WM_CUT
SendMessage(hWndEdit, WM_CUT, 0, 0);
break;
case ID_EDITER_COPIER : // envoie WM_COPY
SendMessage(hWndEdit, WM_COPY, 0, 0);
break;
case ID_EDITER_COLLER : // envoie WM_PASTE
SendMessage(hWndEdit, WM_PASTE, 0, 0);
break;
case ID_EDITER_EFFACER : // envoie WM_CLEAR
SendMessage(hWndEdit, WM_CLEAR, 0, 0);
break;
case ID_CHERCHER_REMPLACER : // ouvre le dialogue Chercher
Chercher(hWndEdit);
break;
case ID_FICHIER_ENREGISTRER_SOUS : // ouvre le dlgBox Enregistrer sous
SaveAsFenetre(hWndEdit);
break;
case ID_EDITER_SELECTIONNER : // Selectionne tout le texte dans l'edit
SendMessage(hWndEdit,EM_SETSEL,0,-1);
break;
case ID_MONTRER_TOOLBAR : // Montre ou cache la toolbar
if (affichage == SW_HIDE) {
ShowWindow(hWndToolbar,SW_SHOW);
affichage = SW_SHOW;
GetWindowRect(hWndToolbar,&TRect);
hEdit = TRect.bottom - TRect.top;
MoveWindow(hWndEdit, // handle fenêtre fille
0, // bord gauche
hEdit, // BORD SUPERIEURE = LA HAUTEUR DE LA TOOLBAR
LOWORD(lParam), // largeur
HIWORD(lParam) - hEdit, // HAUTEUR - LA HAUTEUR DE LA TOOLBAR (COMMENCEMENT DE LA TOOLBAR)
TRUE);
} else {
ShowWindow(hWndToolbar,SW_HIDE);
affichage = SW_HIDE;
GetWindowRect(hWndToolbar,&TRect);
MoveWindow(hWndEdit, // handle fenêtre fille
0, // bord gauche
0, // BORD SUPERIEURE = LA HAUTEUR DE LA TOOLBAR
LOWORD(lParam), // largeur
HIWORD(lParam), // HAUTEUR - LA HAUTEUR DE LA TOOLBAR (COMMENCEMENT DE LA TOOLBAR)
TRUE);
}
break;
case ID_FICHIER_ENREGISTRER : // MESSAGE QUI ENVOIE TRAITE LE CAS DE SAUVER
Save(hWndEdit);
break;
}
return 0; // message traité
}
break; // traitement par défaut
case WM_CLOSE : // on veut fermer ?
if (!*szNomFichier) {
if (SendMessage(hWnd,EM_GETEVENTMASK,0,0) == ENM_CHANGE) { // TESTE SI IL YA EU MODIFICATION DU RICHEDIT
if (MessageBox(hWnd,
"Vous avez apportez des modifications. Etes-vous sûr de vouloir quitter?",
szProgName,
MB_ICONINFORMATION | MB_YESNOCANCEL) == IDYES)
SaveAsFenetre(hWndEdit);
else if (MessageBox == IDCANCEL)
ShowWindow(hWnd,SW_SHOW);
}
}
else
// Save(hWndEdit);
DestroyWindow(hWnd);
break;
/*if(MessageBox(hWnd, // demander confirmation
"Sûr de vouloir quitter ?",
szProgName,
MB_ICONQUESTION |
MB_OKCANCEL
) == IDOK) // si l'utilisateur confirme
DestroyWindow(hWnd); // détruire la fenêtre principale */
return 0; // message traité
case WM_DESTROY : // fenêtre en passe d'être détruite
PostQuitMessage(0); // envoie WM_QUIT
return 0; // message traité
}
// tous les messages non pris en charge
return( DefWindowProc(hWnd, nMsg, wParam, lParam) );
}

void ChargeFenetre(HWND hWnd) {
OPENFILENAME ofn; // structure pour GetOpenFileName
char szNomFichier[TAILLENOMFICH]; // nom et chemin du fichier
char *szTexte; // texte lu dans le fichier
HANDLE hFile; // handle du fichier
DWORD taille, // taille du fichier
cbLus; // nombre d'octets lus

*szNomFichier = '\0'; // nom initial vide
memset(&ofn, 0, sizeof(ofn)); // initialise la structure à 0
ofn.lStructSize = sizeof(ofn); // taille de la structure
ofn.hwndOwner = hWnd; // proprio : fenêtre principale
ofn.lpstrFile = szNomFichier; // buffer pour nom + chemin
ofn.nMaxFile = TAILLENOMFICH; // taille du buffer
ofn.Flags = OFN_PATHMUSTEXIST | // exige un chemin valide
OFN_FILEMUSTEXIST; // ainsi qu'un nom valide
ofn.lpstrFilter = "Tout type de fichier (*.*)\0*.*\0\0"; // OUVRE DES FICHIERS DE TOUT TYPE
ofn.lpstrDefExt = ".*"; // MASQUE D'EXTENSION OUVRANT TOUT FICHIER
if(GetOpenFileName(&ofn)) // boite de dialogue Open
// ouvre le fichier
if((hFile = CreateFile(szNomFichier, // nom du fichier
GENERIC_READ, // mode lecture
FILE_SHARE_READ, // d'autres processus peuvent lire
NULL, // attributs de sécurité (pour NT)
OPEN_EXISTING, // le fichier doit exister
0, // attributs du fichier
NULL)) // handle de modèle d'attributs
!= INVALID_HANDLE_VALUE) { // pas d'erreur d'ouverture
taille = GetFileSize(hFile, NULL); // taille du fichier (max 4Gb)
szTexte = malloc(taille + 1); // alloue le buffer
if(ReadFile(hFile, szTexte, // lit le fichier dans szTexte
taille, // nombre max. d'octets à lire
&cbLus, // nombre d'octets lus
NULL)) { // pas d'opérations asynchrones
szTexte[cbLus] = '\0'; // termine le string
SetWindowText(hWnd, szTexte); // charge la fenêtre
free(szTexte); // libère le buffer
}
CloseHandle(hFile); // ferme le fichier
}
}

void SaveAsFenetre(HWND hWnd) {
OPENFILENAME lpofn; // STRUCTURE POUR GETSAVEFILENAME
char szNomFichier[TAILLENOMFICH]; // nom et chemin du fichier
char *szTexte; // texte lut dans le fichier
HANDLE hFile; // handle du fichier
DWORD taille, // taille du fichier
cbLus; // nombre d'octets lus

*szNomFichier = '\0'; // nom initial vide
memset(&lpofn, 0, sizeof(lpofn)); // initialise la structure à 0
lpofn.lStructSize = sizeof(lpofn); // taille de la structure
lpofn.hwndOwner = hWnd; // proprio : fenêtre principale
lpofn.lpstrFile = szNomFichier; // buffer pour nom + chemin
lpofn.nMaxFile = TAILLENOMFICH; // taille du buffer
lpofn.Flags = OFN_PATHMUSTEXIST | // exige un chemin valide
OFN_OVERWRITEPROMPT; // DDE CONFIRMATION D'ENREGISTREMENT SI LE FICHIER EXISTE DEJA
lpofn.lpstrFilter = "Fichier RTF (*.rtf)\0*.rtf\0\0"; // SAUVE LE NOM DU FICHIER EN .RTF
lpofn.lpstrDefExt = "rtf"; // MASQUE D'EXTENSION A ".RTF"

if(GetSaveFileName(&lpofn)) // BOITE DE DIALOGUE Sauver sous... ?
// OUVERTURE DU FICHIER POUR Y ECRIRE
if((hFile = CreateFile(szNomFichier, // nom du fichier
GENERIC_WRITE, // MODE ECRITURE
0, // AUCUN PROCESSUS NE PEUT ECRIRE
NULL, // attributs de sécurité (pour NT)
CREATE_ALWAYS, // ECRITURE QUE LE FICHIER EXISTE OU NON
0, // attributs du fichier
NULL)) // handle de modèle d'attributs
!= INVALID_HANDLE_VALUE) { // pas d'erreur d'ouverture
taille = GetWindowTextLength; // ENREGISTREMENT DE LA TAILLE DES CARACTERE (max 4Gb)
szTexte = malloc(taille + 1); // alloue le buffer
GetWindowText(hWndEdit, szTexte, taille); // RECUPERE LE TEXTE CONTENU DANS L'EDIT
if(WriteFile(hFile, szTexte, // ECRIT DANS LE FICHIER szTexte
taille, // NB MAX. D'OCTETS A ECRIRE
&cbLus, // NB OCTETS LUS
NULL)) { // pas d'opérations asynchrones
szTexte[cbLus] = '\0'; // termine le string

free(szTexte); // libère le buffer
CloseHandle(hFile);
}
// CloseHandle(hFile); // ferme le fichier
} else
(MessageBox(hWnd,"Impossible de sauver le fichier","Message",MB_OK));
}

BOOL Save(HWND hWnd) {
char *szTexte; // texte lut dans le fichier
HANDLE hFile; // HANDLE DU FICHIER DANS LEQUEL ON ECRIT
EDITSTREAM es; // INFOS QUI ENTRENT/SORTENT DU FICHIER
// *szNomFichier = '\0'; // NOM DU FICHIER VIDE
DWORD taille, // TAILLE DU FICHIER
cbLus; // NOMBRE D'OCTETS LUS

// SAUVE LE FICHIER EN "ENREGISTRER SOUS..." SI LE FICHIER N'AS PAS ENCORE DE NOM
if (!*szNomFichier) { //
SaveAsFenetre(hWnd);
return TRUE ;
}

// CREATION DU FICHIER
if((hFile = CreateFile(szNomFichier, // NOM DU FICHIER
GENERIC_WRITE, // MODE ECRITURE
0, // AUCUN AUTRE PROCESSUS NE PEUT ECRIRE
NULL, // attributs de sécurité (pour NT)
CREATE_ALWAYS, // ECRITURE QUE LE FICHIER EXISTE OU NON
0, // attributs du fichier
NULL)) // handle de modèle d'attributs
!= INVALID_HANDLE_VALUE) { // pas d'erreur d'ouverture
taille = GetWindowLong;
szTexte = malloc(taille + 1); // alloue le buffer
GetWindowText(hWndEdit, szTexte, taille); // RECUPERE LE TEXTE CONTENU DANS L'EDIT
es.dwCookie = (DWORD)hFile;
es.pfnCallback = WriteFile(hFile, szTexte, // ECRIT DANS LE FICHIER szTexte
taille, // NB MAX. D'OCTETS A ECRIRE
&cbLus, // NB OCTETS LUS
NULL); // PAS D'OPERATIONS ASYNCHRONES
es.dwError = 0; // PAS D'ERREUR DANS L'ECRITURE DE L'EDIT STREAM
SendMessage(hWndEdit, EM_STREAMOUT, SF_RTF, (LPARAM)&es);
}
CloseHandle(hFile);
return TRUE;
}



La difference entre la compréhension et la connaissance est ambigüe... Quelle est la réalité?
lundi 11 janvier 2010 à 18:41:00 | Re : Recuperer la notification EN_CHANGE

BruNews

Administrateur CodeS-SourceS
SendMessage(hWndEdit,EM_SETEVENTMASK,0,ENM_CHANGE | ENM_SELCHANGE);

ciao...
BruNews, MVP VC++


Cette discussion est classée dans : fichier, taille, case, hwnd, hwndedit


Répondre à ce message

Sujets en rapport avec ce message

API Win32, problème de variable [ par bouba ] Salut a tous, j'ai un blem de variable dans mon programme. Voici mon code source.LPSTR Path="";LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM richedit bloquer la modification d'un document [ par babyboo1107 ] Bonjour j'aimerais savoir comment faire pour lorsque je fais fermer le document il me met une fenetre gisée(ca j'ai trouver) mais ou il ne soit pas po Récupérer une matrice à partir d'un fichier [ par neone ] Bonjour, je chercher a récupérer une matrice a partir d'un fichier. 1- la taille est variable (nombre de lignes et colonnes) 2- les données sont organ rachraichissement fenetre winapi en c [ par dyroj ] bonjour a tous,sa faire quelque semain que j'ai un gros probleme avec le rechaichissement winapi, se probleme menpaiche d'avancer dans mais projet.se Afficher le contenu d'un fichier texte dans un Edit Control d'une boite de dialogue [ par blasko370 ] Bonjour à tous.Je me permet de vous solliciter car malgré de nombreuses recherches sur le net (forums diverses), je n'ai pas trouvé la solution à mon lectrue a partir un fichier [ par houdita18 ] Bonsoir; est ce ke vs pouvez me donner le code de pb suivant: on a une matice stoké dans un fichier;une matrice qui contient des 0 et des caractére, crypter/decrypter simplement une image [ par cool2source ] Bonjour, Je veux faire un programme qui "crypte" un fichier ( texte, image... ). Dans mon programme, je fais un fread du fichier à copier et ensuite tableau de taille variable en c++ [ par petitlapino ] Bonjour à tous, J'ai un petit soucis de débutant : comment déclarer un tableau de taille variable car j'ai récupérer des entiers à partir d'un fichier copier le contenu d'un fichier dans Cstring [ par msahli3 ] bonjour , je doit modifier un programme (fait auparavant en MFC ou je ne suis pas forcément trés bon) je doit importer un fichier texte et le parsser Creation et lecture d'un fichier typé en C [ par Razily ] Bonjour , voilà j'ai un projet de Mastermind à rendre bientôt et je coince sur une partie du code notamment sur l'enregistrement ! l'idée c'est que le


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 7,519 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales