• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 29,comments - 10,trackbacks - 0
            1、建立名為HexViewer的SDI項(xiàng)目,在創(chuàng)建單文檔時(shí)把Base Class(基類)改為CScrollView。CScrollView就是CView的一個(gè)派生類,通過(guò)它可以很容易地處理水平和垂直滾動(dòng)。
            2、打開和讀取文件
                  首先,在CHexViewerDoc類中定義兩個(gè)成員變量,分別用于檢索要打開文件的指針以及文件的大小,并初始化這些值,同時(shí)添加用于清除的代碼。
            class CHexViewerDoc : public CDocument
            {
            ..
            public:
                CFile
            * m_pFile;
                LONG m_lFileSize;
            ..
            };

            CHexViewerDoc::CHexViewerDoc()
            {
                m_pFile
            =NULL;
                m_lFileSize
            =0L;
            }

            CHexViewerDoc::
            ~CHexViewerDoc()
            {
                
            if (m_pFile!=NULL)
                {
                    m_pFile
            ->Close();
                    delete m_pFile;
                    m_pFile
            =NULL;
                    m_lFileSize
            =0L;
                }
            }
                  在使用MFC框架的因公程序中打開文檔后,還會(huì)調(diào)用CHexViewerDoc::OnOpenDocument虛函數(shù)。
            BOOL CHexViewerDoc::OnOpenDocument(LPCTSTR lpszPathName) 
            {
                
            if (!CDocument::OnOpenDocument(lpszPathName))
                    
            return FALSE;

                
            if (m_pFile!=NULL)
                {
                    m_pFile
            ->Close();
                    delete m_pFile;
                    m_pFile
            =NULL;
                    m_lFileSize
            =0L;
                }

                
            try
                {
                    m_pFile
            =new CFile(lpszPathName,CFile::modeRead|CFile::typeBinary);
                }
                
            catch(CFileException* e)
                {
                    CString strError;
                    strError.Format(_T(
            "Couldn't open file:%d"),_sys_errlist[e->m_lOsError]);
                    AfxMessageBox(strError);
                    
            return FALSE;
                }

                m_lFileSize
            =m_pFile->GetLength();
                
            return TRUE;
            }
                  最后添加一個(gè)輔助成員函數(shù),視圖調(diào)用該函數(shù)從打開的文件中讀取一行數(shù)據(jù)。
            BOOL CHexViewerDoc::ReadLine(CString& strLine,int nLength,LONG lOffset/* =-1L */)
            {
                LONG lPosition;

                
            if(lOffset!=-1L)
                    lPosition
            =m_pFile->Seek(lOffset,CFile::begin);
                
            else
                    lPosition
            =m_pFile->GetPosition();

                
            if(lPosition==-1L)
                {
                    TRACE(
            "CHexViewDoc::ReadLine returns False Seek (%8.8lX,%8.8lX)\n",lOffset,lPosition);
                    
            //這個(gè)宏是用來(lái)調(diào)試用的,在VC的窗口的輸入框中會(huì)看到輸出的內(nèi)容!只有在debug版本中才會(huì)運(yùn)行 
                    return FALSE;
                }

                BYTE
            * pszBuffer=new BYTE[nLength]; 
                
            int nReturned=m_pFile->Read(pszBuffer,nLength);

                
            if(nReturned<=0)
                {
                    TRACE2(
            "CHexViewDoc::ReadLine returns FALSE Read (%d,%d)",nLength,nReturned);
                    delete pszBuffer;
                    
            return FALSE;
                }

                CString strTemp;
                CString strCharsIn;

                strTemp.Format(_T(
            "%8.8lX - "),lPosition);
                strLine
            =strTemp;

                
            for(int nIndex=0;nIndex<nReturned;nIndex++)
                {
                    
            if(nIndex==0)
                        strTemp.Format(_T(
            "%2.2X"),pszBuffer[nIndex]);
                    
            //以2位的十六進(jìn)制讀取
                    else if(nIndex%16==0)
                        strTemp.Format(_T(
            "=%2.2X"),pszBuffer[nIndex]);
                    
            else if(nIndex%8==0)
                        strTemp.Format(_T(
            "-%2.2X"),pszBuffer[nIndex]);
                    
            else
                        strTemp.Format(_T(
            " %2.2X"),pszBuffer[nIndex]);

                    
            if(_istprint(pszBuffer[nIndex]))
                        strCharsIn
            +=pszBuffer[nIndex];
                    
            else
                        strCharsIn
            +=_T('.');
                    strLine
            +=strTemp;
                }
                
            if(nReturned<nLength)
                {
                    CString strPadding(_T(
            ' '),3*(nLength-nReturned));
                    strLine
            +=strPadding;
                }
                strLine
            +=_T("  ");
                strLine
            +=strCharsIn;

                delete pszBuffer;
                
            return true;
            }
            3、視圖的編碼
                  首先,定義一些變量,并對(duì)數(shù)據(jù)的字體進(jìn)行改變
            class CHexViewerView : public CScrollView
            {
            .
            protected:
                CFont
            * m_pFont;
                LOGFONT m_logfont;
                
            int m_nPointSize;
                
            int m_nPageHeight;
                
            int m_nPageWidth;
            .
            };

            CHexViewerView::CHexViewerView()
            {
                
            // TODO: add construction code here
                memset(&m_logfont,0,sizeof(m_logfont));
                m_nPointSize
            =120;
                _tcscpy(m_logfont.lfFaceName,_T(
            "Fixedsys"));
                
            //函數(shù)原型:char *strcpy( char *strDestination, const char *strSource );


                CWindowDC dc(NULL);
                m_logfont.lfHeight
            =::MulDiv(m_nPointSize,dc.GetDeviceCaps(LOGPIXELSY),720);
                
            //MulDiv字體高度值和磅值有如下的換算公式;GetDeviceCaps該函數(shù)檢索指定設(shè)備的設(shè)備指定信息。
                
            //LOGPIXELSY沿屏幕高度每邏輯英寸的像素?cái)?shù),在多顯示器系統(tǒng)中,該值對(duì)所顯示器相同;
                m_logfont.lfPitchAndFamily=FIXED_PITCH;//指定字體間距和字體族,低端二位指定字體的字符間距
                m_pFont=new CFont;
                m_pFont
            ->CreateFontIndirect(&m_logfont);
            }

            CHexViewerView::
            ~CHexViewerView()
            {
                
            if (m_pFont!=NULL)
                {
                    delete m_pFont;
                }
            }
                  設(shè)置滾動(dòng)的大小,可以向其傳遞映射模式(MM_TEXT顯示文本)和文檔大小(m_lFileSize)
            void CHexViewerView::OnInitialUpdate()
            {
                CScrollView::OnInitialUpdate();

                CHexViewerDoc
            * pDoc=GetDocument();
                ASSERT_VALID(pDoc);

                CSize sizeTotal(
            0,pDoc->m_lFileSize);
                
            //sizeTotal.cx = sizeTotal.cy = 100;
                SetScrollSizes(MM_TEXT, sizeTotal);
            }
                  給視圖添加為當(dāng)前設(shè)備上下文(DC)計(jì)算字體高度(以像素計(jì))的輔助函數(shù)。這里的技巧是傳遞-1作為字符串長(zhǎng)度。這意味著不進(jìn)行任何實(shí)際繪制操作,但是DrawText函數(shù)仍返回指定文本的高度。
            int CHexViewerView::MeasureFontHeight(CFont* pFont,CDC* pDC)
            {
                CFont
            * pOldFont;
                pOldFont
            =pDC->SelectObject(pFont);

                CRect rectDummy;
                CString strRender
            =_T("1234567890ABCDEF- ");
                
            int nHeight=pDC->DrawText(strRender,-1,rectDummy,DT_TOP|DT_SINGLELINE|DT_CALCRECT);

                pDC
            ->SelectObject(pOldFont);

                
            return nHeight;
                  最后隊(duì)試圖進(jìn)行修改,用GetScrollPosition返回用戶滾動(dòng)的位置,用GetClientRect來(lái)返回工作區(qū)的大小,用MeasureFontHeight返回每行的高度,然后可以用一個(gè)for循環(huán)通過(guò)ReadLine函數(shù)來(lái)從文檔中檢索每行數(shù)據(jù)。
            void CHexViewerView::OnDraw(CDC* pDC)
            {
                CHexViewerDoc
            * pDoc = GetDocument();
                ASSERT_VALID(pDoc);

                CString strRender;
                CFont
            * pOldFont;
                CSize ScrolledSize;
                
            int nStartLine;
                
            int nHeight;
                CRect ScrollRect;
                CPoint ScrolledPos
            =GetScrollPosition();//獲取該屏滾動(dòng)條的位置


                CRect rectClient;
                GetClientRect(
            &rectClient);

                pOldFont
            =pDC->SelectObject(m_pFont);
                nHeight
            =MeasureFontHeight(m_pFont,pDC);

                ScrolledSize
            =CSize(rectClient.Width(),rectClient.Height());
                ScrollRect
            =CRect(rectClient.left,ScrolledPos.y,rectClient.right,ScrolledSize.cy+ScrolledPos.y);
                nStartLine
            =ScrolledPos.y/16;

                ScrollRect.top
            =nStartLine*nHeight;

                
            if(pDoc->m_pFile!=NULL)
                {
                    
            int nLine;
                    
            for(nLine=nStartLine;ScrollRect.top<ScrollRect.bottom;nLine++)
                    {
                        
            if(!pDoc->ReadLine(strRender,16,nLine*16))
                            
            break;

                        nHeight
            =pDC->DrawText(strRender,-1,&ScrollRect,DT_TOP|DT_NOPREFIX|DT_SINGLELINE);
                        ScrollRect.top
            +=nHeight;
                    }
                }

                pDC
            ->SelectObject(pOldFont);
            }
            posted on 2009-07-02 11:15 The_Moment 閱讀(1076) 評(píng)論(1)  編輯 收藏 引用 所屬分類: VC實(shí)踐

            FeedBack:
            # re: HexViewer[未登錄](méi)
            2011-09-19 13:10 | a
            eeeeeeee  回復(fù)  更多評(píng)論
              
            欧美一区二区三区久久综| 国内精品久久久久久99| 久久久久高潮综合影院| 亚洲精品乱码久久久久66| 色综合久久综精品| 亚洲国产成人精品91久久久| 久久精品中文闷骚内射| 国内精品久久久久久久久电影网| 久久只有这精品99| 久久精品男人影院| 综合久久国产九一剧情麻豆| 94久久国产乱子伦精品免费 | 久久久精品久久久久特色影视| 人妻丰满?V无码久久不卡| 久久99热国产这有精品| 99精品国产99久久久久久97| 国产伊人久久| 久久天堂电影网| 精品国产乱码久久久久久郑州公司| 九九热久久免费视频| 狠狠色丁香久久婷婷综合五月| 久久91精品国产91| 久久国产三级无码一区二区 | 久久青青草原精品国产软件| 国产三级久久久精品麻豆三级 | 色8激情欧美成人久久综合电| 久久99精品国产麻豆宅宅| 日韩乱码人妻无码中文字幕久久| 久久久午夜精品| 亚洲国产小视频精品久久久三级 | 久久久久久综合一区中文字幕 | 精品久久久久久成人AV| 亚洲中文久久精品无码ww16| 亚洲国产精品成人AV无码久久综合影院 | 国产精品久久婷婷六月丁香| 青青草国产97免久久费观看| 久久国产精品波多野结衣AV| 国内精品久久久久久不卡影院| 国产亚洲色婷婷久久99精品91| 久久久久久久综合日本亚洲 | 日本WV一本一道久久香蕉|