Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Удаление записей в программе!


Автор: dizel003 15.3.2008, 18:22
Вот написал учебную программу! Сумел наконецто сделать так чтобы можно было писать больше одного символа но очень простым способом!

Вопрос заключается в том как улучшить работу с текстом! Мне нужно чтобы надписи можно было стерать, перенасить на другую строку, и у менй выставлено растояние между буквами 8 пикселей , и если буква шерокая то она залезает на другую а если сделать большет растояние то получается некрасиво! как будто с пробелами но любая клавиша воспринимается как символ! Пожалуста подскажите как улучшить работу с текстом!


Вот работующая программа!
Код

/*Программа осуществляющая вывод на экран при оброботке сообщения WM_PAINT (Нажатие правой кнопки мыши)*/
#include<windows.h>
#include <windowsx.h>
#include <stdio.h>

LRESULT CALLBACK WindowsFunc(HWND,UINT,WPARAM,LPARAM);

char str[10];
int X=1,Y=1;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR IpszArgs,int nWinMode)
{
    char szWinName[]="MyWindow";
    char szTitle[]="1 Программа";
    MSG msg;

    WNDCLASS wc;


    ZeroMemory(&wc,sizeof(wc));

    wc.hInstance=hInstance;
    wc.lpszClassName=szWinName;
wc.lpfnWndProc=WindowsFunc;
    wc.style=0;
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground=GetStockBrush(WHITE_BRUSH);
    wc.lpszMenuName=NULL;
    wc.cbClsExtra=0;
    wc.cbWndExtra=0;

    if(!RegisterClass(&wc))
    {        MessageBox(NULL,"Окно не регистрируется","Ошибка!",MB_OK);
        return 1;
    }

    HWND hwnd=CreateWindow(szWinName,szTitle,WS_OVERLAPPEDWINDOW,100,100,500,100,HWND_DESKTOP,NULL,hInstance,NULL);
    ShowWindow(hwnd,SW_SHOWNORMAL);

    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
        LRESULT CALLBACK WindowsFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM IParam)
        {
        
            HDC hdc;
            PAINTSTRUCT paintstruct;
            switch(message)
            {
              case WM_CHAR:
                X+=10;
                Y=1;
                hdc=GetDC(hwnd);
                sprintf (str,"%c",(char)wParam);
                TextOut(hdc,X,Y,str,strlen(str));
                ReleaseDC(hwnd,hdc);
               // InvalidateRect(hwnd,NULL,1);
                break;
            case WM_PAINT:
                hdc=BeginPaint(hwnd,&paintstruct);
                //TextOut(hdc,X,Y,str,strlen(str));
                EndPaint(hwnd,&paintstruct);
                break;
                /*Обработка правой и левой кнопки мыши*/
            case WM_RBUTTONDOWN:
                //strcpy(str,"Нажата правая кнопка");
                X=LOWORD (IParam);
                Y=HIWORD (IParam);
                InvalidateRect(hwnd,NULL,1);
                break;
           case WM_LBUTTONDOWN:
                //strcpy(str,"Нажата левая кнопка кнопка");
                X=LOWORD (IParam);
                Y=HIWORD (IParam);
                InvalidateRect(hwnd,NULL,1);
                break;

            default:

                return DefWindowProc(hwnd,message,wParam,IParam);
            }
            return 0;
        }

Автор: 586 15.3.2008, 19:09
Код
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>

LRESULT CALLBACK WindowsFunc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR IpszArgs,int nWinMode)
{
    static const char szWinName[]="MyWindow";
    static const char szTitle[]="1 Программа";
    MSG msg;

    WNDCLASS wc;
    ZeroMemory(&wc,sizeof(wc));

    wc.hInstance=hInstance;
    wc.lpszClassName=szWinName;
    wc.lpfnWndProc=WindowsFunc;
    wc.style=0;
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground=GetStockBrush(WHITE_BRUSH);
    wc.lpszMenuName=NULL;
    wc.cbClsExtra=0;
    wc.cbWndExtra=0;

    if(!RegisterClass(&wc))
    {        MessageBox(NULL,"Окно не регистрируется","Ошибка!",MB_OK);
        return 1;
    }

    HWND hwnd=CreateWindow(szWinName,szTitle,WS_OVERLAPPEDWINDOW,100,100,500,100,HWND_DESKTOP,NULL,hInstance,NULL);
    ShowWindow(hwnd,SW_SHOWNORMAL);

    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

LRESULT CALLBACK WindowsFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM IParam)
{
    HDC hdc;
    PAINTSTRUCT paintstruct;
    SIZE size;
    static int X=1,Y=1;
    char str[10];

    switch(message)
    {
      case WM_CHAR:
        //X+=10;
        Y=1;
        hdc=GetDC(hwnd);
        sprintf (str,"%c",(char)wParam);
        TextOut(hdc,X,Y,str,strlen(str));
        GetTextExtentPoint32(hdc, str, strlen(str), &size);
        X += size.cx;
        ReleaseDC(hwnd,hdc);
       // InvalidateRect(hwnd,NULL,1);
        break;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&paintstruct);
        //TextOut(hdc,X,Y,str,strlen(str));
        EndPaint(hwnd,&paintstruct);
        break;
        /*Обработка правой и левой кнопки мыши*/
    case WM_RBUTTONDOWN:
        //strcpy(str,"Нажата правая кнопка");
        X=LOWORD (IParam);
        Y=HIWORD (IParam);
        InvalidateRect(hwnd,NULL,1);
        break;
   case WM_LBUTTONDOWN:
        //strcpy(str,"Нажата левая кнопка кнопка");
        X=LOWORD (IParam);
        Y=HIWORD (IParam);
        InvalidateRect(hwnd,NULL,1);
        break;

   case WM_DESTROY:
       PostQuitMessage(0);
       break;

    default:

        return DefWindowProc(hwnd,message,wParam,IParam);
    }
    return 0;
}

