Текстовый редактор только с 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); }
Объяснение кода листинга программы
- #include
- 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);
- default:
- return DefWindowProc (hwnd, message, wParam, lParam);
- }
- return 0;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д