none
Вывод табличной информации через класс VIEW RRS feed

  • Общие обсуждения

  • Добрый день!

    Просьба помочь разобраться в коде программы. Задача вывести содержимую html-файла в окне. Описание ниже:

    Имеется базовый класс 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.h

    ---------------------------------------------------------------------------------------------------------

    Описание реализации 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.cpp

    -------------------------------------------------------------------------------

    Начало 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.h

    --------------------------------------------------------------------------

    Реализация 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);

    }

    21 февраля 2017 г. 10:48