Пример. Текстовый редактор

В верхней части главного окна приложения располагается четыре кнопки: 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 и проч.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: