Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: CRichEditCtrl и StreamIN как единственный(?) метод вывода  (Прочитано 15950 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Tuborg
Команда клуба

ee
Offline Offline

« : 30-07-2007 14:43 » 

Добрый вечер всем!
Отвлечёмся опять от перерисовки (проблема так и не была решена) =)

Пытаюсь на диалог вывесить CRichEditCtrl. (на одну из вкладок диалога вернее). Добавил элемент GUI, добавил его инициализацию. А теперь вопрос - как туда что-то выводить? В MSDN нашёл для этого единственный способ - это использование CRichEditCtrl::StreamIN(...):
Код:

a='a';

EDITSTREAM es;
es.dwCookie=(DWORD) &a
es.pfnCallBack = HexPadStreamInCallback;

mRichEdit.StreamIn(SF_RTF,es);

Теперь хочу чтобы на нажатие кнопки в CRichEditCtrl что-нибудь вывалилось, перегрузил callback функцию:

Код:
static DWORD CALLBACK
HexPadStreamInCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
  *pcb =1; // сколько байт вывести
  *pbBuff='a';

  if (*pcb) return 0; // если что-то вывели
  else return 1;

}

- правильно ли я понял, что вызов метода StreamIN я должен произвести один раз для перегрузки callback-функции?
- каким образом будет вызываться callback - функция? я не нашёл как её навесить на какое-либо событие
- у меня однократный вызов callback-функции  происходит, но CRichEditCtrl остаётся пустым. Почему?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 30-07-2007 14:59 » 

я , возможно, что то путаю, но может воспользоваться SetWindowText() ?

потому что
class CRichEditCtrl : public CWnd
« Последнее редактирование: 30-07-2007 15:01 от Алексей1153++ » Записан

Tuborg
Команда клуба

ee
Offline Offline

« Ответ #2 : 30-07-2007 15:16 » 

Да, согласен, это работает, только всё таки хотелось бы через StreamIN.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 30-07-2007 15:48 » 

Tuborg, а почему ? Улыбаюсь
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 30-07-2007 21:13 » 

Леш, а ты помнишь поведение контрола при SETTEXT? Сворачивание в начало текста, потеря позиции курсора и т.п.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 30-07-2007 21:26 » 

RXL, да, есть такое дело... Я всего 1 раз сталкивался с этим контролом, и там с курсором бороца не нужно было. Поэтому я сильно не разбирался )
Записан

igor1345
Гость
« Ответ #6 : 07-08-2007 03:13 » 

можно еще сообщение послать окну
Записан
salex
Гость
« Ответ #7 : 11-12-2007 22:36 » 

long StreamIn( int nFormat, EDITSTREAM& es ); - заменяет содержимое
RichEdit текстом из определенного входного потока. Параметр nFormat
может принимать два значения: SF_TEXT - работаем только с
"обыкновенным" текстом и SF_RTF - работаем с текстом в формате RTF.
Параметр es, непосредственно, определяет входящий поток. Структура
EDITSTREAM представлена следующим образом:
typedef struct _editstream {
    DWORD_PTR dwCookie;
    DWORD dwError;
    EDITSTREAMCALLBACK pfnCallback;
} EDITSTREAM;
Поле dwCookie - содержит значение, которое будет передано в функцию обратного
вызова, определяемую через поле pfnCallback. Поле dwError - содержит результат
выполнения записи в поток (или чтения из потока). Ненулевое значение поля
dwError свидетельствует об ошибке.

long StreamOut( int nFormat, EDITSTREAM& es ); - записывает
содержимое RichEdit в выходной поток. Замечания, относительно аргументов
функции, смотри в методе StreamIn.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 12-12-2007 04:42 » 

salex, теперь везде, где будешь писать оценку своим сырым лабораторкам, вложение буду удалять. Пиши в пост кусочек кода, которым ты хочешь поделиться или помочь , вот например как тут. А весь твой проект то зачем ? )
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #9 : 12-12-2007 07:05 » 

