• <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項目,在創(chuàng)建單文檔時把Base Class(基類)改為CScrollView。CScrollView就是CView的一個派生類,通過它可以很容易地處理水平和垂直滾動。
            2、打開和讀取文件
                  首先,在CHexViewerDoc類中定義兩個成員變量,分別用于檢索要打開文件的指針以及文件的大小,并初始化這些值,同時添加用于清除的代碼。
            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框架的因公程序中打開文檔后,還會調(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;
            }
                  最后添加一個輔助成員函數(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);
                    
            //這個宏是用來調(diào)試用的,在VC的窗口的輸入框中會看到輸出的內(nèi)容!只有在debug版本中才會運行 
                    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位的十六進制讀取
                    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、視圖的編碼
                  首先,定義一些變量,并對數(shù)據(jù)的字體進行改變
            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ù)檢索指定設備的設備指定信息。
                
            //LOGPIXELSY沿屏幕高度每邏輯英寸的像素數(shù),在多顯示器系統(tǒng)中,該值對所顯示器相同;
                m_logfont.lfPitchAndFamily=FIXED_PITCH;//指定字體間距和字體族,低端二位指定字體的字符間距
                m_pFont=new CFont;
                m_pFont
            ->CreateFontIndirect(&m_logfont);
            }

            CHexViewerView::
            ~CHexViewerView()
            {
                
            if (m_pFont!=NULL)
                {
                    delete m_pFont;
                }
            }
                  設置滾動的大小,可以向其傳遞映射模式(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);
            }
                  給視圖添加為當前設備上下文(DC)計算字體高度(以像素計)的輔助函數(shù)。這里的技巧是傳遞-1作為字符串長度。這意味著不進行任何實際繪制操作,但是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;
                  最后隊試圖進行修改,用GetScrollPosition返回用戶滾動的位置,用GetClientRect來返回工作區(qū)的大小,用MeasureFontHeight返回每行的高度,然后可以用一個for循環(huán)通過ReadLine函數(shù)來從文檔中檢索每行數(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();//獲取該屏滾動條的位置


                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 閱讀(1074) 評論(1)  編輯 收藏 引用 所屬分類: VC實踐

            FeedBack:
            # re: HexViewer[未登錄]
            2011-09-19 13:10 | a
            eeeeeeee  回復  更多評論
              
            人妻精品久久久久中文字幕69| 99久久国产主播综合精品| 久久久噜噜噜久久中文字幕色伊伊 | 久久精品嫩草影院| 国产精品成人无码久久久久久| 欧美精品福利视频一区二区三区久久久精品 | 国产成人无码精品久久久性色| 亚洲狠狠婷婷综合久久蜜芽 | 久久久国产视频| 国产精品久久久福利| 欧美精品丝袜久久久中文字幕| 一本久久知道综合久久| 国产精品gz久久久| 久久久久人妻一区精品色 | 亚洲精品乱码久久久久久| 91精品国产91久久| 亚洲精品tv久久久久久久久| 久久99精品久久久久久不卡| 久久精品国产亚洲AV香蕉| 欧美亚洲国产精品久久| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久无码专区国产精品发布| 91超碰碰碰碰久久久久久综合| 久久久久人妻一区二区三区vr| 免费精品国产日韩热久久| 久久久久综合中文字幕| 久久se精品一区精品二区国产| 国产精品久久久久久久久| 午夜欧美精品久久久久久久| 伊人色综合久久天天人守人婷| 久久精品人妻一区二区三区| 9999国产精品欧美久久久久久| 99久久精品国产免看国产一区| 久久精品蜜芽亚洲国产AV| 久久亚洲sm情趣捆绑调教| 麻豆久久久9性大片| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 亚洲中文久久精品无码ww16| 中文国产成人精品久久不卡| 亚洲精品无码成人片久久| 久久大香香蕉国产|