Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RichEdit, что это и с чем его едят? 
:(
    Опции темы
ZC1989
  Дата 24.12.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: 1
Всего: 1



Расскажите про RichEdit. Что нужно для того чтоб он работал по-человечески (у меня диалог не открывается, если Рич на нём), как выводить в нем графику и писать формулы? Желательно с, хотя бы, минимальными примерами, а-то я впервые лицом к лицу м ним столкнулся… smile 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Aleksandor
Дата 24.12.2006, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 10
Всего: 12



 У меня как-то так


CONTROL         "",IDC_RICHEDIT1,"RichEdit20A",WS_BORDER | WS_VSCROLL | 
                    WS_HSCROLL | WS_TABSTOP | 0x1084,6,128,299,106


INITCOMMONCONTROLSEX icex;

   icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
   icex.dwICC   = ICC_NATIVEFNTCTL_CLASS|ICC_WIN95_CLASSES|ICC_PROGRESS_CLASS|ICC_COOL_CLASSES|ICC_BAR_CLASSES|ICC_USEREX_CLASSES|ICC_INTERNET_CLASSES|ICC_DATE_CLASSES;
   InitCommonControlsEx(&icex);


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
586
Дата 24.12.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(ZC1989 @  24.12.2006,  12:35 Найти цитируемый пост)
у меня диалог не открывается, если Рич на нём

Библиотека riched20.dll должна быть загружена к моменту создания контрола.
Код

if(LoadLibrary("riched20.dll"))
{
  // создание диалога
} else {
  // ошибка
}


Это сообщение отредактировал(а) 586 - 24.12.2006, 13:26
PM   Вверх
ZC1989
Дата 24.12.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: 1
Всего: 1



586, у меня ошибки нет! типа всё нормально, я и длл"ку кинул в коталог проги, ничего...
Диалог откроется только если в свойствах поставить флажок No fail create, но и Рича я не вижу smile

Добавлено @ 13:44 
Aleksandor, с твоими настройками контрола у меня диалог отобразился, получилось тест в него передать, но вот 
Цитата

INITCOMMONCONTROLSEX

у меня  этот класс не инициализировался... 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
jonie
Дата 25.12.2006, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Цитата

.... Так как richedit контрол имеет так много особенностей, он сохранен в отдельной DLL-библиотеке. Это также означает что, чтобы его использовать, вам недостаточно просто вызывать InitCommonControls, как в других Common-контролах. Вы должны вызвать LoadLibrary, чтобы загрузить richedit DLL.....
(с) Iczelion
Но имхо это старый метод...

а вообще manifest нужен для работы со "стильными" RichEdit...
Цитата

To use visual styles with these controls, an application must include a manifest and must call InitCommonControls at the beginning of the program. 
MDSN.



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ZC1989
Дата 25.12.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: 1
Всего: 1



jonie, я давно уже понял что Рич это не пушной зверёк как обычный Едит...

мне нужно, и как можно быстрее, сделать рабочий Рич, в котором помимо текста будут писаться, как минимум, формулы, а в идеале ещё и графика должна выводиться...

можете сказать что надо почитать для знакомства с Рич? и куда копать что бы это сотворить? smile 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
jonie
Дата 25.12.2006, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Вообще говоря RichEdit врядли позволит "просто" хранить формулы... я пологаю придется вставлять либо растровый рисунок либо векторный с ее изображением. Либо прорисовывать формулу самому (встает вопрос о необходимости RichEdit и количестве геммороя...)...как вариант внедрять объекты в rtf-ник (порыть  сторону MathType || MS Equalation 3.0 (входит в состав MS Office)).
для делфы есть готовые модули.. поищи там:
http://72.21.54.66/asp/section.asp?id=1
а оттуда и на С++ написать можна)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ZC1989
Дата 25.12.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: 1
Всего: 1



jonie, вариант хранения формул в графике был у меня изначально, но потом, на этом форуме, мне сказали что можно другим размером шрифта их писать... так ли это или же на самом дела проще графикой их рисовать, но тогда вопрос как шрифт в графику перевести?


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
jonie
Дата 25.12.2006, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



хы... напиши мне \frac{x^{\frac{2}{3}}{y^{2_3}} разным размером обойдясь... можно писать простейшие .. типа степени простой или нижнего индекса. Для чего-то более серьезного (дроби, суммы, произвеления, интегралы и т.п.) надо что-то поможнее использовать)
Цитата

но тогда вопрос как шрифт в графику перевести?
один топик - один вопрос.
---
гы.. а форму TeX парсера-то и неимеет... привычка(
и проще имхо встроить объект.

Это сообщение отредактировал(а) jonie - 25.12.2006, 14:11


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ZC1989
Дата 25.12.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: 1
Всего: 1



jonie, ладно, буду формузы хранить в графике, гемора меньше... тогда вопрос по теме, как запихнуть в Рич картинку и как получить доступ к настройкам внешнего вида Рича?


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Aleksandor
Дата 25.12.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 10
Всего: 12



Поищи в MSDN по слову REOBJECT


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
Flay
Дата 25.12.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.12.2006

Репутация: нет
Всего: нет



PM MAIL   Вверх
Edik
Дата 30.12.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 13.9.2006

Репутация: нет
Всего: 1



во, даю реальный код. с ресурсами и с++, так же не забудь проинициализировать библиотеку как тебе говорили (она есть в коде) и плюс еще поставь как у меня InitCommonControl.сам недавно с ричь эдитом возился- мне спадобалось! smile там прога с русскими коментами- они глючат, не обращай внимания. я тебе прогу в двух кусках сляпал потому что сайт говорить, что сообщение очень большое- продолжение проги и следующем посте.
Код

#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"
#include "afxres.h"


LRESULT CALLBACK MyWndProc (HWND, UINT, WPARAM, LPARAM) ;
DWORD CALLBACK OpenCallback(DWORD, LPBYTE, LONG, LONG*);
DWORD CALLBACK SaveCallback(DWORD, LPBYTE, LONG, LONG*);
void FileOpen(HWND);
void FileSaveAs(HWND);
void FilePrint(HWND);

HINSTANCE hInstance;
HINSTANCE hInst;
HWND hRichEdit;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
     {
     static char  szAppName[] = "My" ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASSEX   wndclass ;

     wndclass.cbSize        = sizeof (wndclass) ;
     wndclass.style         = CS_HREDRAW | CS_VREDRAW;
     wndclass.lpfnWndProc   = (WNDPROC)MyWndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = DLGWINDOWEXTRA ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_ICON1)) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;
     wndclass.hIconSm       = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_ICON1)) ;

     RegisterClassEx (&wndclass) ;

     hwnd=CreateDialog(hInstance, "My", 0, NULL);
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow(hwnd);     
        
     InitCommonControls();
     hInst=hInstance;

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



LRESULT CALLBACK MyWndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
     {

    HINSTANCE hLibrary;
    CHARFORMAT CharFormat;
    PARAFORMAT ParaFormat;
    HWND hRichEdit;
    CHOOSEFONT ChooseFontStructure;
    LOGFONT LogFont;
    HDC hDC;

    switch (iMsg)
          {
        case WM_CREATE :
    
            hLibrary=LoadLibrary("riched32.dll");

        return 0;


        case WM_PAINT:

        break;

        case WM_DESTROY :
        FreeLibrary(hLibrary);
        PostQuitMessage (0) ;
        return 0 ;
        
        case WM_COMMAND:


            if (LOWORD (wParam) == IDC_BUTTON1) 
            { 
                FreeLibrary(hLibrary);
                PostQuitMessage (0) ;
                return 0;
                break;
            }


            if (LOWORD (wParam) == IDC_BUTTON2) 
            { 
                hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
                CharFormat.cbSize=sizeof(CHARFORMAT);
                CharFormat.dwMask=CFM_BOLD;
                SendMessage(hRichEdit, EM_GETCHARFORMAT, TRUE,
                    (LPARAM)&CharFormat);
                CharFormat.dwMask=CFM_BOLD;
                CharFormat.dwEffects^=CFE_BOLD;
                SendMessage(hRichEdit, EM_SETCHARFORMAT,
                    SCF_SELECTION,(LPARAM)&CharFormat);
                break;
            }

            
            if (LOWORD (wParam) == IDC_BUTTON3)
            {
                hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
                CharFormat.cbSize=sizeof(CHARFORMAT);
                CharFormat.dwMask=CFM_ITALIC;
                SendMessage(hRichEdit, EM_GETCHARFORMAT, TRUE,
                    (LPARAM)&CharFormat);
                CharFormat.dwMask=CFM_ITALIC;
                CharFormat.dwEffects^=CFE_ITALIC;
                SendMessage(hRichEdit, EM_SETCHARFORMAT,
                    SCF_SELECTION,(LPARAM)&CharFormat);
                break;
            }

            if (LOWORD (wParam) == IDC_BUTTON4)
            {
                hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
                CharFormat.cbSize=sizeof(CHARFORMAT);
                CharFormat.dwMask=CFM_UNDERLINE;
                SendMessage(hRichEdit, EM_GETCHARFORMAT, TRUE,
                    (LPARAM)&CharFormat);
                CharFormat.dwMask=CFM_UNDERLINE;
                CharFormat.dwEffects^=CFE_UNDERLINE;
                SendMessage(hRichEdit, EM_SETCHARFORMAT,
                    SCF_SELECTION,(LPARAM)&CharFormat);
                
                break;
            }

            if (LOWORD (wParam) == IDC_BUTTON5) 
            { 
                hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
                CharFormat.cbSize=sizeof(CHARFORMAT);
                SendMessage(hRichEdit, EM_GETCHARFORMAT, TRUE,
                    (LPARAM)&CharFormat);
                memset(&ChooseFontStructure,0,sizeof(CHOOSEFONT));
                memset(&LogFont,0,sizeof(LOGFONT));
                hDC=GetDC(hwnd);
                LogFont.lfHeight=CharFormat.yHeight/-20;
                if(CharFormat.dwEffects&CFE_BOLD)
                    LogFont.lfWeight=FW_BOLD;
                else
                    LogFont.lfWeight=FW_NORMAL;
                LogFont.lfItalic=(BOOL)(CharFormat.dwEffects&CFE_ITALIC);
                LogFont.lfUnderline=(BOOL)(CharFormat.dwEffects&CFE_UNDERLINE);
                LogFont.lfCharSet=DEFAULT_CHARSET;
                LogFont.lfQuality=DEFAULT_QUALITY;
                LogFont.lfPitchAndFamily=CharFormat.bPitchAndFamily;
                lstrcpy(LogFont.lfFaceName,CharFormat.szFaceName);
                ChooseFontStructure.lStructSize=sizeof(ChooseFontStructure);
                ChooseFontStructure.hwndOwner=hwnd;
                ChooseFontStructure.hDC=hDC;
                ChooseFontStructure.lpLogFont=&LogFont;
                ChooseFontStructure.Flags=CF_SCREENFONTS|CF_INITTOLOGFONTSTRUCT;
                ChooseFontStructure.rgbColors=RGB(0,0,0);
                ChooseFontStructure.nFontType=SCREEN_FONTTYPE;
                if(ChooseFont(&ChooseFontStructure))
                {
                    CharFormat.dwMask=CFM_BOLD|CFM_FACE|CFM_ITALIC|CFM_OFFSET|CFM_SIZE|CFM_UNDERLINE;
                    CharFormat.yHeight=LogFont.lfHeight*-20;
                    CharFormat.dwEffects=0;
                    if(FW_BOLD==LogFont.lfWeight)
                        CharFormat.dwEffects|=CFE_BOLD;
                    if(LogFont.lfItalic)
                        CharFormat.dwEffects|=CFE_ITALIC;
                    if(LogFont.lfUnderline)
                        CharFormat.dwEffects|=CFE_UNDERLINE;
                    CharFormat.bPitchAndFamily=LogFont.lfPitchAndFamily;
                    lstrcpy(CharFormat.szFaceName,LogFont.lfFaceName);
                    SendMessage(hRichEdit,EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&CharFormat);
                }
                ReleaseDC(hwnd,hDC);
                break;
            }
    
            if (LOWORD (wParam) == IDC_BUTTON6)
            {
                hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
                ParaFormat.cbSize=sizeof(PARAFORMAT);
                ParaFormat.dwMask=PFM_ALIGNMENT;
                ParaFormat.wAlignment=PFA_LEFT;
                SendMessage(hRichEdit, EM_SETPARAFORMAT, 0,
                    (LPARAM)&ParaFormat);
                break;
            }

            if (LOWORD (wParam) == IDC_BUTTON7)
            {
                hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
                ParaFormat.cbSize=sizeof(PARAFORMAT);
                ParaFormat.dwMask=PFM_ALIGNMENT;
                ParaFormat.wAlignment=PFA_RIGHT;
                SendMessage(hRichEdit, EM_SETPARAFORMAT, 0,
                    (LPARAM)&ParaFormat);
                break;
            }
            
            if (LOWORD (wParam) == IDC_BUTTON8)
            {
                hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
                ParaFormat.cbSize=sizeof(PARAFORMAT);
                ParaFormat.dwMask=PFM_ALIGNMENT;
                ParaFormat.wAlignment=PFA_CENTER;
                SendMessage(hRichEdit, EM_SETPARAFORMAT, 0,
                    (LPARAM)&ParaFormat);
                break;
            }
            
            if (LOWORD (wParam) == IDC_BUTTON9)
            {
            hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
            SendMessage(hRichEdit,EM_UNDO,0,0L);
            break;
            }
            
            if (LOWORD (wParam) == IDC_BUTTON10)
            {
            hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
            SendMessage(hRichEdit,WM_CUT,0,0L);
            break;
            }
            
            if (LOWORD (wParam) == IDC_BUTTON11)
            {
            hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
            SendMessage(hRichEdit,WM_COPY,0,0L);
            break;
            }

            if (LOWORD (wParam) == IDC_BUTTON12)
            {
            hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
            SendMessage(hRichEdit,WM_PASTE,0,0L);
            break;
            }

            if (LOWORD (wParam) == IDC_BUTTON13)
            {
            hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
            SendMessage(hRichEdit,WM_CLEAR,0,0L);
            break;
            }

            if (LOWORD (wParam) == IDC_BUTTON14)
            {
            CHARRANGE Charr;
            hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
            Charr.cpMin=0;
            Charr.cpMax=-1;
            SendMessage(hRichEdit,EM_EXSETSEL,0,(LPARAM)&Charr);
            break;
            }

            if (LOWORD (wParam) == IDC_BUTTON15)
            {
            hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);
            SetWindowText(hRichEdit,"\0");
            break;
            }
            
            if (LOWORD (wParam) == IDC_BUTTON16)
            {
            FileOpen(hwnd);   // çàãðóæàåì ôàéë äëÿ ðåäàêòèðîâàíèÿ
            return 0L;
            break;
            }

            if (LOWORD (wParam) == IDC_BUTTON17)
            {
            FileSaveAs(hwnd); // ñîõðàíÿåì òåêñò â ôàéëå
            return 0L;
            break;
            }
            
            if (LOWORD (wParam) == IDC_BUTTON18)
            {
            FilePrint(hwnd); 
            return 0L;
            break;
            }
            

            }
    return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    
     }



PM MAIL   Вверх
Edik
Дата 30.12.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 13.9.2006

Репутация: нет
Всего: 1



Код

void FileOpen(HWND hwnd)
{
  
  OPENFILENAME ofn;
  char szFile[256];
  char szDirName[256];
  char szFileTitle[256];
  char szFilter[256] = 
    "Rich Text Files\0*.rtf\0Text Files\0*.txt\0"
    "Any Files\0*.*\0";

  HFILE      hFile;
  OFSTRUCT   of;
  EDITSTREAM es;

  hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);

  memset(&ofn, 0, sizeof(OPENFILENAME));
  GetCurrentDirectory(sizeof(szDirName), szDirName);
  szFile[0] = '\0';

  // Ïîäãîòàâëèâàåì ñòðóêòóðó äëÿ âûáîðà âõîäíîãî ôàéëà
  ofn.lStructSize     = sizeof(OPENFILENAME);
  ofn.hwndOwner       = hwnd;
  ofn.lpstrFilter     = szFilter;
  ofn.lpstrInitialDir = szDirName;
  ofn.nFilterIndex    = 1;
  ofn.lpstrFile       = szFile;
  ofn.nMaxFile        = sizeof(szFile);
  ofn.lpstrFileTitle  = szFileTitle;
  ofn.nMaxFileTitle   = sizeof(szFileTitle);
  ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

  // Âûâîäèì íà ýêðàí äèàëîãîâóþ ïàíåëü, ïðåäíàçíà÷åííóþ
  // äëÿ âûáîðà âõîäíîãî ôàéëà
  if(GetOpenFileName(&ofn))
  {
    // Åñëè ôàéë âûáðàí, îòêðûâàåì åãî äëÿ ÷òåíèÿ
    if (*ofn.lpstrFile)
    {
      hFile = OpenFile(ofn.lpstrFile, &of, OF_READ);
      
      // Óñòàíàâëèâàåì ïàðàìåòðû ôóíêöèè îáðàòíîãî âûçîâà,
      // êîòîðàÿ áóäåò âûïîëíÿòü ÷òåíèå
      es.dwCookie    = (DWORD)hFile; 
      es.dwError     = 0; 
      es.pfnCallback = OpenCallback; 

      // Åñëè ðàñøèðåíèå ôàéëà rtf, ôàéë çàãðóæàåòñÿ êàê
      // rtf-ôàéë. Â ïðîòèâíîì ñëó÷àå îí çàãðóæàåòñÿ êàê
      // îáû÷íûé òåêñòîâûé ôàéë
      _strupr(&ofn.lpstrFile[ofn.nFileExtension]); 
      if(!strncmp(&ofn.lpstrFile[ofn.nFileExtension], "RTF", 3))
        SendMessage(hRichEdit, EM_STREAMIN, SF_RTF, (LPARAM)&es);
      else
        SendMessage(hRichEdit, EM_STREAMIN, SF_TEXT, (LPARAM)&es);

      // Çàêðûâàåì ôàéë
      _lclose(hFile);

      // Ñáðàñûâàåì ïðèçíàê èçìåíåíèÿ ñîäåðæèìîãî îêíà
      // ðåäàêòîðà òåêñòà
      SendMessage(hRichEdit, EM_SETMODIFY, FALSE, 0L);
    }
  }
}

// -----------------------------------------------------
// Ôóíêöèÿ OpenCallback
// -----------------------------------------------------
DWORD CALLBACK 
OpenCallback(DWORD dwCookie, LPBYTE   pbBuff,
  LONG cb, LONG *pcb)
{
  // Âûïîëíÿåì ÷òåíèå áëîêà äàííûõ äëèíîé cb áàéò
  *pcb = _lread((HFILE)dwCookie, pbBuff, cb);
  if(*pcb <= 0)
    *pcb = 0;
  return 0;
}

void FileSaveAs(HWND hwnd)
{

  OPENFILENAME ofn;
  char szFile[256] = "untitled.rtf";
  char szDirName[512];
  char szFileTitle[256];
  
  // Ôèëüòð äîïóñêàåò ñîõðàíåíèå òåêñòà â ôàéëå ñ
  // ðàñøèðåíèåì èìåíè rtf, txt, èëè ëþáûì äðóãèì
  char szFilter[256] = 
    "Rich Text Files\0*.rtf\0Text Files\0*.txt\0"
    "Any Files\0*.*\0";

  HFILE      hFile;
  OFSTRUCT   of;
  EDITSTREAM es;

  hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);

  memset(&ofn, 0, sizeof(OPENFILENAME));
    
  // Îïðåäåëÿåì ïóòü ê òåêóùåìó êàòàëîãó
  GetCurrentDirectory(sizeof(szDirName), szDirName);
  
  // Çàïîëíÿåì ñòðóêòóðó äëÿ âûáîðà âûõîäíîãî ôàéëà
  ofn.lStructSize     = sizeof(OPENFILENAME);
  ofn.hwndOwner       = hwnd;
  ofn.lpstrFilter     = szFilter;
  ofn.lpstrInitialDir = szDirName;
  ofn.nFilterIndex    = 1;
  ofn.lpstrFile       = szFile;
  ofn.nMaxFile        = sizeof(szFile);
  ofn.lpstrFileTitle  = szFileTitle;
  ofn.nMaxFileTitle   = sizeof(szFileTitle);
  ofn.lpstrDefExt = "rtf";
  ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;

  // Âûâîäèì íà ýêðàí äèàëîãîâóþ ïàíåëü, ïðåäíàçíà÷åííóþ
  // äëÿ âûáîðà âûõîäíîãî ôàéëà
  if(GetSaveFileName(&ofn))
  {
    // Åñëè ôàéë âûáðàí, îòêðûâàåì åãî äëÿ çàïèñè èëè
    // ñîçäàåì
    if (*ofn.lpstrFile)
    {
      hFile = OpenFile(ofn.lpstrFile, &of, OF_CREATE);

      // Óñòàíàâëèâàåì ïàðàìåòðû ôóíêöèè îáðàòíîãî âûçîâà,
      // êîòîðàÿ áóäåò âûïîëíÿòü çàïèñü
      es.dwCookie    = (DWORD)hFile; 
      es.dwError     = 0; 
      es.pfnCallback = SaveCallback; 
            
      // Åñëè ðàñøèðåíèå ôàéëà rtf, ôàéë ñîõðàíÿåòñÿ êàê
      // rtf-ôàéë. Â ïðîòèâíîì ñëó÷àå îí ñîõðàíÿåòñÿ êàê
      // îáû÷íûé òåêñòîâûé ôàéë
      _strupr(&ofn.lpstrFile[ofn.nFileExtension]); 
   
      if(!strncmp(&ofn.lpstrFile[ofn.nFileExtension], "RTF", 3))
         SendMessage(hRichEdit, EM_STREAMOUT, SF_RTF, (LPARAM)&es);
      else
         SendMessage(hRichEdit, EM_STREAMOUT, SF_TEXT, (LPARAM)&es);

      // Çàêðûâàåì ôàéë
      _lclose(hFile);

      // Ñáðàñûâàåì ïðèçíàê èçìåíåíèÿ ñîäåðæèìîãî îêíà
      // ðåäàêòîðà òåêñòà
      SendMessage(hRichEdit, EM_SETMODIFY, FALSE, 0L);
    }
  }
}

// -----------------------------------------------------
// Ôóíêöèÿ SaveCallback
// -----------------------------------------------------
DWORD CALLBACK 
SaveCallback(DWORD dwCookie, LPBYTE   pbBuff,
  LONG cb, LONG *pcb)
{
  // Âûïîëíÿåì çàïèñü áëîêà äàííûõ äëèíîé cb áàéò
  cb = _lwrite((HFILE)dwCookie, (LPCTSTR)pbBuff, cb);
  *pcb = cb;
  return 0;
}

void FilePrint(HWND hwnd)
{
  FORMATRANGE fr;
  DOCINFO docInfo;
  LONG lLastChar, lTextSize;
  PRINTDLG pd;
  int nRc;
  HDC hPrintDC;

  hRichEdit=GetDlgItem(hwnd,IDC_RICHEDIT1);

  // Èíèöèàëèçèðóåì ïîëÿ ñòðóêòóðû PRITDLG
  memset(&pd, 0, sizeof(pd));
  pd.lStructSize = sizeof(PRINTDLG);
  pd.hwndOwner   = hRichEdit;
  pd.hInstance   = hInst;
  pd.Flags       = PD_RETURNDC | PD_NOPAGENUMS | 
    PD_NOSELECTION | PD_PRINTSETUP | PD_ALLPAGES;
  pd.nFromPage   = 0xffff;
  pd.nToPage     = 0xffff;
  pd.nMinPage    = 0;
  pd.nMaxPage    = 0xffff;
  pd.nCopies     = 1;

  // Âûâîäèì íà ýêðàí äèàëîãîâóþ ïàíåëü, ïðåäíàçíà÷åííóþ
  // äëÿ ïå÷àòè äîêóìåíòà
  if(PrintDlg(&pd) == TRUE)
  {
    hPrintDC = pd.hDC;

    // Èíèöèàëèçèðóåì ïîëÿ ñòðóêòóðû FORMATRANGE 
    memset(&fr, 0, sizeof(fr));
  
    // Áóäåì ïå÷àòàòü ñ èñïîëüçîâàíèåì êîíòåêñòà 
    // ïðèíòåðà, ïîëó÷åííîãî îò ôóíêöèè PrintDlg
    fr.hdc = fr.hdcTarget = hPrintDC;

    // Ïå÷àòàåì âåñü äîêóìåíò
    fr.chrg.cpMin = 0;     
    fr.chrg.cpMax = -1;
  
    // Óñòàíàâëèâàåì ðàçìåðû ñòðàíèöû â TWIPS-àõ
    fr.rcPage.top = 0;
    fr.rcPage.left = 0;
    fr.rcPage.right = 
      MulDiv(GetDeviceCaps(hPrintDC, PHYSICALWIDTH), 
      1440, GetDeviceCaps(hPrintDC, LOGPIXELSX));

    fr.rcPage.bottom = MulDiv(GetDeviceCaps(hPrintDC,
      PHYSICALHEIGHT),1440,
      GetDeviceCaps(hPrintDC, LOGPIXELSY));
    fr.rc = fr.rcPage;

    // Îñòàâëÿåì ïîëÿ
    if(fr.rcPage.right > 2*3*1440/4+1440)
      fr.rc.right -= (fr.rc.left = 3*1440/4);
    if(fr.rcPage.bottom > 3*1440)
      fr.rc.bottom -= (fr.rc.top = 1440);
    
    // Çàïîëíÿåì ïîëÿ ñòðóêòóðû DOCINFO
    memset(&docInfo, 0, sizeof(DOCINFO));
    docInfo.cbSize = sizeof(DOCINFO);
    docInfo.lpszOutput = NULL;
    docInfo.lpszDocName = "RtfPad document";


    // Íà÷èíàåì ïå÷àòü äîêóìåíòà
    nRc = StartDoc(hPrintDC, &docInfo);
    
    // Åñëè ïðîèçîøëà îøèáêà, ïîëó÷àåì è âûâîäèì íà ýêðàí
    // êîä îøèáêè
    if(nRc < 0)
    {
      char szErr[128];
      DWORD dwErr = GetLastError();
      wsprintf(szErr, "Print Error %ld", dwErr);

      MessageBox(NULL, szErr,
        "Rich Edit", MB_OK | MB_ICONEXCLAMATION);
      
      DeleteDC(hPrintDC);
      return;
    }

    // Íà÷èíàåì ïå÷àòü ñòðàíèöû
    StartPage(hPrintDC);

    lLastChar = 0;

    // Îïðåäåëÿåì äëèíó òåêñòà â áàéòàõ
    lTextSize = SendMessage(hRichEdit, WM_GETTEXTLENGTH, 0, 0);

    // Öèêë ïî âñåì ñòðàíèöàì äîêóìåíòà
    while (lLastChar < lTextSize)
    {
      // Ôîðìàòèðóåì äàííûå äëÿ ïðèíòåðà è ïå÷àòàåì èõ
      lLastChar = SendMessage(hRichEdit, EM_FORMATRANGE, TRUE, 
        (LPARAM) &fr);
        
      if(lLastChar < lTextSize)
      {
        // Çàâåðøàåì ïå÷àòü î÷åðåäíîé ñòðàíèöû
        EndPage(hPrintDC);
        
        // Íà÷èíàåì íîâóþ ñòðàíèöó
        StartPage(hPrintDC);    
        fr.chrg.cpMin = lLastChar;
        fr.chrg.cpMax = -1;
      }
    }

    // Óäàëÿåì èíôîðìàöèþ, êîòîðàÿ õðàíèòñÿ â 
    // îðãàíå óïðàâëåíèÿ Rich Edit
    SendMessage(hRichEdit, EM_FORMATRANGE, TRUE, (LPARAM)NULL);

    // Çàâåðøàåì ïå÷àòü ñòðàíèöû
    EndPage(hPrintDC);

    // Çàâåðøàåì ïå÷àòü äîêóìåíòà
    EndDoc(hPrintDC);

    // Óäàëÿåì êîíòåêñò ïðèíòåðà
    DeleteDC(hPrintDC);
  }
}




Добавлено @ 15:00 
Код

//Microsoft Developer Studio generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Russian resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef _WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif //_WIN32

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

MY DIALOG DISCARDABLE  0, 0, 387, 153
STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | 
    WS_SYSMENU
CAPTION "Rich Edit"
CLASS "My"
FONT 8, "MS Sans Serif"
BEGIN
    CONTROL         "",IDC_RICHEDIT1,"RICHEDIT",ES_MULTILINE | ES_NOHIDESEL | 
                    ES_NUMBER | WS_BORDER | WS_VSCROLL,15,12,156,124
    PUSHBUTTON      "Exit",IDC_BUTTON1,323,126,50,14
    PUSHBUTTON      "Bold",IDC_BUTTON2,185,12,50,14
    PUSHBUTTON      "Italic",IDC_BUTTON3,185,30,50,14
    PUSHBUTTON      "Underline",IDC_BUTTON4,185,49,50,14
    PUSHBUTTON      "Font",IDC_BUTTON5,185,68,50,14
    PUSHBUTTON      "Left",IDC_BUTTON6,185,88,50,14
    PUSHBUTTON      "Right",IDC_BUTTON7,185,107,50,14
    PUSHBUTTON      "Center",IDC_BUTTON8,185,126,50,14
    PUSHBUTTON      "Undo",IDC_BUTTON9,254,12,50,14
    PUSHBUTTON      "Cut",IDC_BUTTON10,255,31,50,14
    PUSHBUTTON      "Copy",IDC_BUTTON11,256,50,50,14
    PUSHBUTTON      "Paste",IDC_BUTTON12,257,69,50,14
    PUSHBUTTON      "Delete",IDC_BUTTON13,258,89,50,14
    PUSHBUTTON      "Select All",IDC_BUTTON14,259,108,50,14
    PUSHBUTTON      "New",IDC_BUTTON15,319,14,50,14
    PUSHBUTTON      "Open",IDC_BUTTON16,321,32,50,14
    PUSHBUTTON      "Save As",IDC_BUTTON17,322,51,50,14
    PUSHBUTTON      "Print",IDC_BUTTON18,322,70,50,14
