Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Visual C++ / MFC / WTL > Создание текстового редактора


Автор: Zayka 28.12.06, 15:14
Добрый вечер! У меня возникла одна проблемка надеюсь вы мне поможите ее решить (в поиске искала, но ничего не нашла). Мне необходимо создать тектовый редактор который открывает единственный текстовый документ (по умолчанию) в окне созданого в ручную(уже реализовано - окошко), при этом текст должен быть Arial, выровненный по левому краю, а также необходимо что бы слова не вмешающиеся на строку целиком переносились на новую (перенос должен работать при изменении размера окна)! И еще самое главное - все должно быть реализовано без использование комапонентов осуществляющих форматирование текста!
Заранее СПАСИБ! Жду вашей помощи! :huh:

Автор: B.V. 28.12.06, 15:18
Могу коротко перевести содержание первого поста: напишите мне текстовый редактор.

А какие уже усилия были предприняты для реализации вышесказанного?

Автор: Zayka 28.12.06, 15:30
Знаю как осуществить чтение данных из файла(Из книги)
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    tru
    {
    CFile*pFile = new CFile("test.txt",
                             CFile::modeRead
                             | CFile:typeBinary);
    UNIT count;
    BYTE* pBuffer= new BYTE [255];
    while (0< (count = pFile->Read(pBuffer,205)))
    {
    //
    }
    {
    pFile->Close();
    delete pFile;
    {
    catch (CFileException* pe)
    {
    pe->ReportError();
    if (pFile)
    {
    delete pFile;
    }
    }


Добавлено
Так же как осуществить выравнивание
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    pDC-> SetTextAlign(TA_LEFT);

Автор: cozzzy 28.12.06, 15:39
Цитата Zayka @
Знаю как осуществить чтение данных из файла

Ну это уже пол-дела :D

Автор: BlackEmperor 28.12.06, 15:41
Цитата Zayka @
Знаю как осуществить чтение данных из файла(Из книги)

Мдяя, как-то маловато для текстового редактора :)
Ну, создай студийным визардом проект на основе ричедита и будет тебе готовый текстовый редактор с минимальными возможностями без написания единой строчки кода :)
А все самому и ручками это долго и много...
Есть проблемы задавай вопросы, народ поможет, а писать редактор с нуля самому эт вряд-ли кто-то захочет, ну на крайний счет есть раздел разовой подработке, мож туда ;) :)

Автор: Zayka 28.12.06, 15:46
Еще отображение текста с переходом на новую строку
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    //отобразить первую строку.
    ClientDC.TextOut (x,y, lpszHello, strlen(lpszHello));
    //вычислить размер первой строки
    CSize sizeString=
    ClientDC.GetTextExtent (lpszHello, strlen(lpszHello));
    //откорректировать кординату у
    y+=sizeString.cy;
    //отобразить вторую строку
    ClientDC.TextOut(x,y, lpszWorld, strlen (lpszWorld))

Автор: BlackEmperor 28.12.06, 15:47
Цитата Zayka @
Еще отображение текста с переходом на новую строку

Ну вот и отлично, знаешь и то и то, так в чем вопрос, поконкретнее моно? О проблеме конкретной

