В верхней части главного окна приложения располагается четыре кнопки: NEW, OPEN, SAVE, EXIT. Текстовый редактор предоставляет возможность создавать новые файлы и редактировать имеющиеся файлы, сохранять текст в старом или новом файле.
//Добавляется до функции WinMain
#include <commdlg.h>
#define ID_EDIT 1
#define ID_NEW 2
#define ID_OPEN 3
#define ID_SAVE 4
#define ID_EXIT 5
HINSTANCE hInst;
HFILE OpenFile();
HFILE OpenSaveFile();
BOOL bUpdate; // Следит за изменением текста в текстовом редакторе.
//В функцию WinMain добавть:
….
while (GetMessage(&msg, 0, 0, 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
….
HFILE OpenFile()
{
OPENFILENAME ofn;
char szFile[256];
char szFileTitle[256];
char szFilter[256] = «Text files\0 *.txt;*.doc\0 AnyFiles\0 *.*\0»;
HFILE hf;
szFile[0] = '\0'
mesmset(&ofn, 0, sizeof(OPENFILENAME);
ofn.CStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = szFilter;
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFileTitel = szFileTitle;
ofn.nMaxFileTitle = sizeof(szFileTitle);
ofn.lpstrInitalDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
if(GetOpenFileName(&ofn))
{
hf = _lopen(ofn.lpstrFile, OF_READ);
return hf;
}
else return 0;
}
HFILE OpenFileSave()
{
OPENFILENAME ofn;
char szFile[256];
char szFileTitle[256];
char szFilter[256] = «Text files\0 *.txt;*.doc\0 AnyFiles\0 *.*\0»;
HFILE hf;
szFile[0] = '\0'
mesmset(&ofn, 0, sizeof(OPENFILENAME);
ofn.CStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = szFilter;
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFileTitel = szFileTitle;
ofn.nMaxFileTitle = sizeof(szFileTitle);
ofn.lpstrInitalDir = NULL;
ofn.Flags = OFN_HIDEREADONLY;
if(GetSaveFileName(&ofn))
{
hf = _lcreate(ofn.lpstrFile, 0);
return hf;
}
else return 0;
}
//Функция окна
LRESULTCALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HWND hEdit;
static HWND hButtonNew;
static HWND hButtonOpen;
static HWND hButtonSave;
static HWND hButtonExist;
static HFILE hfSrcFile, hfDstFile;
switch(msg)
{
case WM_CREATE:
hEdit = CreateWindow(«edit», NULL, WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|ES_EFT|ES_AUTOHSCROLL|ES_AUTOVSCROLL|ES_MULTILINE, 0, 0, 0, 0, hwnd, (HMENU) ID_EDIT, hInst, NULL);
bUpdate = FALSE;
hButtonNew = CreateWindow(«button», «NEW», WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 0, 0, 50, 20, …...);
---//----//---
Лекция №7 (20.10.10)
case WM_SIZE:
{
MoveWindow(hEdit, 0, 20, LOWORD(lParam), HIWORD(lParam)-20, TRUE);
return 0;
}
case WM_SETFOCUS:
{
setFocus(hEdit);
return 0;
}
case WM_COMMAND:
{
if(wParam == ID_EDIT)
{
if(HIWORD(lParam) == EN_ERRSPACE)
MessageBox(hwnd, «Мало памяти», «», MB_OK);
else if (HIWORD(lParam) == EN_UPDATE)
bUpdate = TRUE;
retrun 0;
}
esle if (wParam == ID_SAVE)
{
WORD wSize;
HANDLE hTxtbuf;
NPSTR hpTextBuffer;
hfDstFile = OpenSaveFile();
if(!hfDstFile)
return 0;
wsize = GetWindowTextLength(hEdit); // Определяет размер текста.
// Получая идентификатор к блоку памяти,в котором находится // редактируемый текст.
Htxtbuf = (HANDLE) SendMessage(hEdit, EM_GETHANDLE, 0, 0L);
// Фиксируем блок памяти и получаем на него указатель.
NpTextBuffer = (NPSTR) LocalLock(hTxtBuf);
if(wSize!= _lwrite(hfDstFile, npTextBuffer, wSize)
{
_lclose(hfDstFile);
MessageBox(hwnd, «ошибка записи», «», MB_OK);
return 0;
}
_lclose(hfDstFile);
LocalUnlock(hTxtBuf);
bUpdate = FALSE;
return 0;
}
else if(wParam == ID_NEW)
{
if(bUpdate)
{
if(IDYES = MessageBox(hwnd, «Файл изменен, сохранить?», «», MB_YESNO||MB_ICONQUESTION));
return 0;
}
SetWindowText(hEdit, «\0»);
return 0;
}
else if(wParam == ID_OPEN)
{
if(bUpdate)
{
if(IDYES = MessageBox(hwnd, «Файл изменен, сохранить?», «», MB_YESNO||MB_ICONQUESTION));
return 0;
}
SetWindowText(hEdit, «\0»);
LPSTR lpTextBuffer;
DWORD dwFileSize, dw CurrentPos;
hfSrcFile = OpenFile();
if(!hfSrcFile)
return 0;
// Определяем размер файла (не может быть больше 32526)
(hfSrcFile, 0L, 1);
dwFileSize = _llseek;
(hfSrcFile, 0L, 2);
__llseek(hfSrcFile, dwCurrentPos, 0);
if(dwFileSize = 32000)
{
_lclose(hfSrcFile);
MessageBox(hwnd, «Большой размер файла», «», MB_OK);
}
lpTextBuffer = (LPSTR) malloc(32000);
_lread(hfSrcFile, lpTextBuffer, dwFileSize);
lpTextBuffer[(WORD)dwFileSize] = '\0';
_lclose(hfSrcFile);
SetWindowText(hEdit, lpTextBuffer);
free((void*)lpTextBuffer);
bUpdate = FALSE;
}
else if(wParam == ID_EXIT)
{
if(bUpdate)
{
if(IDYES = MessageBox(hwnd, «Файл изменен, сохранить?», «», MB_YESNO||MB_ICONQUESTION));
return 0;
}
SetWindowText(hEdit, «\0»);
SendMessage(hwnd, WM_CLOSE, 0, 0L)
}
return 0;
//Destroy и проч.