Текстовый редактор только с win23 api - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброе время суток. Вот нужно сделать простейший текстовый редактор(ТР) только с win23 api. ТР должен уметь делать простейшие действие: сохранить файл, открыть файл, копировать, вырезать, вставитьа так же подсчитывать количество слов и символов в тексте. При помощи этой(http://progbook.ru/c/473-schupak-win...azrabotka.html) книжки получил следующее:
#include "commdlg.h"
#include "commctrl.h"
#include <fstream>
 
TBBUTTON tbb[] =
    |{STD_FILENEW, ID_FILE_NEW, TBSTATE_ENABLE, TBSTYLE, 0, 0, 0, 0},
     {STD_FILENEW, ID_FILE_NEW, TBSTATE_ENABLE, TBSTYLE, 0, 0, 0, 0},
     {STD_FILENEW, ID_FILE_NEW, TBSTATE_ENABLE, TBSTYLE, 0, 0, 0, 0}|;
 
VOID StatusOut(HWND hStatus, int count, TCHAR *str)
{
    TCHAR text[256];
    _stprintf(text,_T("Строк: %d"), count);
    SendMessage(hStatus, SB_SETTEXT, (WPARAM)0, (LPARAM)text);
    SendMessage(hStatus, SB_SETTEXT, (WPARAM)1, (LPARAM)str);
}
 
LRESULT CALLBACK wndProc(HWND hWnd, UINT messag, WPARAM wParam, LPARAM lParam)
{
    static OPENFILENAME file;
    static int n, sx,sy;
    static HWND hEdit, hWndToolBar, hWndStatusBar;
    RECT rt;
    int m, k, aWidths[2];
    static TCHAR name [256];
    char szText [0x7fff];
    std::ifstream in;
    std::ofstream uot;
    switch (messag)
    {
    case WM_CREATE:
        hWndToolBar = CreateToolbarEx(hWnd, WS_CHILD|WS_VISIBLE|CCS_TOP, 2, 0, 
            HINST_COMMCTRL, IDB_STD_SMALL_COLOR, tbb, 3, 0, 0, 0, 0, sizeof(TBBUTTON));
        hEdit = CreateWindow(WC_EDIT, NULL, WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL
            |ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL, 0, 0, 0, 0, hWnd, (HMENU)1, hInst ,NULL);
        file.lStructSize = sizeof(OPENFILENAME);
        file.hInstance = hInst;
        file.lpstrFilter = _T("Text\0 *.txt\0Все вайлы\0 *.*");
        file.lpstrFile = name;
        file.nMaxFile = 256; 
        file.lpstrInitialDir = _T(".\\");
        file.lpstrDefExt = _T("txt");
        hWndStatusBar = CreateWindow(STATUSCLASSNAME, NULL, WS_CHILD|WS_VISIBLE,
            0, 0, 0, 0, hWnd, NULL, hInst, NULL);
        break;
 
    case WM_SIZE:
        sx = LOWORD(lParam);
        sy = HIWORD(lParam);
        aWidths[0] = 100;
        aWidths[1] = sx;
        GetWindowRect(hWndToolBar, &rt);
        m = rt.bottom - rt.top;
        SendMessage(hWndToolBar, TB_AUTOSIZE, 0, 0);
        GetWindowRect(hWndStatusBar, &rt);
        k = rt.bottom - rt.top;
        MoveWindow(hWndStatusBar, 0, sy - k, sx, sy, TRUE);
        SendMessage(hWndStatusBar, SB_SETPARTS, (WPARAM)2, (LPARAM) aWidths);
        StatusOut(hWndStatusBar, n, name);
        MoveWindow(hEdit, 0, m, sx - m - k, TRUE);
        UpdateWindow(hEdit);
        SetFocus(hEdit);
        return 0;
 
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case ID_FILE_NEW:
            szText[0] = '\0';
            SetWindowTextA (hEdit, szText);
            StatusOut(hWndStatusBar, 0, _T(" "));
            break;
 
        case ID_FILE_OPEN:
            file.lpstrTitle = _T("Открыть файл для чтения");
            file.Flags = OFN_HIDEREADONLY;
            if (!GetOpenFileName(&file)) return 1;
            in.open(name, std::ios::binary);
            in.read(szText, 0x7fff);
            if ((m = in.gcount()) == 0x7fff)
            {
                MessageBox(hWnd, _T("Слишком большой файл"), _T("Edit"),MB_OK|MB_ICONSTOP);
                in.close();
                return 0;
            }
            szText[m] = '\0';
            in.close();
            SetWindowTextA(hEdit, szText);
            n = SendMessage(hEdit, EM_GETLINECOUNT, 0, 0);
            StatusOut(hWndStatusBar, n, name);
            break;
 
        case ID_FILE_SAVE:
            file.lpstrTitle = _T("Открыть файл для записи");
            file.Flags = OFN_NOTESTFILECREATE|OFN_HIDEREADONLY;
            if (!GetSaveFileName(&file)) return 1;
            out.open(name,std::ios::binary);
            out.close();
            n = SendMessage(hEdit, EM_GETLINECOUNT, 0, 0);
            StatusOut(hWndStatusBar, n, name);
            break;
 
        case IDM_EXIT: DestroyWindow(hWnd); break;
        default: return DefWindowProc(hWnd, messag, wParam, lParam);
        }
        break;
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default: return DefWindowProc(hWnd, messag, wParam, lParam);
    }
 
    return 0;
}
Помогите разобрать что к чему и прийти к рабочему варианту программы. Обьясните как заставить это работать или что добавить чтоб заработало.

Решение задачи: «Текстовый редактор только с win23 api»

textual
Листинг программы
#include <windows.h>
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT ("Application1");
    HWND         hwnd;
    MSG          msg;
    WNDCLASSEX   wndclassex = {0};
    wndclassex.cbSize        = sizeof(WNDCLASSEX);
    wndclassex.style         = CS_HREDRAW | CS_VREDRAW;
    wndclassex.lpfnWndProc   = WndProc;
    wndclassex.cbClsExtra    = 0;
    wndclassex.cbWndExtra    = 0;
    wndclassex.hInstance     = hInstance;
    wndclassex.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
    wndclassex.hCursor       = LoadCursor (NULL, IDC_ARROW);
    wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
    wndclassex.lpszMenuName  = NULL;
    wndclassex.lpszClassName = szAppName;
    wndclassex.hIconSm       = wndclassex.hIcon;
    
    if (!RegisterClassEx (&wndclassex))
    {
        MessageBox (NULL, TEXT ("RegisterClassEx failed!"), szAppName, MB_ICONERROR);
        return 0;
    }
    hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, 
                          szAppName, 
                          TEXT ("WindowTitle"),
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, 
                          CW_USEDEFAULT, 
                          CW_USEDEFAULT, 
                          CW_USEDEFAULT, 
                          NULL, 
                          NULL, 
                          hInstance,
                          NULL); 
                          
    ShowWindow (hwnd, iCmdShow);
    UpdateWindow (hwnd);
    
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
    }
    return msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    switch (message)
    {
    case WM_CREATE:
        return (0);
        
    case WM_PAINT:
        hdc = BeginPaint (hwnd, &ps);
        TextOut (hdc, 0, 0, "A Window!", 27);
        EndPaint (hwnd, &ps);
        return (0);
        
    case WM_DESTROY:
        PostQuitMessage (0);
        return (0);
    }
    return DefWindowProc (hwnd, message, wParam, lParam);
}

Объяснение кода листинга программы

  1. #include
  2. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  3. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  4. static TCHAR szAppName[] = TEXT (Application1);
  5. HWND hwnd;
  6. MSG msg;
  7. WNDCLASSEX wndclassex = {0};
  8. wndclassex.cbSize = sizeof(WNDCLASSEX);
  9. wndclassex.style = CS_HREDRAW | CS_VREDRAW;
  10. wndclassex.lpfnWndProc = WndProc;
  11. wndclassex.cbClsExtra = 0;
  12. wndclassex.cbWndExtra = 0;
  13. wndclassex.hInstance = hInstance;
  14. wndclassex.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  15. wndclassex.hCursor = LoadCursor (NULL, IDC_ARROW);
  16. wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
  17. wndclassex.lpszMenuName = NULL;
  18. wndclassex.lpszClassName = szAppName;
  19. wndclassex.hIconSm = wndclassex.hIcon;
  20. if (!RegisterClassEx (&wndclassex))
  21. {
  22. MessageBox (NULL, TEXT (RegisterClassEx failed!), szAppName, MB_ICONERROR);
  23. return 0;
  24. }
  25. hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW,
  26. szAppName,
  27. TEXT (WindowTitle),
  28. WS_OVERLAPPEDWINDOW,
  29. CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  30. NULL, NULL, hInstance, NULL);
  31. ShowWindow (hwnd, iCmdShow);
  32. UpdateWindow (hwnd);
  33. while (GetMessage (&msg, NULL, 0, 0))
  34. {
  35. TranslateMessage (&msg);
  36. DispatchMessage (&msg);
  37. }
  38. return msg.wParam;
  39. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  40. HDC hdc;
  41. PAINTSTRUCT ps;
  42. switch (message)
  43. {
  44. case WM_CREATE:
  45. return (0);
  46. case WM_PAINT:
  47. hdc = BeginPaint (hwnd, &ps);
  48. TextOut (hdc, 0, 0, A Window!, 27);
  49. EndPaint (hwnd, &ps);
  50. return (0);
  51. case WM_DESTROY:
  52. PostQuitMessage (0);
  53. return (0);
  54. default:
  55. return DefWindowProc (hwnd, message, wParam, lParam);
  56. }
  57. return 0;
  58. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы