1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
static DWORD CALLBACK RichEditStreamInCallback(DWORD dwCookie,LPBYTE pbBuff, LONG cb, LONG FAR *pcb);
static DWORD CALLBACK CAboutDlg::RichEditStreamOutCallback(DWORD dwCookie,
LPBYTE pbBuff, LONG cb, LONG FAR *pcb);
bool m_bNewFile;
CString m_strRtfFileName;
HANDLE m_hFile;
//...............
};
// .cpp
DWORD CALLBACK CAboutDlg::RichEditStreamOutCallback(DWORD dwCookie,
LPBYTE pbBuff, LONG cb, LONG FAR *pcb)
{
CAboutDlg* pDlg = reinterpret_cast<CAboutDlg*>(dwCookie);
if(pDlg->m_bNewFile)
{
pDlg->m_bNewFile=false;
pDlg->m_hFile = CreateFile(pDlg->m_strRtfFileName,
GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
if(pDlg->m_hFile == INVALID_HANDLE_VALUE)
{
pDlg->m_hFile = CreateFile(pDlg->m_strRtfFileName,
GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);
}
}
if(pDlg->m_hFile == INVALID_HANDLE_VALUE) return 1;
DWORD bytesWritten;
WriteFile(pDlg->m_hFile,pbBuff,cb,&bytesWritten,NULL);
*pcb = bytesWritten;
if(bytesWritten != (DWORD)cb || bytesWritten == 0)
{
if(pDlg->m_hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(pDlg->m_hFile);
pDlg->m_bNewFile=true;
}
}
return 0;
}
// ----------------------------------------------------------------------------
DWORD CALLBACK CAboutDlg::RichEditStreamInCallback(DWORD dwCookie,
LPBYTE pbBuff, LONG cb, LONG FAR *pcb)
{
CAboutDlg* pDlg = reinterpret_cast<CAboutDlg*>(dwCookie);
if(pDlg->m_bNewFile)
{
pDlg->m_bNewFile=false;
pDlg->m_hFile = CreateFile(pDlg->m_strRtfFileName,
GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
}
if(pDlg->m_hFile == INVALID_HANDLE_VALUE)
return 1;
//read some data
DWORD bytesRead;
int rt = ReadFile(pDlg->m_hFile,pbBuff,cb,&bytesRead,NULL);
if(rt == FALSE)
return 1;
*pcb = bytesRead;
if(bytesRead != (DWORD)cb || bytesRead == 0)
{
if(pDlg->m_hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(pDlg->m_hFile);
pDlg->m_bNewFile=true;
}
}
return 0;
}
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_strRtfFileName="c:\\initial.rtf";
m_bNewFile=true;
m_hFile=INVALID_HANDLE_VALUE;
// TODO: Add extra initialization here
CRichEditCtrl* pRichEditCtrl = new CRichEditCtrl;
pRichEditCtrl->Create(WS_CHILD|WS_BORDER|ES_MULTILINE,CRect(10,10,100,200),this,1);
EDITSTREAM es;
es.dwCookie =(DWORD_PTR )this;
es.dwError = 0;
es.pfnCallback = (EDITSTREAMCALLBACK)RichEditStreamInCallback;
pRichEditCtrl->StreamIn(SF_RTF,es);
// traitement ici
//
//
m_strRtfFileName="c:\\other.rtf";
es.dwCookie =(DWORD_PTR )this;
es.dwError = 0;
es.pfnCallback = (EDITSTREAMCALLBACK)RichEditStreamOutCallback;
pRichEditCtrl->StreamOut(SF_RTF,es);
pRichEditCtrl->DestroyWindow();
delete pRichEditCtrl;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
} |