Автор: Zayka 28.12.06, 15:50
А может всетаки поможете все мои знания собрать в что-то единое, а главное работающее!! Не ужели я так мало знаю! :'( А еще мне вчера помогли создать окошко
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <Windows.h>
    // #5
    LRESULT __stdcall WndProc(HWND hwnd,
                              UINT message,
                              WPARAM wParam,
                              LPARAM lParam)
    {
        switch(message)
        {
        case WM_CLOSE:
            DestroyWindow(hwnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        }
     
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
     
     
    // #1
    int __stdcall WinMain(HINSTANCE hInst,
                          HINSTANCE hPrev,
                          char* pszCmdLine,
                          int nCmdShow)
    {
        // #2
        WNDCLASS wc = {0};
        wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        wc.hInstance = hInst;
        wc.lpszClassName = TEXT("MyWndClassName");
        wc.lpfnWndProc = WndProc;
     
        if(RegisterClass(&wc))
        {
            // #3
            HWND hwnd = CreateWindowEx(0, wc.lpszClassName,
                TEXT("My Window"), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                NULL, NULL, wc.hInstance, NULL);
            if(hwnd)
            {
                // #4
                MSG msg;
                for(;GetMessage(&msg, NULL, 0, 0);)
                {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
            }
        }
     
        return 0;
    }


Добавлено
ПОМОГИТЕ пожалуйта собрать все в кучу! Очень надо!

Автор: ElcnU 29.12.06, 09:05
дело было вечером делать было нечего... :D
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include "windows.h"
    BOOL                InitInstance(HINSTANCE, int);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    HWND hWnd;
    HWND hEdit;
    HMENU hMenu,hFileMenu;
    HFONT hFont;
    OPENFILENAME ofn;
    char szFile[260];
    HANDLE hFile;
    #define ID_EDIT         100
    #define ID_FILE_OPEN    101
    #define ID_FILE_SAVE    102
    #define ID_EXIT         103
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
        MSG msg;
        if (!InitInstance (hInstance, nCmdShow))
            return FALSE;
     
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return (int) msg.wParam;
    }
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
        WNDCLASSEX wcex;
        wcex.cbSize = sizeof(WNDCLASSEX);
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = (WNDPROC)WndProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = hInstance;
        wcex.hIcon          = NULL;
        wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = NULL;
        wcex.lpszClassName  = "FRM_TEXTEDIT";
        wcex.hIconSm        = NULL;
        RegisterClassEx(&wcex);    
        hWnd = CreateWindow(wcex.lpszClassName, "Text Edit", WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
        if (!hWnd)
            return FALSE;
        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);
    //=====================================================
        ZeroMemory(&ofn, sizeof(ofn));
        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner = hWnd;
        ofn.lpstrFile = szFile;
        ofn.lpstrFile[0] = '\0';
        ofn.nMaxFile = sizeof(szFile);
        ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
        ofn.nFilterIndex = 1;
        ofn.lpstrFileTitle = NULL;
        ofn.nMaxFileTitle = 0;
        ofn.lpstrInitialDir = NULL;
        ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    //=================================================
        return TRUE;
    }
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        int wmId, wmEvent;
        switch (message)
        {
        case WM_CREATE:
            {
                RECT rcClient;
                ::GetClientRect(hWnd,&rcClient);
                hEdit=CreateWindow("EDIT",NULL,WS_CHILD | WS_VISIBLE | WS_VSCROLL |
                    ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, 0, 0, 0, 0,  
                    hWnd,(HMENU) ID_EDIT, (HINSTANCE)::GetModuleHandle(NULL), NULL);
                hMenu=::CreateMenu();
                hFileMenu=::CreatePopupMenu();
                ::AppendMenu(hMenu,MF_STRING|MF_POPUP,(UINT)(LONG_PTR)hFileMenu,"Файл");
                ::AppendMenu(hFileMenu,MF_STRING,ID_FILE_OPEN,"Открыть");
                ::AppendMenu(hFileMenu,MF_STRING,ID_FILE_SAVE,"Сохранить");
                ::AppendMenu(hFileMenu,MF_SEPARATOR,0,NULL);
                ::AppendMenu(hFileMenu,MF_STRING,ID_EXIT,"Выход");
                ::SetMenu(hWnd,hMenu);
                hFont=::CreateFont(12,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,
                    OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
                    DEFAULT_PITCH | FF_SWISS,"Arial");
                ::SendMessage(hEdit,WM_SETFONT,WPARAM(hFont),TRUE);        
                ::SendMessage(hEdit,EM_SETLIMITTEXT,WPARAM(-1),0);          
                break;
            }
        case WM_SIZE:
            {
                MoveWindow(hEdit,0, 0,LOWORD(lParam),HIWORD(lParam),TRUE);
                return 0;
            }
        case WM_COMMAND:
            wmId    = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
            switch (wmId)
            {
            case ID_FILE_OPEN:
                {
                    if (GetOpenFileName(&ofn)==TRUE)
                    {
                        hFile = CreateFile(ofn.lpstrFile, GENERIC_READ,
                            0, (LPSECURITY_ATTRIBUTES) NULL,
                            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
                            (HANDLE) NULL);
                        if(hFile==NULL)
                            ::MessageBox(hWnd,"Не могу открыть файл","Ошибка",0x10);
                        DWORD nBufLen=::GetFileSize(hFile,NULL);
                        DWORD nBufLenToRead=0;
                        char* szReadBuf=new char[nBufLen];
                        if(!::ReadFile(hFile,szReadBuf,nBufLen,&nBufLenToRead,NULL))
                            ::MessageBox(hWnd,"Не могу прочитать файл","Ошибка",0x10);
                        ::SetWindowText(hEdit,szReadBuf);
                        delete[] szReadBuf;
                        ::CloseHandle(hFile);
                    }
                    break;
                }
            case ID_FILE_SAVE:
                {
                    if (GetSaveFileName(&ofn)==TRUE)
                    {
                        hFile = CreateFile(ofn.lpstrFile, GENERIC_WRITE,
                            0, (LPSECURITY_ATTRIBUTES) NULL,
                            CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
                            (HANDLE) NULL);
                        if(hFile==NULL)
                            ::MessageBox(hWnd,"Не могу открыть файл","Ошибка",0x10);
                        DWORD nBufLen=(DWORD)SendMessage(hEdit,WM_GETTEXTLENGTH,0,0);
                        DWORD nBufLenToWrite=0;
                        char* szWriteBuf=new char[nBufLen];
                        ::GetWindowText(hEdit,szWriteBuf,nBufLen);
                        if(!::WriteFile(hFile,szWriteBuf,nBufLen,&nBufLenToWrite,NULL))
                            ::MessageBox(hWnd,"Не могу записать в файл","Ошибка",0x10);
                        delete[] szWriteBuf;
                        ::CloseHandle(hFile);
                    }
                    break;
                }
            case ID_EXIT:
                {
                    ::DestroyWindow(hWnd);
                    break;
                }
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }

Автор: Zayka 30.12.06, 11:29
Спасибочки! Но почему-то компилировать не хочет (ругается)!
C:\zoya\987\987.cpp(2) : error C2146: syntax error : missing ';' before identifier 'InitInstance'
C:\zoya\987\987.cpp(2) : error C2501: 'BOOL' : missing storage-class or type specifiers
C:\zoya\987\987.cpp(2) : fatal error C1004: unexpected end of file found
Error executing cl.exe.
Может быть подскажете... :wall:

Автор: ElcnU 30.12.06, 12:02
зайди в свойстава проекта->
Цитата
С/С++->Precompiled Headers->Create/Use Precompiled Header->Not Using Precompiled Headers

Автор: Zayka 30.12.06, 12:20
Почему то не хочет работать! :(
В свойствах поставила переключатель в Not Using Precompiled Headers
А в полях Create/Use Precompiled Header прописала Not Using Precompiled Headers!
Правильно?

Автор: ElcnU 30.12.06, 12:21
правильно. выложи свой свой проект. я посмотрю

Автор: Zayka 30.12.06, 12:30
Подскажи как! Че та у меня не получается! :(

Автор: ElcnU 30.12.06, 12:32
нажми ответить а остальное тут объяснял :yes:

Автор: B.V. 30.12.06, 12:32
Цитата ElcnU @
hFont=::CreateFont(12,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS,"Arial");


А надо так:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                hFont=CreateFont(-MulDiv(12, GetDeviceCaps(GetDC(0), LOGPIXELSY), 72)
                    ,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,
                    OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
                    DEFAULT_PITCH | FF_SWISS,"Arial");

Автор: ElcnU 30.12.06, 12:37
Цитата B.V., 30.12.2006, 14:32:48, 1396430
А надо так:

а разница? что у тя что у меня всё равно ариал :whistle:
а свой код я из MSDN взял :yes:

Автор: Zayka 30.12.06, 12:45
ВОТ!

Добавлено
Даже так не хочет работать! :wall:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    hFont=CreateFont(-MulDiv(12, GetDeviceCaps(GetDC(0), LOGPIXELSY), 72)
                    ,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,
                    OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
                    DEFAULT_PITCH | FF_SWISS,"Arial");

Автор: B.V. 30.12.06, 13:29
Нды...

Вот:

Автор: Zayka 30.12.06, 13:33
СПАСИБО, СПАСИБО, СПАСИБО! :D Кстати, всех с наступающим! Счастья, любви и удачи в Новом году! Ж)

Автор: ElcnU 30.12.06, 18:35
Да там просто надо было #include "windows.h" на #include <windows.h>
B.V.,зачем в папку проекта запихал windows.h и ещё чёто...? качается долго(GPRS) :D
ну ладно...С Новым Годом!!! ;)

Автор: B.V. 31.12.06, 02:56
Цитата ElcnU @
зачем в папку проекта запихал windows.h и ещё чёто...?


Собирал второпях, не посмотрел чего там среда накидала :)

С Новым Годом! :yes:

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)