вот пример использования
http://www.codeguru.com/cpp/controls/richedit/article.php/c2413
http://msdn2.microsoft.com/en-us/library/h2hkhzhe(VS.80).aspx

только не понятно: в чем вопрос?
Записан

Странно всё это....
keg1952
Гость
« Ответ #10 : 30-06-2009 20:46 » 

RichProt.h
Код:
class CRichProt : public CDialog
{
DECLARE_DYNAMIC(CRichProt)

public:
CRichProt(CWnd* pParent = NULL);   // standard constructor
virtual ~CRichProt();

// Dialog Data
enum { IDD = D_RICH1 };

protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

DECLARE_MESSAGE_MAP()
public:
CRichEditCtrl m_cRichEdit;
int i;
int err; // код ошибки
CHARFORMAT fmtText;
LOGFONT lf;
int klcr;
CRect rectrich;

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

// My callback procedure that writes the rich edit control contents
// to a file.
static DWORD CALLBACK
MyStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CFile* pFile = (CFile*) dwCookie;
*pcb = pFile->Read(pbBuff, cb);
return 0;
}

// Установка шрифта выдачи текста
void SetRichEditFont(void);
afx_msg void OnPaint();
void ReadFileProt(void);
void SetWindowProt(void);
afx_msg void OnSize(UINT nType, int cx, int cy);
protected:
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
public:
afx_msg void OnEnChangeRich1E1();
};

CRichProt.cpp
// RichProt.cpp : implementation file
//

#include "stdafx.h"
#include "WK3PRALL.h"
#include "WK3PRALLDlg.h"
#include "RichProt.h"
#include ".\richprot.h"

extern CRect rectText;

// файл тела протокола
extern CFile c_FileProt;
extern CFileException cfeProt;
extern char lpFileNameProt[255];
extern int indFileProt; // индекс начала записи для чтения

// CRichProt dialog
IMPLEMENT_DYNAMIC(CRichProt, CDialog)
CRichProt::CRichProt(CWnd* pParent /*=NULL*/)
: CDialog(CRichProt::IDD, pParent)
{
}

CRichProt::~CRichProt()
{
}

void CRichProt::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, D_RICH1_E1, m_cRichEdit);
}

BEGIN_MESSAGE_MAP(CRichProt, CDialog)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_SIZE()
// ON_WM_KEYDOWN()
//ON_EN_SETFOCUS(D_RICH1_E1, OnEnSetfocusRich1E1)
ON_EN_CHANGE(D_RICH1_E1, OnEnChangeRich1E1)
//ON_NOTIFY(EN_CORRECTTEXT, D_RICH1_E1, OnEnCorrecttextRich1E1)
END_MESSAGE_MAP()

int CRichProt::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO:  Add your specialized creation code here
m_cRichEdit.DestroyWindow();
m_cRichEdit.Create(ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL|
WS_VSCROLL |WS_HSCROLL | WS_BORDER | WS_VISIBLE,
CRect(0,0,0,0),
this,D_RICH1_E1);
// Установка шрифта выдачи текста
CRichProt::SetRichEditFont();
// m_cRichEdit.SetReadOnly(true);
m_cRichEdit.SetEventMask(m_cRichEdit.GetEventMask() | ENM_CHANGE);
m_cRichEdit.MoveWindow(0,0,0,0,true);
return 0;
}
// Установка шрифта выдачи текста
void CRichProt::SetRichEditFont(void)
{
m_cRichEdit.GetDefaultCharFormat(fmtText);
CString strDefFont;
strDefFont.Format(_T("Courier New"));
ASSERT(fmtText.cbSize == sizeof(CHARFORMAT));
fmtText.dwMask = CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE|CFM_STRIKEOUT|CFM_SIZE|
CFM_COLOR|CFM_OFFSET|CFM_PROTECTED;
fmtText.dwEffects = CFE_AUTOCOLOR;
fmtText.yHeight = 8*20; // высота 10pt - 200
fmtText.yOffset = 0;
fmtText.crTextColor = RGB(0, 0, 0);
fmtText.bCharSet = 0;
fmtText.bPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
ASSERT(strDefFont.GetLength() < LF_FACESIZE);
lstrcpyn(fmtText.szFaceName, strDefFont, LF_FACESIZE);
fmtText.dwMask |= CFM_FACE;

m_cRichEdit.SetDefaultCharFormat(fmtText);
}
void CRichProt::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CDialog::OnPaint() for painting messages
}

