Edit box – поля ввода однострочные и многострочные, создание простого текстового редактора в Visual Studio 2013

Рубрика: Visual Studio, Дата: 19 March, 2014, Автор:

ScreenShot 50Здорова господа!

Сегодня разберем такой графический элемент как edit box. На рисунку нарисовано поле ввода, оно похоже однострочное, от когда это поле делать многострочным то это можно считать что и есть поле для ввода текста как в редакторе, только нужно размеры задать. Можно еще полю задавать определенные размеры, от например щас напишем программку которая будет задвать полю размер из пяти букв не более, просто будет обновлять поле. Для этого есть такой параметр как EN_UPDATE. Эта штука как бы когда пользователь вводит в поле что то, то с помощью EN_UPDATE можно это что то перехватить и проверить, ну от например код:

код: »

#include <Windows.h>
#include "resource.h"

//собственная процедура для обработки
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

#define MAXSIZE 5

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE
    hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    int ret=DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),
                    NULL,(DLGPROC)DlgProc);
    if (ret == 0)
    {
        //Если была нажата кнопка Отмена или крестик
        MessageBox(NULL,(LPCTSTR)"Отмена","Inform",
                   MB_OK|MB_ICONINFORMATION);
    }
    else if (ret == 1)
    {
        //Если была нажата кнопка Ок
        MessageBox(NULL,(LPCTSTR)"Ок","Inform",
                   MB_OK|MB_ICONINFORMATION);
    }

    return ret;
}

BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam,
    LPARAM lParam)
{
    switch (msg)
    {
        case WM_INITDIALOG:
        {
            return FALSE;
        }
        case WM_COMMAND:
        {
            switch (LOWORD(wParam))
            {
                case IDOK:
                    EndDialog(hwnd,1);
                    return TRUE;
                case IDCANCEL:
                    EndDialog(hwnd,0);
                    return TRUE;

				//выбор поля
				case IDC_EDIT1:
				{
					switch(HIWORD(wParam))
					{
						//сразу же можно получить содержимое и обновить поле
						case EN_UPDATE:
						{
							char buf[128];
							//получить содержимое поля
							GetDlgItemText(hwnd,IDC_EDIT1,buf,sizeof(buf));
							int len=strlen(buf);
							if(len>=MAXSIZE)
							{
								buf[len-1]=0;
								//обновить содержимое поля
								SetDlgItemText(hwnd,IDC_EDIT1,buf);
							}
						}
					}
				}
            }
			break;
        }
        case WM_CLOSE:
        {
            EndDialog(hwnd,0);
            return FALSE;
        }
    }
    return FALSE;//нужно что бы вызвать функцию для прорисовки окда
    //return TRUE;//не будет вызыватся функция протисовки окна
}

Этот код не дает ввести больше 4 символов в поле ввода.

А теперь довайте ребятки рассмотрим многострочные поля ввода

Многострочные поля ввода

ScreenShot 51Для того что б нарисовать такое окно как на рисунке слева ничего такого сложного делать не нужно, это обычный графический элемент edit box или edit control, просто нужно в свойствах элемента задать определенное поведение. Нужно установить параметры: Авто HScroll, Авто VScroll, Прокрутка по вертикали, Прокрутка по горизонтали, Многострочный и Требует возврата в true и все у вас получится многострочное поле ввода. Такое поле ввода используется во многих текстовых редакторах, оно ведет себя как полнофункциональный текстовый редактор, при чом все операции с текстом оно выполняет автоматически не требуя дополнительного программирования.

Если к этому элементу управления в пределах диалогового окна добавить несколько кнопок, а также следить за изменением текста в поле ввода, что бы напоминать пользователю о необходимости сохранения в файле сделанных изменений, то с минимальным собственным программированием можно получить простой текстовый редактор.

 Создание простого текстового редактора на основе edit box

И так ребятки наверно приступим, это приложение я даже не знаю как его делать. Щас будем пытаться, для меня это приложение новенькое, но не куда не деться нужно разбирать принципы построения графических приложений в windows, на то он и виндовс, что там кнопочку клацнул и все заработал. Ну все летсгоу.

От код файла main.cpp

main.cpp »

#include <Windows.h> 
#include <stdio.h> 
#include "resource.h" 

//Globals: static bool bDirty;
//флаг нужно ли сохранять static FILE* fSource=NULL; 
static FILE* fDestin=NULL; static HWND hEdit; 
//Prototypes: void OpenFile(void); void SaveFile(void); 
void GetOpenFile(void); void GetSaveFile(void); 
int GetFileLength(FILE*); //собственная процедура для обработки 

BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM); 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { 
int ret=DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1), NULL,(DLGPROC)DlgProc); 
 if (ret == 0) { 
 //Если была нажата кнопка Отмена или крестик 
 MessageBox(NULL,(LPCTSTR)"Отмена","Inform", MB_OK|MB_ICONINFORMATION); 
 } else if (ret == 1) { 
 //Если была нажата кнопка Ок 
 MessageBox(NULL,(LPCTSTR)"Ок","Inform", MB_OK|MB_ICONINFORMATION); 
 } 
 return ret; 
} 


//////////////////////////////////////////////////// 
BOOL CALLBACK DlgProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { 
 switch(iMsg) { 
 case WM_INITDIALOG: { //получает дескриптор элемента управления в диалоговом окне 
 hEdit=GetDlgItem(hWnd,IDC_EDIT); 
 return TRUE; 
 } 
 case WM_COMMAND: { 
 switch(LOWORD(wParam)) { 
 case IDC_NEW: { //если сделаны изменения, то //сохранить файл 
 if(bDirty) 
 SaveFile();//проверяет на сохранность файла //изменяет текст заголовка определяемого окна 
 SetWindowText(hEdit,""); 
 return TRUE; 
 } 
 case IDC_OPEN: { //если были сделаны изменения то нужно сохранить 
 if(bDirty) SaveFile(); 
 OpenFile(); 
 return TRUE; 
 } 
 case IDC_SAVE: { //сохранить файл 
 SaveFile(); 
 return TRUE; 
 } //проверка самого поля 
 case IDC_EDIT: { 
 switch(HIWORD(wParam)) { //отправляется когда пользователь //изменил текст в окне 
 case EN_CHANGE: { bDirty=true; return FALSE; } } return FALSE; } 
 case IDC_CLOSE://кнопка закрыть 
 { //отпровляет сообщение окну, похоже на 
 //закрытие окна сообщение 
 SendMessage(hWnd,WM_CLOSE,0,0); 
 return TRUE;//вызывается собственная ф виндовс 
 } 
 } 
 break; 
 } 
 break; 
 case WM_CLOSE: { 
 if(bDirty)//если были изменения, то сохранить 
 SaveFile(); 
 EndDialog(hWnd,FALSE); 
 return TRUE; 
 } 
 } return FALSE; 
} 



////////////////////////////////////////////////////// 
void OpenFile(void) { 
 GetOpenFile(); 
 if(fSource!=NULL) { 
 int len=GetFileLength(fSource); 
 char* pBuf=(char*)malloc((len+1)*sizeof(char)); 
 fread(pBuf,sizeof(char),len,fSource); 
 pBuf[len]=0; 
 SetWindowText(hEdit,pBuf); 
 free(pBuf); 
 fclose(fSource); 
 fSource=NULL; 
 } 
} 



///////////////////////////////////////////// 
void SaveFile(void) {
 int len=GetWindowTextLength(hEdit); 
 char* pBuf=(char*)malloc((len+1)*sizeof(char)); 
 GetWindowText(hEdit,pBuf,(len+1)*sizeof(char)); 
 GetSaveFile(); 
 if(fDestin!=NULL) { 
 fwrite(pBuf,sizeof(char),(len+1),fDestin); 
 fclose(fDestin); 
 fDestin=NULL; bDirty=false; 
 } 
 free(pBuf); 
} 


///////////////////////////////////////////////// 
void GetOpenFile() {
 char szFile[256];szFile[0]=0; 
 char szFileTitle[256]; 
 char szFilter[256]="Text Files[звездочка].txt Any Files [звездочка].[звездочка]"; 
 OPENFILENAME ofn; 
 memset(&ofn,0,sizeof(OPENFILENAME));
 ofn.lStructSize=sizeof(OPENFILENAME); 
 ofn.hwndOwner=NULL; ofn.lpstrFilter=szFilter; 
 ofn.nFilterIndex=1; 
 ofn.lpstrFile=szFile; 
 ofn.nMaxFile=sizeof(szFile); 
 ofn.lpstrFileTitle=szFileTitle; 
 ofn.nMaxFileTitle=sizeof(szFileTitle); 
 ofn.lpstrInitialDir=NULL; 
 ofn.Flags= OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY; 

 if(GetOpenFileName(&ofn)) { 
 fSource=fopen(ofn.lpstrFile,"rb"); 
 } else 
 fSource=NULL; 
} 


///////////////////////////////////////////// 
void GetSaveFile() { 
 char szFile[256]; szFile[0]=0; 
 char szFileTitle[256]; 
 char szFilter[256]="Text Files*.txtAny Files*.*"; 
 OPENFILENAME ofn; 
 memset(&ofn, 0, sizeof(OPENFILENAME)); 
 ofn.lStructSize=sizeof(OPENFILENAME); 
 ofn.hwndOwner=NULL; 
 ofn.lpstrFilter=szFilter; 
 ofn.nFilterIndex=1; 
 ofn.lpstrFile=szFile; 
 ofn.nMaxFile=sizeof(szFile); 
 ofn.lpstrFileTitle=szFileTitle; 
 ofn.nMaxFileTitle=sizeof(szFileTitle); 
 ofn.lpstrInitialDir=NULL; 
 ofn.Flags=OFN_HIDEREADONLY; 

 if(GetSaveFileName(&ofn)) { 
 fDestin=fopen(ofn.lpstrFile,"wb"); 
 } else 
 fDestin=NULL; 
} 
//////////////////////////////////////////////// 
int GetFileLength(FILE* pf) { 
 fseek(pf,0,SEEK_END); 
 int len=ftell(pf); 
 fseek(pf,0,SEEK_SET); 
 return len; 
} ////////////////////////////////////////////////

Ну и рисуем форму

ScreenShot 58

Ну и все редактор готов.

Все ребятки пока.

Комментарии:

  • Александр

    Блин, парни.
    Я не знаю даже, что сказать.
    Размещаете какую-то чушь, да еще и с ужасными ошибками. Читать невозможно вообще. Просто в ужасе.


Оставить комментарий

Your email address will not be published. Required fields are marked *