Annotation of mstools/mfc/samples/fileview/fileview.cpp, revision 1.1.1.1

1.1       root        1: // fileview.cpp : Defines the class behaviors for the application.
                      2: //
                      3: // This is a part of the Microsoft Foundation Classes C++ library.
                      4: // Copyright (C) 1992 Microsoft Corporation
                      5: // All rights reserved.
                      6: //
                      7: // This source code is only intended as a supplement to the
                      8: // Microsoft Foundation Classes Reference and Microsoft
                      9: // QuickHelp documentation provided with the library.
                     10: // See these sources for detailed information regarding the
                     11: // Microsoft Foundation Classes product.
                     12: 
                     13: #include "fileview.h"
                     14: 
                     15: #include "afxdlgs.h"
                     16: 
                     17: #define SIZESTRING  256        // max characters in string
                     18: 
                     19: /////////////////////////////////////////////////////////////////////////////
                     20: 
                     21: // theApp:
                     22: // Just creating this application object runs the whole application.
                     23: //
                     24: CTheApp theApp;
                     25: 
                     26: /////////////////////////////////////////////////////////////////////////////
                     27: 
                     28: // CMainWindow constructor:
                     29: // Create the window with the appropriate style, size, menu, etc.
                     30: //
                     31: CMainWindow::CMainWindow()
                     32: {
                     33:        VERIFY(LoadAccelTable( "MainAccelTable" ));
                     34:        VERIFY(Create( NULL, "FileView Application",
                     35:                WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
                     36:                rectDefault, NULL, "MainMenu" ));
                     37: }
                     38: 
                     39: CMainWindow::~CMainWindow()
                     40: {
                     41:        if (m_pMyFile != NULL)
                     42:        {
                     43:                m_pMyFile->Close();
                     44:                delete m_pMyFile;
                     45:        }
                     46: }
                     47: // OnCreate
                     48: //
                     49: 
                     50: int CMainWindow::OnCreate( LPCREATESTRUCT /* lpcs */)
                     51: {
                     52:        TEXTMETRIC tm;
                     53:        CWindowDC dc( this );
                     54: 
                     55:        dc.SelectStockObject( SYSTEM_FIXED_FONT );
                     56:        dc.GetTextMetrics( &tm );
                     57: 
                     58:        m_nCxChar = tm.tmAveCharWidth;
                     59:        m_nCyChar = tm.tmHeight + tm.tmExternalLeading;
                     60: 
                     61:        m_nVScrollPos = 0;
                     62:        m_nHScrollPos = 0;
                     63:        m_lTopLine = 0L;
                     64:        m_pMyFile = NULL;
                     65: 
                     66:        SetScrollRange( SB_VERT, 0, SCROLLMAX, FALSE );
                     67:        SetScrollRange( SB_HORZ, 0, SIZESTRING, FALSE );
                     68: 
                     69:        return 0;
                     70: }
                     71: 
                     72: 
                     73: // OnPaint
                     74: //
                     75: 
                     76: void CMainWindow::OnPaint()
                     77: {
                     78:        char        acBuf[ SIZESTRING ];
                     79:        CPaintDC    dc( this );
                     80:        CRect       rect, rect2;
                     81:        int         y;
                     82:        char*       pc;
                     83: 
                     84:        GetClientRect( &rect );
                     85:        dc.SetTextAlign( TA_LEFT );
                     86:        dc.SelectStockObject( SYSTEM_FIXED_FONT );
                     87:        dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
                     88:        dc.SetBkColor(::GetSysColor(COLOR_WINDOW));
                     89:        if ( m_pMyFile != NULL )
                     90:        {
                     91:                TRY
                     92:                {
                     93:                        m_pMyFile->Seek( m_lTopLine, CFile::begin );
                     94:                }
                     95:                CATCH( CFileException, e )
                     96:                {
                     97:                        TRACE( "Bad Seek in OnPaint %ld\n", m_lTopLine );
                     98:                }
                     99:                END_CATCH
                    100: 
                    101:                rect2.left  = rect.left;
                    102:                rect2.right = rect.right;
                    103: 
                    104:                m_nLinesPainted = 0;
                    105:                for ( y = m_nCxChar/2; y < rect.bottom; y += m_nCyChar )
                    106:                {
                    107:                        m_pMyFile->NextLine( acBuf, SIZESTRING );
                    108: 
                    109:                        pc = acBuf;
                    110:                        if ( (int)strlen(acBuf) < m_nHScrollPos)
                    111:                        {
                    112:                                *acBuf = 0;
                    113:                        }
                    114:                        else
                    115:                        {
                    116:                                pc += m_nHScrollPos;
                    117:                        }
                    118: 
                    119:                        rect2.top = y;
                    120:                        rect2.bottom = y + m_nCyChar;
                    121:                        dc.ExtTextOut( m_nCyChar/2, rect2.top, ETO_OPAQUE, &rect2,
                    122:                                                   pc, strlen(pc), NULL );
                    123:                        m_nLinesPainted++;
                    124:                }
                    125:        }
                    126: }
                    127: 
                    128: // OnAbout:
                    129: //
                    130: 
                    131: void CMainWindow::OnAbout()
                    132: {
                    133:        CModalDialog about( "AboutBox", this );
                    134:        about.DoModal();
                    135: }
                    136: 
                    137: // OnExit:
                    138: //
                    139: 
                    140: void CMainWindow::OnExit()
                    141: {
                    142:        DestroyWindow();
                    143: }
                    144: 
                    145: // OnOpen:
                    146: //
                    147: 
                    148: void CMainWindow::OnOpen()
                    149: {
                    150:        CString strFileName, strFileTitle;
                    151: 
                    152:        //
                    153:        // First close any open file
                    154:        //
                    155: 
                    156:        if ( m_pMyFile != NULL )
                    157:        {
                    158:                m_pMyFile->Close();
                    159:                delete m_pMyFile;
                    160:                m_pMyFile = NULL;
                    161:                SetWindowText( "No File" );
                    162:                Invalidate( TRUE );
                    163:                m_lTopLine = 0L;
                    164:                m_nVScrollPos = 0;
                    165:                SetScrollPos( SB_VERT, m_nVScrollPos, TRUE );
                    166:                m_nHScrollPos = 0;
                    167:                SetScrollPos( SB_HORZ, m_nHScrollPos, TRUE );
                    168:        }
                    169: 
                    170:        TRY
                    171:        {
                    172:                BOOL bValidFileName = FALSE;
                    173:                BOOL bStringsReleased = FALSE;
                    174: 
                    175:                if (FileDlg(TRUE, SIZESTRING, strFileName.GetBuffer(SIZESTRING),
                    176:                                SIZESTRING, strFileTitle.GetBuffer(SIZESTRING)))
                    177:                {
                    178:                        strFileName.ReleaseBuffer();
                    179:                        strFileTitle.ReleaseBuffer();
                    180:                        bStringsReleased = TRUE;
                    181:                        bValidFileName = TRUE;
                    182:                }
                    183: 
                    184:                if (!bStringsReleased)
                    185:                {
                    186:                        strFileName.ReleaseBuffer();
                    187:                        strFileTitle.ReleaseBuffer();
                    188:                }
                    189: 
                    190:                if (bValidFileName)
                    191:                {
                    192:                        //
                    193:                        // try to open the file here
                    194:                        //
                    195:                        m_pMyFile = new CLineFile( strFileName,
                    196:                                                                                CFile::modeRead | CFile::typeBinary);
                    197:                        m_lFileSize = m_pMyFile->GetLength();
                    198: 
                    199:                        // check to make sure it is a text file
                    200:                        BYTE byBuf[128];
                    201:                        for (int iby = m_pMyFile->Read(&byBuf, 128); --iby >= 0;)
                    202:                                if (byBuf[iby] > 128)
                    203:                                {
                    204:                                        m_pMyFile->Close();
                    205:                                        delete m_pMyFile;
                    206:                                        m_pMyFile = NULL;
                    207:                                        m_lFileSize = 0L;
                    208:                                        MessageBox("File contains non-printable characters", 
                    209:                                                "Error", MB_OK);
                    210:                                        return;
                    211:                                }
                    212:                        m_pMyFile->SeekToBegin();
                    213: 
                    214:                        SetWindowText( strFileTitle );
                    215:                        Invalidate(TRUE);
                    216:                }
                    217:        }
                    218:        CATCH( CFileException, e )
                    219:        {
                    220:                char ErrorMsg[ 80 ];
                    221:                sprintf( ErrorMsg,"Opening %s returned a 0x%lx.",
                    222:                                (const char*)strFileTitle, e->m_lOsError );
                    223:                MessageBox( ErrorMsg, "File Open Error" );
                    224:        }
                    225:        END_CATCH
                    226: }
                    227: 
                    228: //
                    229: // OnVScroll:
                    230: 
                    231: void CMainWindow::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* /* pScrollBar */)
                    232: {
                    233:        char        acBuf[SIZESTRING];
                    234:        LONG        oldLine = m_lTopLine;
                    235:        LONG        l;
                    236: 
                    237:        if ( m_pMyFile == NULL )
                    238:        {
                    239:                return;
                    240:        }
                    241: 
                    242:        TRY
                    243:        {
                    244:                switch ( nSBCode )
                    245:                {
                    246:                case SB_LINEUP:
                    247:                        if ( m_lTopLine == 0L )
                    248:                        {
                    249:                                break;
                    250:                        }
                    251:                        m_pMyFile->SetBegin( m_lTopLine );
                    252:                        m_lTopLine = m_pMyFile->BackLines( acBuf, SIZESTRING, 1 );
                    253:                        break;
                    254: 
                    255:                case SB_LINEDOWN:
                    256:                        m_pMyFile->Seek( m_lTopLine, CFile::begin);
                    257:                        m_lTopLine = m_pMyFile->NextLine( acBuf, SIZESTRING );
                    258:                        break;
                    259: 
                    260:                case SB_PAGEUP:
                    261:                        if ( m_lTopLine == 0L )
                    262:                        {
                    263:                                break;
                    264:                        }
                    265:                        m_pMyFile->SetBegin( m_lTopLine );
                    266:                        m_lTopLine = m_pMyFile->BackLines( acBuf, SIZESTRING,
                    267:                                                                                           m_nLinesPainted );
                    268:                        break;
                    269: 
                    270:                case SB_PAGEDOWN:
                    271:                        m_lTopLine = m_pMyFile->GetPosition();
                    272:                        break;
                    273: 
                    274:                case SB_BOTTOM:
                    275:                        nPos = 1000;
                    276:                        goto ThumbGoTo;
                    277: 
                    278:                case SB_TOP:
                    279:                        nPos = 0;
                    280:                        // fall thru
                    281: 
                    282:                case SB_THUMBPOSITION:
                    283:        ThumbGoTo:
                    284: 
                    285:                        m_nVScrollPos = nPos;
                    286:                        if ( m_lFileSize > 40000L )
                    287:                        {
                    288:                                l = ( m_lFileSize / 1000L ) * nPos;
                    289:                        }
                    290:                        else
                    291:                        {
                    292:                                l = ( m_lFileSize * nPos ) / 1000L;
                    293:                        }
                    294: 
                    295:                        m_lTopLine = m_pMyFile->LineNear( acBuf, SIZESTRING, l );
                    296:                        break;
                    297: 
                    298:                default:
                    299:                        return;
                    300:                }
                    301:        }
                    302:        CATCH( CFileException, e )
                    303:        {
                    304:                TRACE( "Bad Seek in OnVScroll\n" );
                    305:                m_lTopLine = 0L;
                    306:        }
                    307:        END_CATCH
                    308: 
                    309:        if ( m_lTopLine < 0L )
                    310:        {
                    311:                m_lTopLine = 0L;
                    312:        }
                    313: 
                    314:        if ( m_lFileSize > 40000 )
                    315:        {
                    316:                m_nVScrollPos = (short)(m_lTopLine  / ( m_lFileSize / 1000L ));
                    317:        }
                    318:        else
                    319:        {
                    320:                m_nVScrollPos = (short)(m_lTopLine * 1000L / m_lFileSize);
                    321:        }
                    322: 
                    323:        if ( m_nVScrollPos < 0 )
                    324:        {
                    325:                m_nVScrollPos = 0;
                    326:        }
                    327:        if ( m_nVScrollPos > SCROLLMAX )
                    328:        {
                    329:                m_nVScrollPos = SCROLLMAX;
                    330:        }
                    331: 
                    332:        SetScrollPos( SB_VERT, m_nVScrollPos, TRUE );
                    333: 
                    334:        if ( m_lTopLine != oldLine )
                    335:        {
                    336:                Invalidate( FALSE );
                    337:        }
                    338: }
                    339: 
                    340: // OnHScroll:
                    341: //
                    342: 
                    343: void
                    344: CMainWindow::OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* /* pScrollBar */)
                    345: {
                    346:        if ( m_pMyFile == NULL )
                    347:        {
                    348:                return;
                    349:        }
                    350: 
                    351:        switch ( nSBCode )
                    352:        {
                    353:        case SB_LINEUP:
                    354:                m_nHScrollPos -= 1;
                    355:                break;
                    356: 
                    357:        case SB_LINEDOWN:
                    358:                m_nHScrollPos += 1;
                    359:                break;
                    360: 
                    361:        case SB_PAGEUP:
                    362:                m_nHScrollPos -= 10;
                    363:                break;
                    364: 
                    365:        case SB_PAGEDOWN:
                    366:                m_nHScrollPos += 10;
                    367:                break;
                    368: 
                    369:        case SB_TOP:
                    370:                nPos = 0;
                    371:                // fall thru
                    372:        case SB_THUMBPOSITION:
                    373:                m_nHScrollPos = nPos;
                    374:                break;
                    375: 
                    376:        default:
                    377:                return;
                    378:        }
                    379: 
                    380:        if ( m_nHScrollPos < 0 )
                    381:        {
                    382:                m_nHScrollPos = 0;
                    383:        }
                    384: 
                    385:        if ( m_nHScrollPos > SIZESTRING )
                    386:        {
                    387:                m_nHScrollPos = SIZESTRING;
                    388:        }
                    389: 
                    390:        SetScrollPos( SB_HORZ, m_nHScrollPos, TRUE );
                    391:        Invalidate( FALSE );
                    392: }
                    393: 
                    394: //
                    395: // catch arrow keys and simulate touching scroll bars
                    396: //
                    397: void
                    398: CMainWindow::OnKeyDown( UINT wChar, UINT /* nRepCnt */, UINT /* wFlags */)
                    399: {
                    400:        switch( wChar )
                    401:        {
                    402:        case VK_HOME:
                    403:                SendMessage( WM_VSCROLL, SB_TOP, 0L);
                    404:                SendMessage( WM_HSCROLL, SB_TOP, 0L);
                    405:                break;
                    406: 
                    407:        case VK_END:
                    408:                SendMessage( WM_VSCROLL, SB_BOTTOM, 0L);
                    409:                break;
                    410: 
                    411:        case VK_PRIOR:
                    412:                SendMessage( WM_VSCROLL, SB_PAGEUP, 0L);
                    413:                break;
                    414: 
                    415:        case VK_NEXT:
                    416:                SendMessage( WM_VSCROLL, SB_PAGEDOWN, 0L);
                    417:                break;
                    418: 
                    419:        case VK_UP:
                    420:                SendMessage( WM_VSCROLL, SB_LINEUP, 0L);
                    421:                break;
                    422: 
                    423:        case VK_DOWN:
                    424:                SendMessage( WM_VSCROLL, SB_LINEDOWN, 0L);
                    425:                break;
                    426: 
                    427:        case VK_RIGHT:
                    428:                SendMessage( WM_HSCROLL, SB_LINEDOWN, 0L);
                    429:                break;
                    430: 
                    431:        case VK_LEFT:
                    432:                SendMessage( WM_HSCROLL, SB_LINEUP, 0L);
                    433:                break;
                    434:        }
                    435: }
                    436: 
                    437: BOOL
                    438: CMainWindow::FileDlg( BOOL bOpen, int nMaxFile, LPSTR szFile,
                    439:                int nMaxFileTitle, LPSTR szFileTitle )
                    440: {
                    441:        char szFilter[] = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*||";
                    442:        CFileDialog dlg(bOpen, "txt", szFile, OFN_HIDEREADONLY, szFilter);
                    443: 
                    444:        // This example shows how to access the OPENFILENAME struct
                    445:        // directly.
                    446:        dlg.m_ofn.lpstrFile = szFile;
                    447:        dlg.m_ofn.lpstrFileTitle = szFileTitle;
                    448:        dlg.m_ofn.nMaxFileTitle = nMaxFileTitle;
                    449:        
                    450:        return dlg.DoModal() == IDOK ? TRUE : FALSE;
                    451: }
                    452: 
                    453: // CMainWindow message map:
                    454: // Associate messages with member functions.
                    455: //
                    456: // It is implied that the ON_WM_PAINT macro expects a member function
                    457: // "void OnPaint()".
                    458: //
                    459: // It is implied that members connected with the ON_COMMAND macro
                    460: // receive no arguments and are void of return type, e.g., "void OnAbout()".
                    461: //
                    462: BEGIN_MESSAGE_MAP( CMainWindow, CFrameWnd )
                    463:        ON_WM_PAINT()
                    464:        ON_COMMAND( IDM_ABOUT, OnAbout )
                    465:        ON_COMMAND( IDM_OPEN,  OnOpen )
                    466:        ON_COMMAND( IDM_EXIT,  OnExit )
                    467:        ON_WM_HSCROLL()
                    468:        ON_WM_VSCROLL()
                    469:        ON_WM_CREATE()
                    470:        ON_WM_KEYDOWN()
                    471: END_MESSAGE_MAP()
                    472: 
                    473: /////////////////////////////////////////////////////////////////////////////
                    474: // CTheApp
                    475: 
                    476: // InitInstance:
                    477: // When any CTheApp object is created, this member function is automatically
                    478: // called.  Any data may be set up at this point.
                    479: //
                    480: // Also, the main window of the application should be created and shown here.
                    481: // Return TRUE if the initialization is successful.
                    482: //
                    483: BOOL CTheApp::InitInstance()
                    484: {
                    485:        m_pMainWnd = new CMainWindow();
                    486:        m_pMainWnd->ShowWindow( m_nCmdShow );
                    487:        m_pMainWnd->UpdateWindow();
                    488: 
                    489:        return TRUE;
                    490: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.