I. Save dialog▲
En annexe au chapitre "Boîtes de dialogue communes", voici le code de l'exemple avec la sauvegarde du contenu du contrôle d'édition en plus. Le principe est identique que celui de l'ouverture de fichier. C'est la même structure qui est utilisée : OPENFILENAME. La fonction d'appel se nomme GetSaveFileName et s'utilise de la même façon que GetOpenFileName. L'écriture du fichier est réalisée avec la fonction WriteFile.
II. Code complet▲
Sélectionnez
#include <windows.h>
#define IDM_QUIT 1
#define IDM_OPEN 2
#define IDM_SAVE 3
HINSTANCE hinst;
LRESULT CALLBACK MainWndProc
(
HWND, UINT, WPARAM, LPARAM);
int
WINAPI WinMain
(
HINSTANCE hinstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int
nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wc;
HMENU hMenu, hSousMenu;
hinst =
hinstance;
wc.style =
0
;
wc.lpfnWndProc =
MainWndProc;
wc.cbClsExtra =
0
;
wc.cbWndExtra =
0
;
wc.hInstance =
hinstance;
wc.hIcon =
NULL
;
wc.hCursor =
LoadCursor
(
NULL
, IDC_ARROW);
wc.hbrBackground =
NULL
;
wc.lpszMenuName =
NULL
;
wc.lpszClassName =
"
MaWinClass
"
;
if
(!
RegisterClass
(&
wc)) return
FALSE;
hSousMenu =
CreateMenu
(
);
AppendMenu
(
hSousMenu, MF_STRING, IDM_OPEN, "
Ouvrir...
"
);
AppendMenu
(
hSousMenu, MF_STRING, IDM_SAVE, "
Enregistrer...
"
);
AppendMenu
(
hSousMenu, MF_SEPARATOR, 0
, NULL
);
AppendMenu
(
hSousMenu, MF_STRING, IDM_QUIT, "
Quitter
"
);
hMenu =
CreateMenu
(
);
AppendMenu
(
hMenu,MF_POPUP,(
UINT)hSousMenu,"
Fichier
"
);
hwnd =
CreateWindow
(
"
MaWinClass
"
, "
Titre
"
, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 640
, 300
,
NULL
, hMenu, hinstance, NULL
);
if
(!
hwnd) return
FALSE;
ShowWindow
(
hwnd, nCmdShow);
while
(
GetMessage
(&
msg, NULL
, 0
, 0
))
{
TranslateMessage
(&
msg);
DispatchMessage
(&
msg);
}
return
msg.wParam;
}
/**
***************************************************************************
*/
LRESULT CALLBACK MainWndProc
(
HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static
HWND hEdit;
static
BOOL EditNotChg =
TRUE;
switch
(
uMsg)
{
case
WM_CREATE:
{
HFONT hFont;
hEdit =
CreateWindow
(
"
edit
"
, "
Texte
"
, WS_CHILD |
WS_VISIBLE |
ES_MULTILINE |
ES_WANTRETURN |
WS_VSCROLL,
0
, 0
, 0
, 0
, hwnd, NULL
, hinst, NULL
);
hFont =
(
HFONT)GetStockObject
(
ANSI_FIXED_FONT);
SendMessage
(
hEdit,WM_SETFONT,(
UINT)hFont,TRUE);
SendMessage
(
hEdit, EM_SETMARGINS, EC_LEFTMARGIN |
EC_RIGHTMARGIN,
MAKELONG
(
5
, 5
));
return
0
;
}
case
WM_CLOSE:
if
(
EditNotChg ||
MessageBox
(
hwnd,"
Le texte a été modifié.
\r\n
Etes vous sûr de \
vouloir fermer l'application ?
"
,"
Question ?
"
,MB_YESNO |
MB_ICONQUESTION ) ==
IDYES)
DestroyWindow
(
hwnd);
return
0
;
case
WM_COMMAND:
if
(
LOWORD
(
wParam) ==
IDM_OPEN)
{
OPENFILENAME ofn;
CHAR szFile[MAX_PATH]={
0
}
;
ZeroMemory
(&
ofn, sizeof
(
OPENFILENAME));
#ifdef OPENFILENAME_SIZE_VERSION_400
ofn.lStructSize =
OPENFILENAME_SIZE_VERSION_400;
#else
ofn.lStructSize =
sizeof
(
OPENFILENAME);
#endif
ofn.hwndOwner =
hwnd;
ofn.lpstrFile =
szFile;
ofn.nMaxFile =
MAX_PATH;
ofn.lpstrFilter =
"
Fichier source C
\0
*.c
\0
Fichier source CPP
\0
*.cpp
\0
"
;
ofn.nFilterIndex =
1
;
ofn.Flags =
OFN_PATHMUSTEXIST |
OFN_FILEMUSTEXIST |
OFN_HIDEREADONLY;
if
(
GetOpenFileName
(&
ofn)==
TRUE)
{
HANDLE hf;
DWORD FileSize,nbcharRead ;
char
*
buffer;
hf =
CreateFile
(
szFile, GENERIC_READ, 0
,NULL
,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
);
FileSize =
GetFileSize
(
hf, NULL
);
buffer =
(
char
*
)LocalAlloc
(
LMEM_FIXED, FileSize+
1
);
ReadFile
(
hf, buffer, FileSize, &
nbcharRead, NULL
) ;
buffer[FileSize] =
0
;
SendMessage
(
hEdit, WM_SETTEXT, 0
, (
LPARAM)buffer);
LocalFree
(
buffer);
CloseHandle
(
hf);
}
}
/*if IDM_OPEN*/
if
(
LOWORD
(
wParam) ==
IDM_SAVE)
{
OPENFILENAME ofn;
CHAR szFile[260
]={
0
}
;
ZeroMemory
(&
ofn, sizeof
(
OPENFILENAME));
#ifdef OPENFILENAME_SIZE_VERSION_400
ofn.lStructSize =
OPENFILENAME_SIZE_VERSION_400;
#else
ofn.lStructSize =
sizeof
(
OPENFILENAME);
#endif
ofn.hwndOwner =
hwnd;
ofn.lpstrFile =
szFile;
ofn.nMaxFile =
sizeof
(
szFile);
ofn.lpstrFilter =
"
Fichier source C
\0
*.c
\0
Fichier source CPP
\0
*.cpp
\0
"
;
ofn.nFilterIndex =
1
;
ofn.Flags =
OFN_PATHMUSTEXIST |
OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT;
if
(
GetSaveFileName
(&
ofn)==
TRUE)
{
HANDLE hf;
DWORD FileSize,nbcharRead ;
char
*
buffer;
FileSize =
GetWindowTextLength
(
hEdit);
buffer =
(
char
*
)LocalAlloc
(
LMEM_FIXED, FileSize+
1
);
GetWindowText
(
hEdit, buffer, FileSize+
1
);
hf =
CreateFile
(
szFile, GENERIC_WRITE, 0
,NULL
,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
);
WriteFile
(
hf, buffer, FileSize, &
nbcharRead, NULL
) ;
CloseHandle
(
hf);
LocalFree
(
buffer);
}
}
/*if IDM_SAVE*/
if
(
LOWORD
(
wParam) ==
IDM_QUIT) PostMessage
(
hwnd, WM_CLOSE,0
,0
);
if
(
HIWORD
(
wParam) ==
EN_CHANGE) EditNotChg =
FALSE;
return
0
;
case
WM_SIZE:
MoveWindow
(
hEdit, 0
, 0
, LOWORD
(
lParam), HIWORD
(
lParam), TRUE);
return
0
;
case
WM_DESTROY:
PostQuitMessage
(
0
);
return
0
;
default
:
return
DefWindowProc
(
hwnd, uMsg, wParam, lParam);
}
}
J'ai testé les compilations avec C++ Builder et DevC++.
À vos PC.