Добрый день!
Просьба помочь разобраться в коде программы. Задача вывести содержимую html-файла в окне. В окне есть календарь CDateTimeCtrl, который используется для отображения даты в рабочем поле окна отчетности.
После запуска приложения, иногда рабочем поле отображает текущая дату, и иногда не отображает дата. При выборе даты не обновляется окно.
Описание ниже:
Имеется базовый класс VIEW унаследованный от класс CWnd. Есть класс VIEW_REPORT на базе класса VIEW. В классе VIEW_REPORT вложена переменная на базе CHtmlView, которая работает html файлами.
Описание viewh.h
Код:
#pragma once
class VIEW : public CWnd
//----------------------------------------------------------------------------
{
public:
CDC cdc;
virtual ~VIEW() { }
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual void Draw(CDC &dc, RECT &rc) {};
virtual void Update(BOOL all=FALSE) {};
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};
class VIEWG : public VIEW
//----------------------------------------------------------------------------
{
public:
VIEWG() {}
virtual void Update();
protected:
CDC mdc;
CMetaFileDC mfDC;
virtual void Paint(CDC &dc) {}
public:
virtual ~VIEWG() {}
protected:
afx_msg void OnPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC) {return TRUE;};
afx_msg void OnSize(UINT nType, int cx, int cy) {Update();};
DECLARE_MESSAGE_MAP()
public:
void Draw(void);
};
Описание реализации View.cpp
Код:
#include "stdafx.h"
#include "defs.h"
#include "view.h"
//////////////////////////////////////////////////////////////////////////////
// VIEW class
//////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(VIEW, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
BOOL VIEW::PreCreateWindow(CREATESTRUCT& cs)
//----------------------------------------------------------------------------
{
if (!CWnd::PreCreateWindow(cs)) return FALSE;
//cs.style &= ~WS_BORDER;
//cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
// ::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_BTNFACE+1), NULL);
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW, ::LoadCursor(0, IDC_ARROW), 0, 0);
return TRUE;
}
void VIEW::OnPaint()
//-----------------------------------------------------------------------------
{
CPaintDC dc(this);
RECT rc;
GetClientRect(&rc);
Draw(dc, rc);
}
//////////////////////////////////////////////////////////////////////////////
// VIEWG class
//////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(VIEWG, CWnd)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_SIZE()
END_MESSAGE_MAP()
void VIEWG::OnPaint()
//----------------------------------------------------------------------------
{
RECT rc;
GetClientRect(&rc);
CPaintDC dc(this);
if(!mdc.m_hDC)
{
mdc.CreateCompatibleDC(&dc);
HBITMAP bmp=CreateCompatibleBitmap(dc.m_hDC,1920,1440);
mdc.SelectObject(bmp);
Draw();
}
dc.BitBlt(0,0,rc.right,rc.bottom,&mdc,0,0,SRCCOPY);
}
void VIEWG::Update()
//------------------------------------------------------------------------------
{
if(mdc.m_hDC) Draw();
Invalidate(0);
}
void VIEWG::Draw(void)
{
RECT rc;
GetClientRect(&rc);
mdc.FillSolidRect(0,0,1920,1440,CL_BACKROUND);
int x = SIZE_X;
int y = SIZE_Y;
mdc.SetMapMode(MM_ISOTROPIC);
mdc.SetWindowOrg(0,0) ; //====== Сдвиг в логической системе
mdc.SetViewportOrg(0,0) ; //====== Сдвиг в физической системе
mdc.SetWindowExt(x,y); //====== Разрешение в логической системе
mdc.SetViewportExt(rc.right,rc.bottom); //====== Разрешение в физической системе
Paint(mdc);
mdc.SetMapMode(MM_TEXT);
}
View_report.h
Код:
#pragma once
class VIEW_REPORT : public VIEW
{
CDateTimeCtrl dtc;
CHiperReportView *hp;
SYSTEMTIME m_time;
void MakeReport();
CString GetReporFileName();
public:
CDC dc;
void Draw(CDC &dc, RECT &rc);
void Update(BOOL all = FALSE);
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnPaint();
afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
afx_msg BOOL OnEraseBkgnd(CDC *pDC);
afx_msg void OnDateChange(NMHDR *pNMHDR, LRESULT *pResult);
DECLARE_MESSAGE_MAP()
};
Реализация View_report.cpp
Код:
#include "stdafx.h"
#include "defs.h"
BEGIN_MESSAGE_MAP(VIEW_REPORT, VIEW)
ON_WM_CREATE()
ON_WM_CHAR()
ON_WM_SHOWWINDOW()
ON_WM_ERASEBKGND()
ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATETIMECTRL, OnDateChange)
ON_WM_PAINT()
END_MESSAGE_MAP()
int VIEW_REPORT::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
int ret = VIEW::OnCreate(lpCreateStruct);
hp = new CHiperReportView();
RECT rc;
GetClientRect(&rc);
rc.top += 32;
BOOL b = hp->Create(0, 0, WS_VISIBLE | WS_CHILD | WS_BORDER, rc, this, 0);
dtc.Create(WS_VISIBLE | WS_CHILD | WS_TABSTOP, CRect(20, 6, 200, 28), this, IDC_DATETIMECTRL);
GetLocalTime(&m_time);
dtc.SetTime(m_time);
return ret;
}
void VIEW_REPORT::OnShowWindow(BOOL bShow, UINT nStatus)
{
//VIEW::OnShowWindow(bShow, nStatus);
// TODO: добавьте свой код обработчика сообщений
if (!bShow) return;
Update(TRUE);
}
void VIEW_REPORT::OnPaint()
{; }
void VIEW_REPORT::Draw(CDC &dc, RECT &rc) {
CString DataStr;
DataStr.Format("%d", m_time.wDay);
dc.TextOutA(210, 10, DataStr);
Update(TRUE); }
void VIEW_REPORT::Update(BOOL) {
//dtc.SetFocus();
MakeReport();
}
BOOL VIEW_REPORT::OnEraseBkgnd(CDC *pDC)
{
RECT rc;
GetClientRect(&rc);
pDC->FillSolidRect(&rc, GetSysColor(COLOR_BTNFACE));
return TRUE;
}
void VIEW_REPORT::OnDateChange(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMDATETIMECHANGE pDTChange = (LPNMDATETIMECHANGE)pNMHDR;
//if (memcmp(&m_time, &(pDTChange->st), sizeof(m_time)))
{
m_time = pDTChange->st;
}
*pResult = 0;
}
CString VIEW_REPORT::GetReporFileName()
{
CString s = GetExePath();
s.Append("report.html");
return s;
}
void VIEW_REPORT::MakeReport()
{
#define PRINT(text) sprintf(buf,text); WriteFile(hFile,buf,lstrlen(buf),&cb,0);
CString fn = GetReporFileName();
HANDLE hFile = CreateFile(fn, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL);
if (hFile == INVALID_HANDLE_VALUE) return;
try{
char buf[MAX_PATH];
//char tmp[MAX_PATH];
DWORD cb;
PRINT("<html><head><title>ЦГМ обезвреживание</title>\
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\
<link href=\"bz.css\" rel=\"stylesheet\" type=\"text/css\" />\
</head><body>");
sprintf(buf, "<h1>ЗИФ р. Холбинский. Отчёт за смену %d.%02d.%d</h1>", m_time.wDay, m_time.wMonth, m_time.wSecond);
WriteFile(hFile, buf, lstrlen(buf), &cb, 0);
}
catch (...) {};
hp->Navigate(GetReporFileName());
CloseHandle(hFile);
//SendMessage(WM_PAINT, (WPARAM) dc.GetSafeHdc(), 0);
}
______________________
Используйте тег [CODE] (кнопка с решеткой # в форме сообщения) при вставке кода на форум.