END


#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE DISCARDABLE 
BEGIN
    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "#include ""windows.h""\r\n"
    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "\0"
END

3 TEXTINCLUDE DISCARDABLE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE 
BEGIN
    "MY", DIALOG
    BEGIN
        RIGHTMARGIN, 380
        BOTTOMMARGIN, 149
    END
END
#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1               ICON    DISCARDABLE     "icon1.ico"
#endif    // Russian resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED



Код

//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by RichEdit.rc
//
#define IDI_ICON1                       114
#define IDC_RICHEDIT1                   1066
#define IDC_BUTTON1                     1067
#define IDC_BUTTON2                     1068
#define IDC_BUTTON3                     1069
#define IDC_BUTTON4                     1070
#define IDC_BUTTON5                     1071
#define IDC_BUTTON6                     1072
#define IDC_BUTTON7                     1073
#define IDC_BUTTON8                     1074
#define IDC_BUTTON9                     1075
#define IDC_BUTTON10                    1076
#define IDC_BUTTON11                    1077
#define IDC_BUTTON12                    1078
#define IDC_BUTTON13                    1079
#define IDC_BUTTON14                    1080
#define IDC_BUTTON15                    1081
#define IDC_BUTTON16                    1082
#define IDC_BUTTON17                    1083
#define IDC_BUTTON18                    1084

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        115
#define _APS_NEXT_COMMAND_VALUE         40003
#define _APS_NEXT_CONTROL_VALUE         1085
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif


PM MAIL   Вверх
ZC1989
Дата 31.12.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: 1
Всего: 1



Edik, пасибо большое! у меня нет сейчас времени это опробовать, так что немного позже напишу о результатах одоптации под мои запросы smile 

С НОВЫМ ГОДОМ!!!! smile 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0740 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.