Листинг 1 - файл edit.cpp

/*============================ТЕКСТОВЫЙ РЕДАКТОР=============================
          Курсовая работа по дисциплине "Операционные системы"
          Малышев Алексей, ЭВМ 2-2
  ===========================================================================*/
#include "edit.h"
#include "edit.rh"
//========================Главная функция====================================
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                     LPSTR lpszCmdParam, int nCmdShow)
{
 WNDCLASS WndClass;
 MSG Msg;
 HACCEL hAccel;
 hInst=hInstance;
 char szClassName[]="TextEdit";

 //регистрируем создаваемый класс
 //Заполняем структуру типа WNDCLASS
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 WndClass.lpfnWndProc=EditWndProc;
 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hInstance=hInstance;
 WndClass.hIcon=LoadIcon(hInstance,"IDI_ICON1");
 //WndClass.hIconSm=LoadIcon(hInstance,"IDI_ICON2");
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.lpszMenuName=MAKEINTRESOURCE(IDM_MainMenu);
 WndClass.lpszClassName=szClassName;

 if(!RegisterClass(&WndClass))
    {MessageBox(NULL,"Не удается зарегистрировать класс","Ошибка",MB_OK);
    return 0;}

 if(lpszCmdParam[0]!='\0')
    {
     for(int i=0;i<strlen(lpszCmdParam)-2;i++)
        szFileName[i]=lpszCmdParam[i+1];      //удаление кавычек из имени файла
     CmdParam=TRUE;
    }
 strcat(szMainWndTitle,szFileName);
 //Определение конфигурации
 ReadConf();

 //Создание главного окна
 hWnd=CreateWindow(szClassName,szMainWndTitle,
                   WS_OVERLAPPEDWINDOW,
                   SizeWin.left,SizeWin.top,SizeWin.right,SizeWin.bottom,
                   NULL,NULL,
                   hInstance,NULL);
 if(!hWnd)
    {
     MessageBox(NULL,"Не удается создать окно","Ошибка",MB_OK);
     return 0;
    }
 InitCommonControls();
 //создание строки состояния
 hStatusWindow=CreateStatusWindow(WS_CHILD|WS_VISIBLE,"Текстовый редактор",hWnd,wId);
 if(!hStatusWindow)
    {
     MessageBox(NULL,"Cannon create status window","Ошибка",MB_OK);
     return 0;
    }
 //Загрузка таблицы акселераторов
 hAccel=LoadAccelerators(hInst,MAKEINTRESOURCE(ACCELMNU));
 if(!maximize)
    ShowWindow(hWnd,nCmdShow);
    else
       ShowWindow(hWnd,SW_SHOWMAXIMIZED);
 UpdateWindow(hWnd);
 while(GetMessage(&Msg,NULL,0,0))
    {
    if(!TranslateAccelerator(hWnd,hAccel,&Msg))
        {
         TranslateMessage(&Msg);
         DispatchMessage(&Msg);
        }
    }
 return Msg.wParam;
 }
//====================Оконная процедура======================================
long WINAPI EditWndProc(HWND hWnd,UINT Message,UINT wParam,LONG lParam)
 {
  long EndPos;  //Позиция конца текста
  HBRUSH b;
  DLGPROC lpproc;
  RECT Rect;

  switch(Message)
  {
   case WM_COMMAND:
     {
      if(HIWORD(wParam)==EN_CHANGE)
         {
          SvF=FALSE;
          return 0;
         }
      switch(LOWORD(wParam))
         {
          //--------Файл-------------------------------------------------
          case IDM_New:
             if(SaveChange()==IDCANCEL) return 0;
             SaveFlg=FALSE;
             SvF=FALSE;
             TextLength=0;
             SendMessage(hEditWnd,WM_SETTEXT,(WPARAM)0,(LPARAM)"");
             strcpy(szFileName,"Документ1");
             //Формирование нового заголовка окна
             strcpy(szMainWndTitle,"Текстовый редактор - ");
             strcat(szMainWndTitle,szFileName);
             SendMessage(hWnd,WM_SETTEXT,(WPARAM)0,(LPARAM)szMainWndTitle);
          break;
          case IDM_Open:
             FileOpen(hWnd);
          break;
          case IDM_Save:
             FileSave(hWnd,szFileName,SaveFlg);
          break;
          case IDM_SaveAs:
             FileSave(hWnd,szFileName,FALSE);
          break;
          case IDM_Print:
             Print(hWnd);
          break;
          case IDM_Exit:
             SendMessage(hWnd,WM_CLOSE,NULL,NULL);
          break;
          //-------Формат---------------------------------------------------
          case IDM_Font:
             Font(hEditWnd);
          break;
          case IDM_BkColor:
             BkColor(hWnd);
          break;
          //-------Справка--------------------------------------------------
          case IDM_About:
             lpproc = (DLGPROC)MakeProcInstance((FARPROC)About, hInst);
             DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUT),hWnd,lpproc);
          break;
          //-------Правка---------------------------------------------------
          case IDM_Undo:
             SendMessage(hEditWnd,WM_UNDO,NULL,NULL);
          break;
          case IDM_Cut:
             SendMessage(hEditWnd,WM_CUT,NULL,NULL);
          break;
          case IDM_Copy:
             SendMessage(hEditWnd,WM_COPY,NULL,NULL);
          break;
          case IDM_Paste:
             SendMessage(hEditWnd,WM_PASTE,NULL,NULL);
          break;
          case IDM_Del:
             SendMessage(hEditWnd,WM_CLEAR,NULL,NULL);
          break;
          case IDM_SelectAll:
             EndPos=SendMessage(hEditWnd,WM_GETTEXTLENGTH,NULL,NULL)+1;
             SendMessage(hEditWnd,EM_SETSEL,0,EndPos);
          break;
         }
      return 0;
     }
   case WM_CTLCOLOREDIT:
      SetTextColor((HDC)wParam,crTextColor);//Установка цвета текста
      SetBkColor((HDC)wParam,crColor);      //Установка цвета фона
      b=CreateSolidBrush(crColor);
   return (DWORD)b;
   case WM_CLOSE:
      if(SaveChange()==IDCANCEL) return 0;
      SaveConf();//сохранение текущей конфигурации
      PostQuitMessage(0);
   return 0;
   case WM_MENUSELECT:
      if(((UINT)HIWORD(wParam)==0xFFFF)&((HMENU)lParam==0))
         {
          SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM)0,(LPARAM)"Текстовый редактор");
          return 0;
         }
      if((UINT)HIWORD(wParam)&MF_SYSMENU)
         {
          SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM)0,
                     (LPARAM)"Системное меню");
          return 0;
         }
      if((UINT)HIWORD(wParam)&MF_POPUP)
         {
          SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM)0,
                     (LPARAM)ItemsHlp[LOWORD(wParam)]);
          return 0;
         }
      return 0;
   case WM_CREATE:
      GetClientRect(hWnd,&Rect);
      hEditWnd=CreateWindow("Edit",NULL,
                            WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|
                            WS_BORDER|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL|
                            ES_AUTOVSCROLL,
                            0,0,0,0,
                            hWnd,(HMENU)ID_Edit,hInst,NULL);
      if(!hEditWnd)
         {
          MessageBox(NULL,"Не удается создать окно","Ошибка",MB_OK);
          return 0;
         }
      if(CmdParam==TRUE)
         FileOpen(NULL);
      hfFont = CreateFontIndirect( &lfTemp );
      SendMessage(hEditWnd,WM_SETFONT,(WPARAM)hfFont,NULL);//установка шрифта
   return 0;
   case WM_SIZE:
      GetClientRect(hWnd,&Rect);
      MoveWindow(hEditWnd,0,0,LOWORD(lParam),Rect.bottom-25,TRUE);
      SendMessage(hStatusWindow,WM_SIZE,wParam,lParam);
      GetClientRect(hWnd,&Rect);
   return 0;
   case WM_SETFOCUS:
      SetFocus(hEditWnd);
   return 0;
   case WM_DESTROY:
      PostQuitMessage(0);
   return 0;
  }
  //обработка сообщений по умолчанию
  return DefWindowProc(hWnd,Message,wParam,lParam);
 }
//-------------Вывод сведений об авторе программы--------------------------
BOOL CALLBACK _export About(HWND hDlg,UINT Message,WPARAM wParam,LPARAM lParam)
{
  if (Message == WM_INITDIALOG)
        return(TRUE);

    else if (Message == WM_COMMAND)
    {
  switch (GET_WM_COMMAND_ID(wParam, lParam))
  {
      case IDOK:
    EndDialog(hDlg, TRUE);
    return(TRUE);

      default:
    return(TRUE);
  }
    }

    return(FALSE);
}


Листинг 2 - файл edit.h

#ifndef _EDIT_H
#define _EDIT_H

#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <string.h>
#include <commctrl.h>
#include <fstream.h>

#define ID_Edit 1001

