Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2017, 11:49   #1
edikch
Новичок
Джуниор
 
Регистрация: 22.02.2017
Сообщений: 1
Восклицание МFC вывести содержимую html-файла в окне

Добрый день!

Просьба помочь разобраться в коде программы. Задача вывести содержимую 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] (кнопка с решеткой # в форме сообщения) при вставке кода на форум.

Последний раз редактировалось Alex11223; 22.02.2017 в 12:04.
edikch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JS в HTML [Изменение данных в окне] xsens JavaScript, Ajax 1 28.04.2016 22:59
Вывести размер файла средствами HTML NetSpace HTML и CSS 5 07.11.2015 19:12
Открытие изображения в полном размере в новом окне. HTML messiman HTML и CSS 1 30.03.2014 01:28
Как вывести гравику и вычисления в одном окне? (Pascal ABC)) House M.D. Помощь студентам 2 25.02.2012 20:47
Как вывести код html из файла на страницу HTML Рамирас JavaScript, Ajax 1 25.07.2010 20:06