RichEditCtrlGS.cpp
上传用户:glsy7826
上传日期:2022-06-19
资源大小:180k
文件大小:24k
开发平台:

Visual C++

  1. // RichEditGS.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "RichEditCtrlGS.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CRichEditCtrlGS
  12. CRichEditCtrlGS::CRichEditCtrlGS()
  13. {
  14. }
  15. CRichEditCtrlGS::~CRichEditCtrlGS()
  16. {
  17. }
  18. BEGIN_MESSAGE_MAP(CRichEditCtrlGS, CRichEditCtrl)
  19. //{{AFX_MSG_MAP(CRichEditCtrlGS)
  20. // NOTE - the ClassWizard will add and remove mapping macros here.
  21. //}}AFX_MSG_MAP
  22. END_MESSAGE_MAP()
  23. // Character and Font Attributes
  24. int CRichEditCtrlGS::IsBold(void)
  25. { CHARFORMAT cf;
  26.   cf.cbSize = sizeof(CHARFORMAT);
  27.   cf.dwMask = CFM_BOLD;
  28.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  29.   bool bConsistent = false; // BOLD inconsistent over the whole Selection
  30.   if( dwSelMask & CFM_BOLD )// BOLD consistent over the whole Selection?
  31.     { bConsistent = true; 
  32.     }
  33.   if( !bConsistent )
  34.     { return (-1); // Set Button to indeterminate
  35.     }
  36.   if( cf.dwEffects & CFE_BOLD )
  37.     { return(1);   // Set Button to checked
  38.     }
  39.   return 0;        // Set Button to unchecked
  40. }
  41. int CRichEditCtrlGS::IsItalic(void)
  42. { CHARFORMAT cf;
  43.   cf.cbSize = sizeof(CHARFORMAT);
  44.   cf.dwMask = CFM_ITALIC;
  45.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  46.   bool bConsistent = false;   // ITALIC inconsistent over the whole Selection
  47.   if( dwSelMask & CFM_ITALIC )// ITALIC consistent over the whole Selection?
  48.     { bConsistent = true; 
  49.     }
  50.   if( !bConsistent )
  51.     { return (-1); // Set Button to indeterminate
  52.     }
  53.   if( cf.dwEffects & CFE_ITALIC )
  54.     { return(1);   // Set Button to checked
  55.     }
  56.   return 0;        // Set Button to unchecked
  57. }
  58. int CRichEditCtrlGS::IsUnderlined(void)
  59. { CHARFORMAT cf;
  60.   cf.cbSize = sizeof(CHARFORMAT);
  61.   cf.dwMask = CFM_UNDERLINE;
  62.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  63.   bool bConsistent = false;      // UNDERLINE inconsistent over the whole Selection
  64.   if( dwSelMask & CFM_UNDERLINE )// UNDERLINE consistent over the whole Selection?
  65.     { bConsistent = true; 
  66.     }
  67.   if( !bConsistent )
  68.     { return (-1); // Set Button to indeterminate
  69.     }
  70.   if( cf.dwEffects & CFE_UNDERLINE )
  71.     { return(1);   // Set Button to checked
  72.     }
  73.   return 0;        // Set Button to unchecked
  74. }
  75. int CRichEditCtrlGS::IsStrikeout(void)
  76. { CHARFORMAT cf;
  77.   cf.cbSize = sizeof(CHARFORMAT);
  78.   cf.dwMask = CFM_STRIKEOUT;
  79.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  80.   bool bConsistent = false;      // STRIKEOUT inconsistent over the whole Selection
  81.   if( dwSelMask & CFM_STRIKEOUT )// STRIKEOUT consistent over the whole Selection?
  82.     { bConsistent = true; 
  83.     }
  84.   if( !bConsistent )
  85.     { return (-1); // Set Button to indeterminate
  86.     }
  87.   if( cf.dwEffects & CFE_STRIKEOUT )
  88.     { return(1);   // Set Button to checked
  89.     }
  90.   return 0;        // Set Button to unchecked
  91. }
  92. int CRichEditCtrlGS::IsProtected(void)
  93. { CHARFORMAT cf;
  94.   cf.cbSize = sizeof(CHARFORMAT);
  95.   cf.dwMask = CFM_PROTECTED;
  96.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  97.   bool bConsistent = false;      // PROTECTED inconsistent over the whole Selection
  98.   if( dwSelMask & CFM_PROTECTED )// PROTECTED consistent over the whole Selection?
  99.     { bConsistent = true; 
  100.     }
  101.   if( !bConsistent )
  102.     { return (-1); // Set Button to indeterminate
  103.     }
  104.   if( cf.dwEffects & CFE_PROTECTED )
  105.     { return(1);   // Set Button to checked
  106.     }
  107.   return 0;        // Set Button to unchecked
  108. }
  109. int CRichEditCtrlGS::IsLinked(void)
  110. { CHARFORMAT cf;
  111.   cf.cbSize = sizeof(CHARFORMAT);
  112.   cf.dwMask = CFM_LINK;
  113.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  114.   bool bConsistent = false;      // PROTECTED inconsistent over the whole Selection
  115.   if( dwSelMask & CFM_LINK )// PROTECTED consistent over the whole Selection?
  116.     { bConsistent = true; 
  117.     }
  118.   if( !bConsistent )
  119.     { return (-1); // Set Button to indeterminate
  120.     }
  121.   if( cf.dwEffects & CFE_LINK )
  122.     { return(1);   // Set Button to checked
  123.     }
  124.   return 0;        // Set Button to unchecked
  125. }
  126. void CRichEditCtrlGS::SetBold(void)
  127. { CHARFORMAT cf;
  128.   cf.cbSize = sizeof(CHARFORMAT);
  129.   cf.dwMask = CFM_BOLD;
  130.  
  131.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  132.   // If selection is all the same toggle BOLD style
  133.   // turn it on otherwise over the whole selection
  134.   if( (cf.dwMask & CFM_BOLD) & (dwSelMask & CFM_BOLD) )
  135. { cf.dwEffects ^= CFE_BOLD; 
  136. }
  137.   else
  138. { cf.dwEffects |= CFE_BOLD;
  139. }
  140.   cf.dwMask = CFM_BOLD;
  141.   SetSelectionCharFormat(cf);
  142. }
  143. void CRichEditCtrlGS::SetItalic(void)
  144. { CHARFORMAT cf;
  145.   cf.cbSize = sizeof(CHARFORMAT);
  146.   cf.dwMask = CFM_ITALIC;
  147.  
  148.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  149.   // If selection is all the same toggle ITALIC style
  150.   // turn it on otherwise over the whole selection
  151.   if( (cf.dwMask & CFM_ITALIC) & (dwSelMask & CFM_ITALIC) )
  152. { cf.dwEffects ^= CFE_ITALIC; 
  153. }
  154.   else
  155. { cf.dwEffects |= CFE_ITALIC;
  156. }
  157.   cf.dwMask = CFM_ITALIC;
  158.   SetSelectionCharFormat(cf);
  159. }
  160. void CRichEditCtrlGS::SetUnderlined(void)
  161. { CHARFORMAT cf;
  162.   cf.cbSize = sizeof(CHARFORMAT);
  163.   cf.dwMask = CFM_UNDERLINE;
  164.  
  165.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  166.   // If selection is all the same toggle UNDERLINE style
  167.   // turn it on otherwise over the whole selection
  168.   if( (cf.dwMask & CFM_UNDERLINE) & (dwSelMask & CFM_UNDERLINE) )
  169. { cf.dwEffects ^= CFE_UNDERLINE; 
  170. }
  171.   else
  172. { cf.dwEffects |= CFE_UNDERLINE;
  173. }
  174.   cf.dwMask = CFM_UNDERLINE;
  175.   SetSelectionCharFormat(cf);
  176. }
  177. void CRichEditCtrlGS::SetStrikeout(void)
  178. { CHARFORMAT cf;
  179.   cf.cbSize = sizeof(CHARFORMAT);
  180.   cf.dwMask = CFM_STRIKEOUT;
  181.  
  182.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  183.   // If selection is all the same toggle STRIKEOUT style
  184.   // turn it on otherwise over the whole selection
  185.   if( (cf.dwMask & CFM_STRIKEOUT) & (dwSelMask & CFM_STRIKEOUT) )
  186. { cf.dwEffects ^= CFE_STRIKEOUT; 
  187. }
  188.   else
  189. { cf.dwEffects |= CFE_STRIKEOUT;
  190. }
  191.   cf.dwMask = CFM_STRIKEOUT;
  192.   SetSelectionCharFormat(cf);
  193. }
  194. void CRichEditCtrlGS::SetProtected(void)
  195. { CHARFORMAT cf;
  196.   cf.cbSize = sizeof(CHARFORMAT);
  197.   cf.dwMask = CFM_PROTECTED;
  198.  
  199.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  200.   // If selection is all the same toggle PROTECTED style
  201.   // turn it on otherwise over the whole selection
  202.   if( (cf.dwMask & CFM_PROTECTED) & (dwSelMask & CFM_PROTECTED) )
  203. { cf.dwEffects ^= CFE_PROTECTED; 
  204. }
  205.   else
  206. { cf.dwEffects |= CFE_PROTECTED;
  207. }
  208.   cf.dwMask = CFM_PROTECTED;
  209.   SetSelectionCharFormat(cf);
  210. }
  211. void CRichEditCtrlGS::SetLink(void)
  212. { CHARFORMAT cf;
  213.   cf.cbSize = sizeof(CHARFORMAT);
  214.   cf.dwMask = CFM_LINK;
  215.  
  216.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  217.   // If selection is all the same toggle PROTECTED style
  218.   // turn it on otherwise over the whole selection
  219.   if( (cf.dwMask & CFM_LINK) & (dwSelMask & CFM_LINK) )
  220. { cf.dwEffects ^= CFE_LINK; 
  221. }
  222.   else
  223. { cf.dwEffects |= CFE_LINK;
  224. }
  225.   cf.dwMask = CFM_LINK;
  226.   SetSelectionCharFormat(cf);
  227. }
  228. int CRichEditCtrlGS::GetFontSize(void)
  229. { CHARFORMAT cf;
  230.   int nPointSize = 0;
  231.   cf.cbSize = sizeof(CHARFORMAT);
  232.   cf.dwMask = CFM_SIZE;
  233.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  234. // return only the font size it is the same over the whole selection
  235.   if( (cf.dwMask & CFM_SIZE) & (dwSelMask & CFM_SIZE) )
  236.     { nPointSize = cf.yHeight/20;// convert from twips to points
  237. }
  238.   return nPointSize;
  239. }
  240. void CRichEditCtrlGS::SetFontSize(int nPointSize)
  241. { CHARFORMAT cf;
  242.   cf.cbSize = sizeof(CHARFORMAT);
  243.   cf.dwMask = CFM_SIZE;
  244.   GetSelectionCharFormat(cf);
  245.   nPointSize *= 20; // convert from points to twips
  246.   cf.yHeight = nPointSize;
  247.   cf.dwMask = CFM_SIZE;
  248.   SetSelectionCharFormat(cf);
  249. }
  250. CString CRichEditCtrlGS::GetFontName(void)
  251. { CHARFORMAT cf;
  252.   cf.cbSize = sizeof(CHARFORMAT);
  253.   cf.dwMask = CFM_FACE;
  254.   DWORD dwSelMask = GetSelectionCharFormat(cf);
  255.   CString strName =_T("");
  256. // return only the font name it is the same over the whole selection
  257.   if( (cf.dwMask & CFM_FACE) & (dwSelMask & CFM_FACE) )
  258.     { strName = cf.szFaceName;
  259. }
  260.   return strName;
  261. }
  262. void CRichEditCtrlGS::SetFontName(const CString strFontName)
  263. { CHARFORMAT cf;
  264.   cf.cbSize = sizeof(CHARFORMAT);
  265.   cf.dwMask = CFM_FACE;
  266.   GetSelectionCharFormat(cf);
  267.   CString strName = strFontName.Left(31);  
  268. for (int i = 0; i <= strName.GetLength()-1; i++)
  269. cf.szFaceName[i] = strName[i];
  270.   cf.szFaceName[i]='';
  271.   cf.dwMask = CFM_FACE;
  272.   SetSelectionCharFormat(cf);
  273. }
  274. void CRichEditCtrlGS::SetColour(COLORREF color)
  275. { CHARFORMAT cf;
  276.   cf.cbSize = sizeof(CHARFORMAT);
  277.   cf.dwMask = CFM_COLOR;
  278.   GetSelectionCharFormat(cf);
  279.   cf.crTextColor = color;
  280.   if( cf.dwEffects & CFE_AUTOCOLOR )
  281.     { cf.dwEffects ^= CFE_AUTOCOLOR;
  282. }
  283.   SetSelectionCharFormat(cf);
  284. }
  285. // Paragraph Attributes
  286. int CRichEditCtrlGS::IsRight()
  287. { PARAFORMAT pf;
  288.   pf.cbSize = sizeof(PARAFORMAT);
  289.   pf.dwMask = PFM_ALIGNMENT | PFA_RIGHT;    
  290.   DWORD dwSelMask = GetParaFormat(pf);
  291.   bool bConsistent = false;  // RIGHT alignment inconsistent over the whole Selection
  292.   if( dwSelMask & PFA_RIGHT )// RIGHT alignment consistent over the whole Selection?
  293.     { bConsistent = true; 
  294.     }
  295.   if( !bConsistent )
  296.     { return (-1); // Set Button to indeterminate
  297.     }
  298.   if( (pf.wAlignment & 0xFF) == PFA_RIGHT )
  299.     { return(1);   // Set Button to checked
  300.     }
  301.   return 0;        // Set Button to unchecked
  302. }
  303. int CRichEditCtrlGS::IsLeft(void)
  304. { PARAFORMAT pf;
  305.   pf.cbSize = sizeof(PARAFORMAT);
  306.   pf.dwMask = PFM_ALIGNMENT;    
  307.   DWORD dwSelMask = GetParaFormat(pf);
  308.   bool bConsistent = false; // LEFT alignment inconsistent over the whole Selection
  309.   if( dwSelMask & PFA_LEFT )// LEFT alignment consistent over the whole Selection?
  310.     { bConsistent = true; 
  311.     }
  312.   if( !bConsistent )
  313.     { return (-1); // Set Button to indeterminate
  314.     }
  315.   if( (pf.wAlignment & 0xFF) == PFA_LEFT )
  316.     { return(1);   // Set Button to checked
  317.     }
  318.   return 0;        // Set Button to unchecked
  319. }
  320. int CRichEditCtrlGS::IsCentered(void)
  321. { PARAFORMAT pf;
  322.   pf.cbSize = sizeof(PARAFORMAT);
  323.   pf.dwMask = PFM_ALIGNMENT;    
  324.   DWORD dwSelMask = GetParaFormat(pf);
  325.   bool bConsistent = false;   // CENTER alignment inconsistent over the whole Selection
  326.   if( (dwSelMask & PFA_CENTER) == PFA_CENTER)// CENTER alignment consistent over the whole Selection?
  327.     { bConsistent = true; 
  328.     }
  329.   if( !bConsistent )
  330.     { return (-1); // Set Button to indeterminate
  331.     }
  332.   if( (pf.wAlignment & 0xFF) == PFA_CENTER )
  333.     { return(1);   // Set Button to checked
  334.     }
  335.   return 0;        // Set Button to unchecked
  336. }
  337. int CRichEditCtrlGS::IsJustified(void)
  338. { PARAFORMAT pf;
  339.   pf.cbSize = sizeof(PARAFORMAT);
  340.   pf.dwMask = PFM_ALIGNMENT;    
  341.   DWORD dwSelMask = GetParaFormat(pf);
  342.   bool bConsistent = false;    // JUSTIFIED alignment inconsistent over the whole Selection
  343.   if( dwSelMask & PFA_JUSTIFY )// JUSTIFIED alignment consistent over the whole Selection?
  344.     { bConsistent = true; 
  345.     }
  346.   if( !bConsistent )
  347.     { return (-1); // Set Button to indeterminate
  348.     }
  349.   if( (pf.wAlignment & 0xFF) == PFA_JUSTIFY )
  350.     { return(1);   // Set Button to checked
  351.     }
  352.   return 0;        // Set Button to unchecked
  353. }
  354. int CRichEditCtrlGS::IsBulleted(void)
  355. { PARAFORMAT pf;
  356.   pf.cbSize = sizeof(PARAFORMAT);
  357.   pf.dwMask = PFM_ALIGNMENT | PFM_NUMBERING;    
  358.   DWORD dwSelMask = GetParaFormat(pf);
  359.   bool bConsistent = false;      // Paragraph NUMBERING inconsistent over the whole Selection
  360.   if( dwSelMask & PFM_NUMBERING )// Paragraph NUMBERING consistent over the whole Selection?
  361.     { bConsistent = true; 
  362.     }
  363.   if( !bConsistent )
  364.     { return (-1); // Set Button to indeterminate
  365.     }
  366.   if( pf.wNumbering & PFN_BULLET )
  367.     { return(1);   // Set Button to checked
  368.     }
  369.   return 0;        // Set Button to unchecked
  370. }
  371. void CRichEditCtrlGS::SetRight(void)
  372. { PARAFORMAT pf;    
  373.   pf.cbSize     = sizeof(PARAFORMAT);
  374.   pf.dwMask     = PFM_ALIGNMENT;    
  375.   pf.wAlignment = PFA_RIGHT;
  376.   SetParaFormat(pf); // Set the paragraph.
  377. }
  378. void CRichEditCtrlGS::SetLeft(void)
  379. { PARAFORMAT pf;    
  380.   pf.cbSize     = sizeof(PARAFORMAT);
  381.   pf.dwMask     = PFM_ALIGNMENT;    
  382.   pf.wAlignment = PFA_LEFT;
  383.   SetParaFormat(pf); // Set the paragraph.
  384. }
  385. void CRichEditCtrlGS::SetCenter(void)
  386. { PARAFORMAT pf;    
  387.   pf.cbSize     = sizeof(PARAFORMAT);
  388.   pf.dwMask     = PFM_ALIGNMENT;    
  389.   pf.wAlignment = PFA_CENTER;
  390.   SetParaFormat(pf); // Set the paragraph.
  391. }
  392. void CRichEditCtrlGS::SetJustify(void)
  393. { PARAFORMAT pf;    
  394.   pf.cbSize     = sizeof(PARAFORMAT);
  395.   pf.dwMask     = PFM_ALIGNMENT;    
  396.   pf.wAlignment = PFA_JUSTIFY;
  397.   SetParaFormat(pf); // Set the paragraph.
  398. }
  399. void CRichEditCtrlGS::SetBullet(void)
  400. { int iFormatted = IsBulleted();
  401.   PARAFORMAT pf;
  402.   pf.cbSize     = sizeof(PARAFORMAT);
  403.   pf.dwMask = PFM_NUMBERING | PFM_STARTINDENT | PFM_OFFSET;
  404.   GetParaFormat(pf);
  405.   
  406.   if( 1 == iFormatted )
  407. { pf.wNumbering = 0;
  408.   pf.dxOffset = 0;
  409.   pf.dwMask = PFM_NUMBERING | PFM_STARTINDENT | PFM_OFFSET;
  410. }
  411.   else
  412. { pf.wNumbering = PFN_BULLET;
  413.   pf.dwMask = PFM_NUMBERING;
  414.   if( pf.dxOffset == 0 )
  415. { pf.dxOffset = 160;
  416.   pf.dwMask = PFM_NUMBERING | PFM_STARTINDENT | PFM_OFFSET;
  417. }
  418. }
  419.   SetParaFormat(pf);
  420. }
  421. // Visual Appearance
  422. void CRichEditCtrlGS::SetWordWrap(const bool bOn/*= true*/,const int iLineWidth/* = 0*/)
  423. { if( bOn )
  424.     { SetTargetDevice(NULL, iLineWidth);
  425. }
  426.   else
  427.     { if( 0 == iLineWidth )
  428.     { SetTargetDevice(NULL, 1);
  429. }
  430.       else
  431.     { SetTargetDevice(NULL, iLineWidth);
  432. }
  433. }
  434. }
  435. // Reading and Writing
  436. void CRichEditCtrlGS::SetRTF(const CString strText)
  437. { SCookieString CookieRTF;
  438.   CookieRTF.lSize    = strText.GetLength();
  439.   CookieRTF.lStart   = 0;
  440.   CookieRTF.pInText  = &strText;
  441.   CookieRTF.pOutText = NULL;
  442.   
  443.   CString strRTF = _T("");
  444.   if( strText.GetLength() > 5 )
  445.     { strRTF = strText.Left(5);
  446. }
  447. // Read the text in
  448.   EDITSTREAM es;
  449.   es.dwError = 0;
  450.   es.pfnCallback = StreamInCString;   // Set the callback
  451.   es.dwCookie = (DWORD)&CookieRTF; // and the informations
  452.   if( strRTF.CompareNoCase(_T("{\rtf")) == 0 )
  453.     { StreamIn(SF_RTF,es);
  454. }
  455.   else
  456.     { StreamIn(SF_TEXT,es);
  457. }
  458. }
  459. void CRichEditCtrlGS::SetRTF(const CByteArray& arrRTF)
  460. { SCookieByteArray CookieRTF;
  461.   CookieRTF.lSize    = arrRTF.GetSize();
  462.   CookieRTF.lStart   = 0;
  463.   CookieRTF.pInText  = &arrRTF;
  464.   CookieRTF.pOutText = NULL;
  465.   
  466.   CString strRTF = _T("");
  467.   if( arrRTF.GetSize() > 5 )
  468.     { strRTF  = TCHAR(arrRTF[0]);
  469.       strRTF += TCHAR(arrRTF[1]);
  470.      strRTF += TCHAR(arrRTF[2]);
  471.   strRTF += TCHAR(arrRTF[3]);
  472.   strRTF += TCHAR(arrRTF[4]);
  473. }
  474. // Read the text in
  475.   EDITSTREAM es;
  476.   es.dwError = 0;
  477.   es.pfnCallback = StreamInCByteArray; // Set the callback
  478.   es.dwCookie = (DWORD)&CookieRTF;     // and the informations
  479.   if( strRTF.CompareNoCase(_T("{\rtf")) == 0 )
  480.     { StreamIn(SF_RTF,es);
  481. }
  482.   else
  483.     { StreamIn(SF_TEXT,es);
  484. }
  485. }
  486. void CRichEditCtrlGS::SetRTF(const UINT resID)
  487. { // Obtain a handle and the memory to the resource
  488.   HINSTANCE hApp = ::GetModuleHandle(0);
  489.   ASSERT(hApp);
  490.   HRSRC hResInfo = ::FindResource(hApp, MAKEINTRESOURCE(resID), TEXT("RTF"));
  491.   if( NULL == hResInfo ) return;
  492.   HGLOBAL hRes = ::LoadResource(hApp, hResInfo);
  493.   if( NULL == hRes ) return;
  494.   LPVOID pRTFText = ::LockResource(hRes);
  495.   if( NULL == pRTFText ) return;
  496.   DWORD dwRTFSize = ::SizeofResource(hApp, hResInfo);
  497.   if( 0 == dwRTFSize )
  498.     { ::FreeResource(hRes);
  499.   return;
  500.     }
  501.   CByteArray arrbRTF;
  502.   arrbRTF.SetSize(dwRTFSize);
  503.   LPBYTE pArrRTF = arrbRTF.GetData();
  504.   ::CopyMemory(pArrRTF,pRTFText,dwRTFSize);
  505.   ::FreeResource(hRes);
  506.   SetRTF(arrbRTF);
  507. }
  508. void CRichEditCtrlGS::LoadRTF(const CString strFilename)
  509. { SCookieFile CookieRTF;
  510.   CFileStatus fileStatus;
  511.   CString strRTF = _T("");
  512.   CookieRTF.lStart    = 0;
  513.   CookieRTF.pFilename = &strFilename;
  514. // Close all filehandles
  515.   if( CFile::hFileNull != CookieRTF.fileInText.m_hFile )
  516.     { CookieRTF.fileInText.Close();
  517. }
  518.   if( CFile::hFileNull != CookieRTF.fileOutText.m_hFile )
  519.     { CookieRTF.fileOutText.Close();
  520. }
  521. // Is the filename the name of a file?
  522.   if( CFile::GetStatus(strFilename, fileStatus) )
  523. { if( (fileStatus.m_attribute & ( CFile::volume | CFile::directory )) )
  524.     { AfxMessageBox(AFX_IDP_INVALID_FILENAME);
  525.   return; // Filename is not the name of a file
  526.     }
  527.     }
  528.   else
  529.     { AfxMessageBox(AFX_IDP_INVALID_FILENAME);
  530.   return;// The name is not existing
  531.     }
  532.   
  533.   CookieRTF.lSize = fileStatus.m_size;
  534.   if( !CookieRTF.fileInText.Open( *CookieRTF.pFilename,CFile::modeRead | CFile::shareDenyNone | CFile::typeBinary ) )
  535.     { AfxMessageBox(AFX_IDP_FAILED_TO_OPEN_DOC);
  536.   return; // File could not be opened
  537. }
  538.   CookieRTF.fileInText.SeekToBegin();
  539.   LPTSTR pBuff = strRTF.GetBuffer(15);
  540.   CookieRTF.fileInText.Read(pBuff,5);
  541.   pBuff[5] = 0;
  542.   strRTF.ReleaseBuffer();
  543.   
  544.   EDITSTREAM es;
  545.   es.dwError = 0;
  546.   es.pfnCallback = StreamInCFile;  // Set the callback
  547.   es.dwCookie = (DWORD)&CookieRTF; // and the informations
  548.   if( strRTF.CompareNoCase(_T("{\rtf")) == 0 )
  549.     { StreamIn(SF_RTF,es);
  550. }
  551.   else
  552.     { StreamIn(SF_TEXT,es);
  553. }
  554.   CookieRTF.fileInText.Close();
  555. }
  556. void CRichEditCtrlGS::GetRTF(CString& strText,const bool bAsRTF/*=true*/)
  557. { SCookieString CookieRTF;
  558.   strText.Empty();
  559.   CookieRTF.lSize    = 0;
  560.   CookieRTF.lStart   = 0;
  561.   CookieRTF.pInText  = NULL;
  562.   CookieRTF.pOutText = &strText;
  563.   
  564. // Pull the text out
  565.   EDITSTREAM es;
  566.   es.dwError = 0;
  567.   es.pfnCallback = StreamOutCString;  // Set the callback
  568.   es.dwCookie = (DWORD)&CookieRTF; // and the informations
  569.   if( bAsRTF )
  570.     { StreamOut(SF_RTF,es);
  571. }
  572.   else
  573.     { StreamOut(SF_TEXT,es);
  574. }
  575.   return;
  576. }
  577. void CRichEditCtrlGS::GetRTF(CByteArray& arrText, const bool bAsRTF/*=true*/)
  578. { SCookieByteArray CookieRTF;
  579.   arrText.RemoveAll();
  580.   CookieRTF.lSize    = 0;
  581.   CookieRTF.lStart   = 0;
  582.   CookieRTF.pInText  = NULL;
  583.   CookieRTF.pOutText = &arrText;
  584.   
  585. // Pull the text out
  586.   EDITSTREAM es;
  587.   es.dwError = 0;
  588.   es.pfnCallback = StreamOutCByteArray;  // Set the callback
  589.   es.dwCookie = (DWORD)&CookieRTF; // and the informations
  590.   if( bAsRTF )
  591.     { StreamOut(SF_RTF,es);
  592. }
  593.   else
  594.     { StreamOut(SF_TEXT,es);
  595. }
  596. }
  597. void CRichEditCtrlGS::WriteRTF(const CString strFilename, const bool bAsRTF/*=true*/ )
  598. { SCookieFile CookieRTF;
  599.   CFileStatus fileStatus;
  600.   CString strRTF = _T("");
  601.   CookieRTF.lStart    = 0;
  602.   CookieRTF.pFilename = &strFilename;
  603. // Close all filehandles
  604.   if( CFile::hFileNull != CookieRTF.fileInText.m_hFile )
  605.     { CookieRTF.fileInText.Close();
  606. }
  607.   if( CFile::hFileNull != CookieRTF.fileOutText.m_hFile )
  608.     { CookieRTF.fileOutText.Close();
  609. }
  610.   if( !CookieRTF.fileOutText.Open( *CookieRTF.pFilename,CFile::modeCreate | CFile::modeReadWrite | CFile::typeBinary ) )
  611.     { AfxMessageBox(AFX_IDP_FAILED_TO_SAVE_DOC);
  612.   return; // File could not be opened for saving
  613. }
  614.   CookieRTF.fileOutText.SeekToBegin();
  615.   
  616.   EDITSTREAM es;
  617.   es.dwError = 0;
  618.   es.pfnCallback = StreamOutCFile; // Set the callback
  619.   es.dwCookie = (DWORD)&CookieRTF; // and the informations
  620.   if( bAsRTF )
  621.     { StreamOut(SF_RTF,es);
  622. }
  623.   else
  624.     { StreamOut(SF_TEXT,es);
  625. }
  626.   CookieRTF.fileOutText.Close();
  627. }
  628. // StreamIn StreamOut methods
  629. DWORD CALLBACK CRichEditCtrlGS::StreamInCString(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
  630. { SCookieString *pCookie = (SCookieString *)dwCookie;
  631.   long lMaxSize  = cb; // We may only read such much
  632.   long lReadSize = cb; // We can only read such much
  633.   *pcb = 0;            // Till now we have nothing read so far
  634.   
  635.   if( pCookie->lStart < 0 )
  636. { return(0); // Nothing to do
  637. }
  638.   if( NULL == pCookie->pInText )
  639. { return(0); // Nothing to do
  640. }
  641.   if( pCookie->pInText->GetLength() < cb )
  642.     { lMaxSize = pCookie->pInText->GetLength();
  643. }
  644.   lReadSize = lMaxSize;
  645.   if( (pCookie->lSize - pCookie->lStart) < lReadSize )
  646.     { lReadSize = pCookie->lSize - pCookie->lStart;
  647. }
  648.   if( lReadSize <= 0 )
  649. { return (0); // Nothing to do
  650. }
  651.   LPCTSTR pText = (LPCTSTR)(*(pCookie->pInText));
  652.   pText += pCookie->lStart;
  653.   pCookie->lStart += lReadSize;
  654.   *pcb = lReadSize;
  655.   memcpy(pbBuff,pText,lReadSize);
  656.   return 0;
  657. }
  658. DWORD CALLBACK CRichEditCtrlGS::StreamInCByteArray(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
  659. { SCookieByteArray *pCookie = (SCookieByteArray *)dwCookie;
  660.   long lMaxSize  = cb; // We may only read such much
  661.   long lReadSize = cb; // We can only read such much
  662.   *pcb = 0;            // Till now we have nothing read so far
  663.   if( pCookie->lStart < 0 )
  664. { return(0); // Nothing to do
  665. }
  666.   if( NULL == pCookie->pInText )
  667. { return(0); // Nothing to do
  668. }
  669.   if( pCookie->pInText->GetSize() < cb )
  670.     { lMaxSize = pCookie->pInText->GetSize();
  671. }
  672.   lReadSize = lMaxSize;
  673.   if( (pCookie->lSize - pCookie->lStart) < lReadSize )
  674.     { lReadSize = pCookie->lSize - pCookie->lStart;
  675. }
  676.   if( lReadSize <= 0 )
  677. { return (0); // Nothing to do
  678. }
  679.   LPCTSTR pText = (LPCTSTR)(pCookie->pInText->GetData());
  680.   pText += pCookie->lStart;
  681.   pCookie->lStart += lReadSize;
  682.   *pcb = lReadSize;
  683.   memcpy(pbBuff,pText,lReadSize);
  684.   return 0;
  685. }
  686. DWORD CALLBACK CRichEditCtrlGS::StreamInCFile(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
  687. { SCookieFile *pCookie = (SCookieFile *)dwCookie;
  688.   UINT uiReadSize = 0; 
  689.   *pcb = 0;            // Till now we have nothing read so far
  690.   if( pCookie->lStart < 0 )
  691. { return (0); // Nothing to do
  692. }
  693.   if( 0 == cb )
  694. { return(0); // Nothing to do
  695. }
  696.   if( CFile::hFileNull == pCookie->fileInText.m_hFile )
  697. { return(0); // Nothing to do
  698. }
  699.   pCookie->fileInText.Seek(pCookie->lStart,CFile::begin);
  700.   uiReadSize = pCookie->fileInText.Read(pbBuff,cb);
  701.   *pcb = uiReadSize;
  702.   pCookie->lStart += uiReadSize;
  703.   return 0;
  704. }
  705. DWORD CALLBACK CRichEditCtrlGS::StreamOutCString(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
  706. { SCookieString *pCookie = (SCookieString *)dwCookie;
  707.   long lWriteSize = cb; // We can only Write such much
  708.   *pcb = 0;             // Till now we have nothing written so far
  709.   if( pCookie->lStart < 0 )
  710. { return (0); // Nothing to do
  711. }
  712.   if( 0 == cb )
  713. { return(0); // Nothing to do
  714. }
  715.   if( NULL == pCookie->pOutText )
  716. { return(0); // Nothing to do
  717. }
  718.   CString strBuffer = _T("");
  719.   strBuffer = (CString)pbBuff;
  720.   (*(pCookie->pOutText)) += strBuffer.Left(lWriteSize);
  721.   *pcb = lWriteSize;   
  722.   pCookie->lStart += lWriteSize;
  723.   return 0;
  724. }
  725. DWORD CALLBACK CRichEditCtrlGS::StreamOutCByteArray(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
  726. { SCookieByteArray *pCookie = (SCookieByteArray *)dwCookie;
  727.   long lWriteSize = cb; // We can only Write such much
  728.   *pcb = 0;             // Till now we have nothing written so far
  729.   if( pCookie->lStart < 0 )
  730. { return (0); // Nothing to do
  731. }
  732.   if( 0 == cb )
  733. { return(0); // Nothing to do
  734. }
  735.   if( NULL == pCookie->pOutText )
  736. { return(0); // Nothing to do
  737. }
  738.   CByteArray arrBuffer;
  739.   arrBuffer.SetSize(lWriteSize);
  740.   BYTE *pByte = arrBuffer.GetData();
  741.   memcpy(pByte,pbBuff,lWriteSize);
  742.   pCookie->pOutText->Append(arrBuffer);
  743.   *pcb = lWriteSize;   
  744.   pCookie->lStart += lWriteSize;
  745.   return 0;
  746. }
  747. DWORD CALLBACK CRichEditCtrlGS::StreamOutCFile(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
  748. { SCookieFile *pCookie = (SCookieFile *)dwCookie;
  749.   *pcb = 0;             // Till now we have nothing written so far
  750.   if( pCookie->lStart < 0 )
  751. { return (0); // Nothing to do
  752. }
  753.   if( 0 == cb )
  754. { return(0); // Nothing to do
  755. }
  756.   if( CFile::hFileNull == pCookie->fileOutText.m_hFile )
  757. { return(0); // Nothing to do
  758. }
  759.   try
  760.   { pCookie->fileOutText.SeekToEnd();
  761.     pCookie->fileOutText.Write(pbBuff,cb);
  762.   }
  763.   catch (CFileException *e)
  764.     { AfxMessageBox(AFX_IDP_FAILED_TO_SAVE_DOC);
  765.   e->Delete();
  766.   return (1); // File could not be opened for saving so stop saving
  767. }
  768.   *pcb = cb;
  769.   return 0;
  770. }