//-----------------------Глобальные переменные------------------------------
char* ItemsHlp[]=
   {"Операции с файлом",
    "Редактирование текста",
    "Изменение шрифта",
    "Информация о программе"
    };
 char szFileName[256]="Документ1";
 char szMainWndTitle[277]="Текстовый редактор - ";//заголовок окна
 bool SaveFlg=FALSE;//Признак сохранения файла
 bool SvF=FALSE;
 bool CmdParam=FALSE; //признак наличия параметра в командной строке
 long TextLength; //длина текста в окне
 int maximize=0;  //отображение окна (развернуто,свернуто)
 ofstream fout;

HWND hEditWnd; //дескриптор окна редактирования
HWND hWnd;
RECT SizeWin; //Структура для размера окна

HWND hStatusWindow; //дескриптор строки состояния
UINT wId;
HINSTANCE hInst;

COLORREF crColor;     //цвет фона
COLORREF crTextColor; //цвет текста
COLORREF crCustColors[16]; //дополнительные цвета в диалоге выбора цвета
HFONT hfFont;
//BOOL tfFontLoaded;
LOGFONT lfTemp={-16,0,0,0,400,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,
                CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,
                "Times New Roman"};

//----------------------------Функции---------------------------------------
long WINAPI EditWndProc(HWND,UINT,UINT,LONG);//оконная функция
//вывод сведений об авторе
BOOL CALLBACK About(HWND hDlg,UINT Message,WPARAM wParam,LPARAM lParam);
int SaveChange();      //Функция, проверяющая, сохранение изменений в файле
void SaveConf();  //Сохранение параметров конфигурации
void ReadConf();  //Чтение файла конфигурации

void FileOpen(HWND hWnd);// Открытие файла
int FileSave(HWND hWnd,char* filename,bool &SaveFlg);//сохранение файла
void Font( HWND hWnd );//Изменение шрифта
void BkColor( HWND hWnd );//установка цвета фона

#include "lib.cpp"

#endif

Листинг 3 - файл lib.cpp

#ifndef _LIB_CPP
#define _LIB_CPP
#include "edit.h"
#include "edit.rh"

//-----------------Открытие файла--------------------------------------------
void FileOpen(HWND hWnd)
{
  OPENFILENAME ofnTemp;
  DWORD Errval;
  char buf[5];
  char Errstr[256]="GetOpenFileName возвратила ошибку #";
  char szTemp[] = "Текстовые файлы (*.txt)\0*.txt\0Все файлы (*.*)\0*.*\0";

  HANDLE handle;    //дескриптор файла
  DWORD FileSize;  //размер файла
  LPVOID lpBuffer;        //буфер для данных

  if(hWnd!=NULL)
  {
  if(SaveChange()==IDCANCEL) return;
  ofnTemp.lStructSize = sizeof( OPENFILENAME );
  ofnTemp.hwndOwner = hWnd;
  ofnTemp.hInstance = 0;
  ofnTemp.lpstrFilter = (LPSTR)szTemp;
  ofnTemp.lpstrCustomFilter = NULL;
  ofnTemp.nMaxCustFilter = 0;
  ofnTemp.nFilterIndex = 1;
  ofnTemp.lpstrFile = (LPSTR)szFileName;
  ofnTemp.nMaxFile = sizeof( szFileName );
  ofnTemp.lpstrFileTitle = NULL;
  ofnTemp.nMaxFileTitle = 0;
  ofnTemp.lpstrInitialDir = NULL;
  ofnTemp.lpstrTitle = "Открыть";  // Заголовок диалога
  ofnTemp.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;
  ofnTemp.nFileOffset = 0;
  ofnTemp.nFileExtension = 0;
  ofnTemp.lpstrDefExt = "*";
  ofnTemp.lCustData = 0L;
  ofnTemp.lpfnHook = NULL;
  ofnTemp.lpTemplateName = NULL;

  if(GetOpenFileName( &ofnTemp ) != TRUE)
  {
    Errval=CommDlgExtendedError();
    if(Errval!=0)
    {
      sprintf(buf,"%ld",Errval);
      strcat(Errstr,buf);
      MessageBox(hWnd,Errstr,"WARNING",MB_OK|MB_ICONSTOP);
    }
    else return;

  }
  InvalidateRect( hWnd, NULL, TRUE );
  }
  //Открытие файла
  handle=CreateFile(szFileName,     //имя файла
                    GENERIC_READ,   //режим доступа
                    FILE_SHARE_READ,//совместое использование для чтения
                    NULL,
                    OPEN_EXISTING,  //открывает файл существующий файл
                    NULL,           //атрибуты файла
                    NULL            //дескриптор шаблона файла
                   );
  if(handle==INVALID_HANDLE_VALUE)
      {strcpy(Errstr,"Ошибка при открытии файла \' ");
       strcat(Errstr,szFileName);
       strcat(Errstr," \'");
       MessageBox(NULL,Errstr,"Ошибка",MB_OK|MB_ICONSTOP);
       return;}
  GetFileSize(handle,&FileSize); FileSize=65535;
  lpBuffer=new char[FileSize];
  if(ReadFile(handle, //дескриптор файла
              lpBuffer, //буфер для данных
              FileSize, //размер буфера
              &FileSize, //число прочитанных байтов
              NULL
              )==0)
           {MessageBox(hWnd,"Ошибка при чтении файла!","Ошибка",MB_OK|MB_ICONSTOP);
            return;}
  
  SendMessage(hEditWnd,WM_SETTEXT,(WPARAM)0,(LPARAM)lpBuffer);

  //Формирование нового заголовка окна
  strcpy(szMainWndTitle,"Текстовый редактор - ");
  strcat(szMainWndTitle,szFileName);
  SendMessage(hWnd,WM_SETTEXT,(WPARAM)0,(LPARAM)szMainWndTitle);

  CloseHandle(handle);
  TextLength=FileSize;
  SaveFlg=TRUE;
  SvF=TRUE;
  delete lpBuffer;
}
//-----------------Сохранение файла--------------------------------------------
int FileSave(HWND hWnd,char* filename,bool &SaveFlg)
{
 OPENFILENAME SaveFl;
  DWORD Errval; // переменная для кода ошибки
  char buf[5];
  char Errstr[50]="GetSaveFileName возвратила ошибку #";
  char szTemp[] = "Текстовые файлы (*.txt)\0*.txt\0Все файлы (*.*)\0*.*\0";
  char ReplMsg[300];//строка для сообщения о перезаписи файла
  char OllFilename[256]; //старое имя файла

  strcpy(OllFilename,filename);

  if(SaveFlg==FALSE)
     {
      SaveFl.lStructSize = sizeof( OPENFILENAME );
      SaveFl.hwndOwner = hWnd;
      SaveFl.hInstance = 0;
      SaveFl.lpstrFilter = (LPSTR)szTemp;
      SaveFl.lpstrCustomFilter = NULL;
      SaveFl.nMaxCustFilter = 0;
      SaveFl.nFilterIndex = 1;
      SaveFl.lpstrFile = (LPSTR)filename;  // имя файла
      SaveFl.nMaxFile =256;
      SaveFl.lpstrFileTitle = NULL;
      SaveFl.nMaxFileTitle = 0;
      SaveFl.lpstrInitialDir = NULL;
      SaveFl.lpstrTitle = "Сохранить";  // Заголовок диалога
      SaveFl.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;
      SaveFl.nFileOffset = 0;
      SaveFl.nFileExtension = 0;
      SaveFl.lpstrDefExt = "*";
      SaveFl.lCustData = 0L;
      SaveFl.lpfnHook = NULL;
      SaveFl.lpTemplateName = NULL;

  m:  if(GetSaveFileName( &SaveFl )!=TRUE)
         {
          Errval=CommDlgExtendedError();
          if(Errval!=0) // нулевое значение означает, что нажата Отмена
             {
              sprintf(buf,"%ld",Errval);
              strcat(Errstr,buf);
              MessageBox(hWnd,Errstr,"WARNING",MB_OK|MB_ICONSTOP);
              InvalidateRect( hWnd, NULL, TRUE );
              return 1;
             }
          else
             {strcpy(filename,OllFilename);
              InvalidateRect( hWnd, NULL, TRUE );
              return 2;}
         }
      InvalidateRect( hWnd, NULL, TRUE );

      //Открытие нового файла
      fout.open(filename,ios::noreplace);
      if(!fout)
         {
          strcpy(ReplMsg,"Файл \' ");
          strcat(ReplMsg,filename);
          strcat(ReplMsg," \' уже существует.\nЗаменить существующий файл новым?");
          if(MessageBox(hWnd,ReplMsg,"Текстовый редактор",MB_YESNO|MB_ICONQUESTION)==IDNO)
             goto m; //файл не заменяется. Предлагается ввести другое имя
          else //если существующий файл заменяется новым
             {
              fout.open(filename);
              if(!fout)
                 {MessageBox(hWnd,"Ошибка при создании файла","Ошибка",
                  MB_OK|MB_ICONERROR);
                  strcpy(filename,OllFilename);return 1;}
             }
         }
     }
  else
     {
      //Открытие существующего файла для сохранения изменений 
      fout.open(filename);
      if(!fout)
         {MessageBox(hWnd,"Ошибка при сохранении изменений в файле","Ошибка",
          MB_OK|MB_ICONERROR);strcpy(filename,OllFilename);return 1;}
     }
  //Запись в файл
  TextLength=SendMessage(hEditWnd,WM_GETTEXTLENGTH,NULL,NULL)+1;
  char* bufer=new char[TextLength];
  SendMessage(hEditWnd,WM_GETTEXT,TextLength,(LPARAM)bufer);
  for(long i=0;i<TextLength;i++)
     {if(bufer[i]=='\r'&&bufer[i+1]=='\r')
        {while(bufer[i]=='\r')i++;
         fout<<'\r';}
     fout<<bufer[i];}
  fout.close();
  SaveFlg=TRUE;
  SvF=TRUE;
  //Формирование нового заголовка окна
  strcpy(szMainWndTitle,"Текстовый редактор - ");
  strcat(szMainWndTitle,filename);
  SendMessage(hWnd,WM_SETTEXT,(WPARAM)0,(LPARAM)szMainWndTitle);
  delete bufer;
  TextLength--;
  return 0;
}
//--------Функция, проверяющая, сохранены ли изменения в файле----------------
int SaveChange()
{
 int id=-1;
 //long Length;
 //Length=SendMessage(hEditWnd,WM_GETTEXTLENGTH,NULL,NULL);
 char str[300]="Файл \' ";
 //if(TextLength!=Length)
 if(SvF==FALSE&&SendMessage(hEditWnd,WM_GETTEXTLENGTH,NULL,NULL)!=0)
    {strcat(str,szFileName);
     strcat(str," \' был изменен.\nСохранить изменения в файле?");
     id=MessageBox(hWnd,str,"Текстовый редактор",
                   MB_YESNOCANCEL|MB_ICONEXCLAMATION);
     if(id==IDYES)
        if(FileSave(hWnd,szFileName,SaveFlg)) return IDCANCEL;
        return id;
    }
 return id;
}
//---------------------------Изменение шрифта--------------------------------
void Font( HWND hWnd )
{
  static CHOOSEFONT cfTemp;

 cfTemp.lStructSize = sizeof( CHOOSEFONT );
 cfTemp.hwndOwner = hWnd;
 cfTemp.hDC = 0;
 cfTemp.lpLogFont = &lfTemp; //адрес структуры для результатов выбора шрифта
 cfTemp.Flags = CF_FORCEFONTEXIST | CF_SCREENFONTS|CF_INITTOLOGFONTSTRUCT|CF_EFFECTS;
 cfTemp.rgbColors = crTextColor; // Цвет текста
 cfTemp.lCustData = 0L;
 cfTemp.lpfnHook = NULL;
 cfTemp.lpTemplateName = NULL;
 cfTemp.hInstance = 0;
 cfTemp.lpszStyle = NULL;
 cfTemp.nFontType = SCREEN_FONTTYPE;
 cfTemp.nSizeMin = 0;
 cfTemp.nSizeMax = 0;

  if( ChooseFont( &cfTemp ) == TRUE )
  {
   hfFont = CreateFontIndirect( &lfTemp ); //создание шрифта с выбранными параметрами
   SendMessage(hEditWnd,WM_SETFONT,(WPARAM)hfFont,NULL);//установка шрифта в окне
   crTextColor=cfTemp.rgbColors;//установка цвета шрифта
  }
  InvalidateRect( hWnd, NULL, TRUE );
}
//------------------------установка цвета фона--------------------------------
void BkColor( HWND hWnd )
{
  CHOOSECOLOR ccTemp;

  ccTemp.lStructSize = sizeof( CHOOSECOLOR );
  ccTemp.hwndOwner = hWnd;
  ccTemp.hInstance = 0;
  ccTemp.rgbResult = crColor; // CC_RGBINIT flag makes this the default color
  ccTemp.lpCustColors = crCustColors;
  ccTemp.Flags = CC_PREVENTFULLOPEN | CC_RGBINIT;
  ccTemp.Flags = CC_RGBINIT;
  ccTemp.lCustData = 0L;
  ccTemp.lpfnHook = NULL;
  ccTemp.lpTemplateName = NULL;
  if( ChooseColor( &ccTemp ) == TRUE )
     crColor = ccTemp.rgbResult;
  InvalidateRect( hWnd, NULL, TRUE );
}
//------------------------------Печать-----------------------------------------
void Print(HWND hWnd)
{
 static PRINTDLG PrintTxt;
 HDC hdcPrint;

 int iPhysicalWidth; //Ширина страницы
 int iPhysicalHeight;//высота страницы

 int LeftOffset=0;
 int TopOffset=0;     //отступы от краев страницы
 int RightOffset=0;
 int BottomOffset=0;
 RECT rect; //размеры страницы
 //int iLogPixX; //число пикселов на дюйм
 //int iLogPixY;
 
 SIZE size={0,0};
 char *String;
 UINT StrLength;
 char *buffer;

 DWORD Errval;
 char buf[5];
 char Errstr[256]="PrintDlg возвратила ошибку #";

 PrintTxt.lStructSize=sizeof(PrintTxt); //размер структуры
 PrintTxt.hwndOwner=hWnd;                //дескриптор окна
 PrintTxt.hDevMode=NULL;//hDvMd;
 PrintTxt.hDevNames=NULL;//hDvNames;
 PrintTxt.hDC=hdcPrint;                 //дескриптор контекста устройства
 PrintTxt.Flags=PD_RETURNDC;//|PD_PAGENUMS  ;     //флаги
 PrintTxt.nFromPage=0;
 PrintTxt.nToPage=0;
 PrintTxt.nMinPage=1;
 PrintTxt.nMaxPage=2;
 PrintTxt.nCopies=1;

 if(PrintDlg(&PrintTxt)!=TRUE)
 {
    Errval=CommDlgExtendedError();
    if(Errval!=0)
    {
      sprintf(buf,"%ld",Errval);
      strcat(Errstr,buf);
      MessageBox(hWnd,Errstr,"WARNING",MB_OK|MB_ICONSTOP);
    }
 }
 else
    {
     hdcPrint=PrintTxt.hDC;

    iPhysicalWidth=GetDeviceCaps(hdcPrint,PHYSICALWIDTH);
    iPhysicalHeight=GetDeviceCaps(hdcPrint,PHYSICALHEIGHT);
    rect.left=GetDeviceCaps(hdcPrint,PHYSICALOFFSETX)+LeftOffset;
    rect.top=GetDeviceCaps(hdcPrint,PHYSICALOFFSETY)+TopOffset;
    rect.right=GetDeviceCaps(hdcPrint,PHYSICALWIDTH)-rect.left-RightOffset;
    rect.bottom=GetDeviceCaps(hdcPrint,PHYSICALHEIGHT)-rect.top-BottomOffset;
    //iLogPixX=GetDeviceCaps(hdcPrint,LOGPIXELSX);
    //iLogPixY=GetDeviceCaps(hdcPrint,LOGPIXELSY);
    //чтение текста в буфер
    TextLength=SendMessage(hEditWnd,WM_GETTEXTLENGTH,NULL,NULL)+1;
    buffer=new char[TextLength];
    String=new char[TextLength];
    SendMessage(hEditWnd,WM_GETTEXT,TextLength,(LPARAM)String);
    for(long i=0,j=0;i<TextLength;i++)
     {if(String[i]=='\r'&&String[i+1]=='\r')
        {while(String[i]=='\r')i++;
         buffer[j]='\r';j++;}
     buffer[j]=String[i];j++;}

    UINT BegPos=0,BegStr=0,PrevBegPos=0,PrevEndPos=0;;
    int n=0,NumbStr=0;
    StrLength=0;
    bool p=FALSE;
    //Печать
    Escape(hdcPrint, STARTDOC, 8, szFileName, NULL);
    for(UINT i=0;i<TextLength;i++)
       {
        UINT k=0;
        StrLength=0;
        p=FALSE;
        while(buffer[i]!='\n'&&i<TextLength)
           {
            String[k]=buffer[i+BegPos];
            if(buffer[i]!='\r')StrLength++;
            i++;k++;
           }
        PrevBegPos=BegPos;
        BegPos=i;
        if(StrLength==0)GetTextExtentPoint32(hdcPrint,String,1,&size);
        else GetTextExtentPoint32(hdcPrint,String,StrLength,&size);
        n=(size.cx%iPhysicalWidth!=0)?((size.cx/iPhysicalWidth)+1):
          (size.cx/iPhysicalWidth);
        NumbStr+=n*size.cy;
        if(NumbStr/iPhysicalHeight>=1)
           {
            UINT k=0;
            for(UINT j=BegStr;j<PrevBegPos;j++,k++)
               String[k]=buffer[j];
            DrawText(hdcPrint,String,-1,&rect,DT_WORDBREAK);
            Escape(hdcPrint, NEWFRAME, 0, NULL, NULL);
            NumbStr=0;
            p=TRUE;
            PrevEndPos=PrevBegPos;
           }
       }
    //Печать последней неполной страницы 
    if(p==FALSE)
       {
        UINT k=0;
        for(UINT j=PrevEndPos;j<TextLength;j++,k++)
               String[k]=buffer[j];
        DrawText(hdcPrint,String,-1,&rect,DT_WORDBREAK);
        Escape(hdcPrint, NEWFRAME, 0, NULL, NULL);
       }
    Escape(hdcPrint, ENDDOC, 0, NULL, NULL);
    delete buffer;
    delete String;

    DeleteDC(hdcPrint);
    TextLength--;
  }
}
//----------------Сохранение конфигурации-----------------------------------
void SaveConf()
{
 ofstream out;
 out.open("Editconf.ini");
 if(!out)
    MessageBox(NULL,"Не удается сохранить текущую конфигурацию",
               "Текстовый редактор",MB_OK|MB_ICONEXCLAMATION);
    else
       {
        out<<IsZoomed(hWnd)<<'\t';
        ShowWindow(hWnd,SW_SHOWNORMAL);
        GetWindowRect(hWnd,&SizeWin);
        out<<SizeWin.left<<'\t';
        out<<SizeWin.top<<'\t';
        out<<SizeWin.right-SizeWin.left<<'\t';
        out<<SizeWin.bottom-SizeWin.top<<'\n';
        out<<hex<<crColor<<'\t'<<crTextColor<<'\t';
        for(int i=0;i<16;i++)
           out<<crCustColors[i]<<'\t';
        out<<dec<<lfTemp.lfHeight<<'\t'
           <<lfTemp.lfWidth<<'\t'
           <<lfTemp.lfEscapement<<'\t'
           <<lfTemp.lfOrientation<<'\t'
           <<lfTemp.lfWeight<<'\t'
           <<(unsigned char)lfTemp.lfItalic<<'\t'
           <<lfTemp.lfUnderline<<'\t'
           <<lfTemp.lfStrikeOut<<'\t'
           <<lfTemp.lfCharSet<<'\t'
           <<lfTemp.lfOutPrecision<<'\t'
           <<lfTemp.lfClipPrecision<<'\t'
           <<lfTemp.lfQuality<<'\t'
           <<lfTemp.lfPitchAndFamily<<'\n';
        out<<lfTemp.lfFaceName<<'\n';

        out.close();
       }
}
//-----------------Чтение параметров конфигурации из файла------------------
void ReadConf()
{
 ifstream in;//поток для чтения файла конфигурации
 in.open("Editconf.ini");
 if(!in)
    {MessageBox(NULL,"Не удается открыть файл конфигурации \'Editconf.ini\'",
               "Текстовый редактор",MB_OK|MB_ICONEXCLAMATION);
    //установка конфигурации по умолчанию
     maximize=0;//SW_SHOWNORMAL;
     SizeWin.left=CW_USEDEFAULT;
     SizeWin.top=CW_USEDEFAULT;
     SizeWin.right=CW_USEDEFAULT;
     SizeWin.bottom=CW_USEDEFAULT;
     crColor=0xFFFFFF;crTextColor=0x000000;
     for(int i=0;i<16;i++)
        crCustColors[i]=0xFFFFFF;
    }
    else
       { //считывание последней сохраненной конфигурации
        in>>maximize;
        in>>SizeWin.left;
        in>>SizeWin.top;
        in>>SizeWin.right;
        in>>SizeWin.bottom;
        in>>hex>>crColor>>crTextColor;
        for(int i=0;i<16;i++)
           in>>crCustColors[i];
        in>>dec>>lfTemp.lfHeight
               >>lfTemp.lfWidth
               >>lfTemp.lfEscapement
               >>lfTemp.lfOrientation
               >>lfTemp.lfWeight
               >>lfTemp.lfItalic
               >>lfTemp.lfUnderline
               >>lfTemp.lfStrikeOut
               >>lfTemp.lfCharSet
               >>lfTemp.lfOutPrecision
               >>lfTemp.lfClipPrecision
               >>lfTemp.lfQuality
               >>lfTemp.lfPitchAndFamily;
        in.getline(lfTemp.lfFaceName,100,'\n');
        in.getline(lfTemp.lfFaceName,100,'\n');
        in.close();
       }
}

