• <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(基類(lèi))改為CScrollView。CScrollView就是CView的一個(gè)派生類(lèi),通過(guò)它可以很容易地處理水平和垂直滾動(dòng)。
            2、打開(kāi)和讀取文件
                  首先,在CHexViewerDoc類(lèi)中定義兩個(gè)成員變量,分別用于檢索要打開(kāi)文件的指針以及文件的大小,并初始化這些值,同時(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框架的因公程序中打開(kāi)文檔后,還會(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ù)從打開(kāi)的文件中讀取一行數(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返回用戶(hù)滾動(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 閱讀(1100) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): VC實(shí)踐

            FeedBack:
            # re: HexViewer[未登錄](méi)
            2011-09-19 13:10 | a
            eeeeeeee  回復(fù)  更多評(píng)論
              
            午夜精品久久久久久中宇| 欧美日韩精品久久久久 | 久久精品人人做人人爽电影| 久久99国产精品尤物| 天天综合久久久网| 亚洲欧美精品一区久久中文字幕| 亚洲人成网亚洲欧洲无码久久 | 久久亚洲中文字幕精品一区| 久久超碰97人人做人人爱| 国产成人无码精品久久久久免费 | 国产精品一久久香蕉国产线看 | 伊人久久大香线蕉AV色婷婷色| 国产精品国色综合久久| 精品无码人妻久久久久久| 久久亚洲精品成人av无码网站| 99久久成人18免费网站| 久久综合久久自在自线精品自 | 日日噜噜夜夜狠狠久久丁香五月 | 久久国产AVJUST麻豆| 久久精品国产影库免费看| 亚洲中文字幕久久精品无码APP | 国产69精品久久久久9999| av国内精品久久久久影院| 久久久久久国产精品无码下载| 九九99精品久久久久久| 久久影院综合精品| 亚洲va久久久噜噜噜久久男同| 欧美性猛交xxxx免费看久久久| 久久被窝电影亚洲爽爽爽| 久久人人爽人人爽人人AV东京热| 怡红院日本一道日本久久 | 国产精品久久久久国产A级| 久久SE精品一区二区| 无码国内精品久久综合88| 青青草国产97免久久费观看| 91精品国产综合久久香蕉| 一级做a爰片久久毛片人呢| 成人国内精品久久久久影院VR| 99国产欧美久久久精品蜜芽| 人人狠狠综合久久88成人| 欧美黑人又粗又大久久久|