Автор: dizel003 15.3.2008, 19:54
Спасибо большое! а как стерать при нажатии на делит например или на BACKSPACE и как сделать так чтобы при нажатии на ENTER перенасилась на другую строчку?

Автор: 586 15.3.2008, 20:13
Цитата(dizel003 @  15.3.2008,  19:54 Найти цитируемый пост)
 а как стерать при нажатии на делит например или на BACKSPACE и как сделать так чтобы при нажатии на ENTER перенасилась на другую строчку? 

Если ты хочешь написать текстовый редактор, то тебе необходимо завести буффер, где будет храниться текст (в MSDN даже где-то был подобный пример, надо только поискать). Без этого backspace реализовать не получится, т.к. неизвестна длина текста, и что там за текст. Насчет enter, перенос строки в Windows далается так: "\r\n".
PS Можно сделать хитро, как в Paint'е, положить прозрачный edit и редактировать его.

Автор: dizel003 16.3.2008, 10:57
Цитата(586 @ 15.3.2008,  20:13)
Цитата(dizel003 @  15.3.2008,  19:54 Найти цитируемый пост)
 а как стерать при нажатии на делит например или на BACKSPACE и как сделать так чтобы при нажатии на ENTER перенасилась на другую строчку? 

Если ты хочешь написать текстовый редактор, то тебе необходимо завести буффер, где будет храниться текст (в MSDN даже где-то был подобный пример, надо только поискать). Без этого backspace реализовать не получится, т.к. неизвестна длина текста, и что там за текст. Насчет enter, перенос строки в Windows далается так: "\r\n".
PS Можно сделать хитро, как в Paint'е, положить прозрачный edit и редактировать его.

Подскажите пожалуста где можно найти текстовый редактор! Может вы знаете название книг где это все подробно описывается... 


И ещё хотел спросить вот сделал меню! Как сделать так чтобы при нажатии на кнопку можно былобы сохранять написанное в файл к примеру в формате .txt?????????

Автор: T0ohtik 16.3.2008, 11:07
Для этого используй функцию BOOL GetSaveFileName(LPOPENFILENAME lpofn);

Автор: dizel003 16.3.2008, 11:16
Цитата(T0ohtik @ 16.3.2008,  11:07)
Для этого используй функцию BOOL GetSaveFileName(LPOPENFILENAME lpofn);

Просто прописать в программе эту функцию и все?

Автор: T0ohtik 16.3.2008, 11:35
А MSDN для кого придумали. Не просто  вставить не получится. Одим из параметров этой функции является структура. Эту структуру надо заполнить
Код

        OPENFILENAME ofn = {0};
                TCHAR  lpstrFile[MAX_PATH+1];
                TCHAR filter[]=_T("*.txt\0*.txt\0");
                        ofn.lStructSize = sizeof(ofn);
        ofn.lpstrFile = lpstrFile;
        ofn.hwndOwner = hWnd;
        ofn.hInstance = hInst;
        ofn.lpstrFile[0] = '\0'; 
        ofn.nMaxFile = MAX_PATH+1; 
        ofn.lpstrFilter = filter; 
        ofn.nFilterIndex = 1; 
        ofn.lpstrFileTitle = NULL; 
        ofn.nMaxFileTitle = 0; 
        ofn.lpstrDefExt=_T("txt");    
        GetSaveFileName(&ofn);

Автор: dizel003 16.3.2008, 13:13
Спасибо большое!

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