#endif




















Листинг 4 - файл edit.rc

/****************************************************************************


edit.rc

produced by Borland Resource Workshop


*****************************************************************************/

#define IDB_BITMAP1	3001

#define IDC_STATICTEXT1	101
#define IDD_ABOUT	1
#define IDC_STATICTEXT2	102
#define IDC_STATICBITMAP1	101
#define IDD_DIALOG1	101

#define ACCELMNU	1
#define IDM_MainMenu	1


#define IDM_New 101
#define IDM_Open 102
#define IDM_Save 103
#define IDM_SaveAs 104
#define IDM_Print 107
#define IDM_Exit 108

#define IDM_About 901

#define IDM_Undo 201
#define IDM_Cut 203
#define IDM_Copy 204
#define IDM_Paste 205
#define IDM_Del 206
#define IDM_SelectAll 207

#define IDM_Font 301
#define IDM_BkColor 302

IDM_MainMenu MENU
{
 POPUP "&Файл"
 {
  MENUITEM "Созд&ать\aCtrl+N", IDM_New
  MENUITEM "&Открыть\aCtrl+O", IDM_Open
  MENUITEM "&Сохранить\aCtrl+S", IDM_Save
  MENUITEM "Сохранить &как...", IDM_SaveAs
  MENUITEM SEPARATOR
  MENUITEM "&Печать...\aCtrl+P", IDM_Print
  MENUITEM SEPARATOR
  MENUITEM "В&ыход\aCtrl+Q",IDM_Exit
 }

 POPUP "&Правка"
 {
  MENUITEM "&Отменить\aCtrl+Z", IDM_Undo
  MENUITEM SEPARATOR
  MENUITEM "&Вырезать\aCtrl+X", IDM_Cut
  MENUITEM "&Копировать\aCtrl+C", IDM_Copy
  MENUITEM "Вст&авить\aCtrl+V", IDM_Paste
  MENUITEM "&Удалить\aDel",IDM_Del
  MENUITEM "Выделить в&се\aCtrl+A", IDM_SelectAll
 }

 POPUP "Фор&мат"
 {
  MENUITEM "&Шрифт...", IDM_Font
  MENUITEM "&Цвет фона...", IDM_BkColor
 }

 POPUP "&Справка"
 {
  MENUITEM "&О прграмме\aF1", IDM_About
 }

}

ACCELMNU ACCELERATORS
{
 "^q", IDM_Exit, ASCII
 "^o",IDM_Open,ASCII
 "^a",IDM_SelectAll,ASCII
 "^n",IDM_New
 "^s",IDM_Save
 "^p",IDM_Print
 VK_F1, IDM_About, VIRTKEY
}

IDD_ABOUT DIALOG 150, 100, 251, 132
STYLE DS_3DLOOK | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION
CAPTION "О программе"
FONT 9, "MS Sans Serif"
{
 CONTROL "OK", IDOK, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 152, 104, 50, 14
 CONTROL "Курсовая работа\n по Операционным Системам\n\n©Малышев Алексей, ЭВМ2-2,\nМГТУГА, Москва 2007 ", IDC_STATICTEXT2, "static", SS_CENTER | WS_CHILD | WS_VISIBLE, 123, 48, 104, 42
 CONTROL IDB_BITMAP1, -1, "STATIC", SS_BITMAP | WS_CHILD | WS_VISIBLE, 5, 4, 100, 123
 CONTROL "ТЕКСТОВЫЙ РЕДАКТОР", IDC_STATICTEXT1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 132, 28, 92, 10
}

IDI_ICON ICON txt.ico
IDB_BITMAP1 BITMAP txt.bmp

IDI_ICON1 ICON
{
 //битовая матрица иконки
}










Листинг 5 - файл edit.rh

#define IDB_BITMAP1	3001

#define IDC_STATICTEXT1	101
#define IDD_ABOUT	1
#define IDC_STATICTEXT2	102
#define IDC_STATICBITMAP1	101
#define IDD_DIALOG1	101

#define ACCELMNU	1
#define IDM_MainMenu	1

#define IDM_New 101
#define IDM_Open 102
#define IDM_Save 103
#define IDM_SaveAs 104
#define IDM_Print 107
#define IDM_Exit 108

#define IDM_About 901

#define IDM_Undo 201
#define IDM_Cut 203
#define IDM_Copy 204
#define IDM_Paste 205
#define IDM_Del 206
#define IDM_SelectAll 207

#define IDM_Font 301
#define IDM_BkColor 302



























Листинг 6 - файл определения модуля edit.def

EXETYPE WINDOWS //тип приложения
/*сегмент загружается в память при запуске приложения, он может быть перемещен или выгружен, чтобы освободить пространство в памяти*/
CODE PRELOAD MOVEABLE DISCARDABLE
/* существует несколько сегментов данных, загружающихся автоматически заранее, возможно перемещение сегментов*/
DATA PRELOAD MOVEABLE MULTIPLE
HEATSIZE 4096  //размер локальной динамической иамяти
STACKSIZE 8192  //размер стека