void CRichProt::ReadFileProt(void)
{
//MessageBox("ReadFileProt","Отладка",MB_OK);
// Чтение текста протокола из файла
// The file from which to load the contents of the rich edit control.
//CFile cFile(lpFileNameProt, CFile::modeRead);
cfeProt.m_lOsError = 0;
c_FileProt.Open(lpFileNameProt,CFile::modeRead, &cfeProt);
err = cfeProt.m_lOsError;
//itoa(err,ch10,10);
//strrab1.Format(_T("Код закрытия файла - %s"),lpFileNameProt);
//MessageBox(ch10,strrab1,MB_OK);
if ( err == 0)
{
EDITSTREAM es;
es.dwCookie = (DWORD) &c_FileProt;
es.pfnCallback = MyStreamInCallback;
m_cRichEdit.StreamIn(SF_TEXT, es);
c_FileProt.Close();
}
}
// размещение окна с текстом протокола
void CRichProt::SetWindowProt(void)
{
CRichProt::GetClientRect(rectrich);
// TODO: Add your message handler code here
m_cRichEdit.MoveWindow(rectrich,true);
m_cRichEdit.InvalidateRect(rectrich,true);
}

void CRichProt::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
//MessageBox("OnSize","Отладка",MB_OK);
CRichProt::SetWindowProt();
}

BOOL CRichProt::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
char chcom[10];
ltoa(LOWORD(wParam),chcom,10);
// MessageBox("OnCommand",chcom,MB_OK);
if ( LOWORD(wParam) == WM_RBUTTONDOWN)
{
MessageBox("WM_RBUTTONDOWN","Отладка",MB_OK);
wParam = 0;
return 0;
}
if ( LOWORD(wParam) == 2)
{
MessageBox("Esc - 2",chcom,MB_OK);
wParam = 0;
return 0;
}
if ( LOWORD(wParam) == 13)
{
MessageBox("Enter - 13",chcom,MB_OK);
wParam = 0;
return 0;
}
if ( LOWORD(wParam) == 21)
{
MessageBox("Enter - 21",chcom,MB_OK);
wParam = 0;
return 0;
}
// lParam
//  The low-order word specifies the x-coordinate of the cursor. The coordinate
//  is relative to the upper-left corner of the client area.
//  The high-order word specifies the y-coordinate of the cursor. The coordinate
//  is relative to the upper-left corner of the client area.

return CDialog::OnCommand(wParam, lParam);
}

void CRichProt::OnEnChangeRich1E1()
{
// TODO:  If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO:  Add your control notification handler code here
MessageBox("OnEnChangeRich1E1","Отладка",MB_OK);
}
Диалог D_RICH1 - child
Поле   D_RICH1_E1 - опция VISIBLE - FALSE Avto HScroll - True  Avto VScroll - True  Multiline - True

В основном диалоге все поле разделено попалам 1 половина - CListCtrl 2 - половина - CRichEditCtrl
« Последнее редактирование: 30-06-2009 21:47 от Finch » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 01-07-2009 03:39 » 

keg1952, а в чём заключается вопрос ? Улыбаюсь
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 01-07-2009 06:37 » 

А с чего ты взял, что это вопрос? ПРосто человек решил поделиться в тему.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines