// Листинг 2.1. Просмотрщик файлов с диалогом выбора имени #include #include #include #include const int LineHeight = 16;//Высота строки текста + межстрочное расстояние LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId; PAINTSTRUCT ps; HDC hdc; static TCHAR name[256] = _T("");; static OPENFILENAME file; std::ifstream in; std::ofstream out; static std::vector v; std::vector::iterator it; std::string st; int y; switch (message) { case WM_CREATE: file.lStructSize = sizeof(OPENFILENAME); file.hInstance = hInst; file.lpstrFilter = _T("Text\0*.txt"); file.lpstrFile = name; file.nMaxFile = 256; file.lpstrInitialDir = _T(".\\"); file.lpstrDefExt = _T("txt"); break; case WM_COMMAND: wmId = LOWORD(wParam); switch (wmId) { case ID_FILE_NEW : if (!v.empty()) std::vector().swap(v); InvalidateRect(hWnd, NULL, TRUE); break; case ID_FILE_OPEN : file.lpstrTitle = _T("Открыть файл для чтения"); file.Flags = OFN_HIDEREADONLY; if (!GetOpenFileName(&file)) return 1; in.open(name); while (getline(in,st)) v.push_back(st); in.close(); InvalidateRect(hWnd,NULL,1); break; case ID_FILE_SAVE : file.lpstrTitle = _T("Открыть файл для записи"); file.Flags = OFN_NOTESTFILECREATE; if (!GetSaveFileName(&file)) return 1; out.open(name); for (it = v.begin(); it != v.end(); ++it) out << *it << '\n'; out.close(); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); for (y = 0, it = v.begin(); it < v.end(); ++it, y += LineHeight) TextOutA(hdc, 0, y, it->data(), it->length()); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }