APP.CXX
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:16k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //+--------------------------------------------------------
  2. // File:        App.cxx
  3. //
  4. // Classes:     CController
  5. //
  6. // Functions:   WinMain
  7. //              WndProc
  8. //              MakeWindowClass
  9. //              AboutDlgProc
  10. // PropDlgProc
  11. //
  12. // History:     22-Jan-1993     asmusf  created
  13. //----------------------------------------------------------
  14. #include <windows.h>
  15. #include <windowsx.h>
  16. #include "app.hxx"
  17. // global for use by PropDlgProc
  18. CCTypeSet * pCSet = NULL;
  19. //+--------------------------------------------------------
  20. // Class:       CController
  21. //
  22. // Purpose:     Controlling the application, UI handler
  23. //
  24. // History:     22-Jan-1993     asmusf  created
  25. //----------------------------------------------------------
  26. void CController::Create(HWND hwnd, LONG lParam )
  27. {
  28.     HANDLE handle = ((LPCREATESTRUCT) lParam)->hInstance;
  29.     _hInst = (HINSTANCE)handle;
  30.     _funAbout = (DLGPROC) MakeProcInstance((FARPROC)AboutDlgProc, _hInst);
  31. _funProp = (DLGPROC) MakeProcInstance((FARPROC) PropDlgProc, _hInst );
  32.     // Set up the Main View
  33.     _pView = new CScrollableView(((LPCREATESTRUCT) lParam)->cx,
  34.                                 ((LPCREATESTRUCT) lParam)->cy);
  35.     _pView->SetScale(100);
  36.     SetScrollRange(hwnd, SB_VERT, 0, PAGEHEIGHT, FALSE);
  37.     SetScrollRange(hwnd, SB_HORZ, 0, PAGEWIDTH, FALSE);
  38.     SetScrollPos(hwnd, SB_HORZ, 0, TRUE );
  39.     SetScrollPos(hwnd, SB_VERT, 0, TRUE );
  40.     // Set up the Model
  41.     _pModel= new CModel(_hInst, hwnd, HEXADECIMAL, USEDONLY);
  42.     // Set up the initial state of the Menu
  43.     Page(hwnd, IDM_FIRSTPAGE);
  44.     // initially no pop-up character box
  45.     _pBox = 0;
  46. }
  47. void CController::Destroy()
  48. {
  49.     FreeProcInstance((FARPROC)AboutDlgProc);
  50.     delete _pView;
  51.     delete _pModel;
  52.     PostQuitMessage(0);
  53. }
  54. void CController::Size ( LONG lParam )
  55. {
  56.    _pView->SetSize ( LOWORD(lParam), HIWORD(lParam) );
  57. }
  58. // Message Box with text from resource file
  59. void CController::AlertBox( HWND hwnd, UINT idsText, UINT fuStyle)
  60. {
  61.     TCHAR szText[100];
  62.     TCHAR szCaption[100];
  63.     LoadString(_hInst, idsText, (LPTSTR)szText, 100);
  64.     LoadString(_hInst, IDS_MSGCAPTION, (LPTSTR)szCaption, 100);
  65.     ::MessageBox (hwnd, (LPTSTR)szText, (LPTSTR)szCaption, fuStyle) ;
  66. };
  67. // Menu commands processing
  68. void CController::Command ( HWND hwnd, WPARAM wID )
  69. {
  70.     switch ( wID )
  71.     {
  72.       // File Menu
  73.       case IDM_PRINT:
  74.            {
  75.                 CPrintRequest job(hwnd, 1, _pModel->GetMaxPage());
  76.                 if(!job.Cancelled() && !job.Error())
  77.                 {
  78.                     CPrintCanvas canvas (job);
  79.                     job.Print (_hInst, canvas, _pModel);
  80.                     
  81.                     if(job.Error())
  82.                     {
  83.                         AlertBox (hwnd, IDS_PRINTERR, MB_OK | MB_ICONEXCLAMATION) ;
  84.                     }
  85.                 }
  86.            }
  87.            break;
  88.       case IDM_EXIT:
  89.            SendMessage ( hwnd, WM_CLOSE, 0L, 0L );
  90.            break;
  91.       // View Menu
  92.       case IDM_NEXTPAGE:
  93.            Page(hwnd, IDM_NEXTPAGE);
  94.            break;
  95.       case IDM_PREVPAGE:
  96.            Page(hwnd, IDM_PREVPAGE);
  97.            break;
  98.       case IDM_NEXTSECTION:
  99.            Page(hwnd, IDM_NEXTSECTION);
  100.            break;
  101.       case IDM_PREVSECTION:
  102.            Page(hwnd, IDM_PREVSECTION);
  103.            break;
  104.       case IDM_ZOOMIN:
  105.            {
  106.                UINT iScale;
  107.                _pView->GetScale(iScale);
  108.                iScale -= (iScale > 50 ? 25 : 0);
  109.                _pView->SetScale(iScale);
  110.                _pView->Invalidate(hwnd);
  111.            }
  112.            break;
  113.       case IDM_ZOOMOUT:
  114.            {
  115.                UINT iScale;
  116.                _pView->GetScale(iScale);
  117.                iScale += (iScale < 200 ? 25 : 0);
  118.                _pView->SetScale(iScale);
  119.                _pView->Invalidate(hwnd);
  120.            }
  121.            break;
  122.       // Options Menu
  123.       case IDM_FONT:
  124.            _pModel->ChooseFont(hwnd);
  125.            _pView->Invalidate(hwnd);
  126.            break;
  127.      case IDM_DECIMAL:
  128.            {
  129.                UINT fuFormat;
  130.                _pModel->GetFormat(fuFormat);
  131.                fuFormat ^= DECIMAL;
  132.                CheckMenuItem (GetMenu(hwnd), IDM_DECIMAL, 
  133.                         fuFormat & DECIMAL ? MF_CHECKED : MF_UNCHECKED ) ;
  134.               _pModel->SetFormat(fuFormat);
  135.            }
  136.            _pView->Invalidate(hwnd);
  137.            break;
  138.       case IDM_ALLPAGES:
  139.            {
  140.                UINT fPageMode;
  141.                _pModel->GetPageMode(fPageMode);
  142.                fPageMode ^= ALLPAGES;
  143.                CheckMenuItem (GetMenu(hwnd), IDM_ALLPAGES, 
  144.                         fPageMode & ALLPAGES ? MF_CHECKED : MF_UNCHECKED ) ;
  145.                _pModel->SetPageMode(fPageMode);
  146.            }
  147.            _pView->Invalidate(hwnd);
  148.            break;
  149.   case IDM_SHOWPROP:
  150.       {
  151.     DialogBox( _hInst, TEXT("PROPERTIES"),hwnd, _funProp );
  152.     _pModel->SetCSet(pCSet);
  153.    }
  154.            _pView->Invalidate(hwnd);
  155.    break;
  156.       // Help Menu
  157.       case IDM_HELP:
  158.            AlertBox ( hwnd, IDS_NOTIMPLEM, MB_ICONINFORMATION | MB_OK);
  159.            break;
  160.       case IDM_ABOUT:
  161.            DialogBox ( _hInst, TEXT("AboutBox"), hwnd, _funAbout );
  162.            break;
  163.      }
  164. }
  165. void CController::Page(HWND hwnd, WPARAM wParam)
  166. {
  167.     UINT iPage = _pModel->GetPage();
  168.     switch (wParam)
  169.     {
  170.     case IDM_PREVPAGE: 
  171.         _pModel->PrevPage();
  172.         break;  
  173.     case IDM_NEXTPAGE:
  174.         _pModel->NextPage();
  175.         break;  
  176.     case IDM_NEXTSECTION:
  177.         _pModel->NextSection();
  178.         break;
  179.     case IDM_PREVSECTION:
  180.         _pModel->PrevSection();
  181.         break;
  182.     case IDM_FIRSTPAGE:
  183.         _pModel->SetPage( 0 );
  184.         break;  
  185.     case IDM_LASTPAGE:
  186.         _pModel->SetPage( _pModel->GetMaxPage() -1 );
  187.         break;  
  188.     }
  189.     if (iPage != _pModel->GetPage())
  190.     {   
  191.         _pView->Invalidate(hwnd);
  192.     }
  193.     HMENU hmenu = GetMenu(hwnd);
  194.     EnableMenuItem (hmenu, IDM_PREVPAGE, _pModel->CanPrevPage()  ?
  195.                       MF_ENABLED : MF_DISABLED | MF_GRAYED ) ;
  196.     EnableMenuItem (hmenu, IDM_NEXTPAGE, _pModel->CanNextPage() ?
  197.                       MF_ENABLED : MF_DISABLED | MF_GRAYED ) ;
  198.     EnableMenuItem (hmenu, IDM_NEXTSECTION, _pModel->CanNextSection() ?
  199.                       MF_ENABLED : MF_DISABLED | MF_GRAYED ) ;
  200.     EnableMenuItem (hmenu, IDM_PREVSECTION,_pModel->CanPrevSection() ?
  201.                       MF_ENABLED : MF_DISABLED | MF_GRAYED ) ;
  202. }
  203. void CController::ButtonDown(HWND hwnd, LONG lParam )
  204. {
  205.     static RECT rc;
  206.     SetCapture (hwnd);
  207. // second mouse click removes pop-up box
  208.     if( _pBox )
  209.     {
  210.         delete _pBox;
  211.         _pBox = 0;
  212. _pView->Invalidate(hwnd, &rc);
  213.         return;
  214.     }
  215.     
  216. // locate character selected
  217.     CScreenCanvas canvas(hwnd);
  218.     
  219.     POINT pt = {LOWORD(lParam), HIWORD(lParam)};
  220.     UINT iChar = _pView->Hittest(canvas, pt, _pModel);
  221.     
  222.     if( iChar == 0xFFFF )
  223.     {
  224.         return;   // no char selected
  225.     }
  226. // create the pop-up box
  227.     SIZE size = { 4*(INCH1-INCH8)/5, INCH1};
  228.     CBoxFormat bxf(size);
  229.     HFONT hfont = _pModel->GetFont();
  230.     _pBox = new CBox(bxf, iChar, hfont); 
  231. // match current format
  232.     UINT fuFormat;
  233. _pModel->GetFormat(fuFormat);
  234. _pBox->SetFormat(fuFormat & DECIMAL);
  235.     canvas.DPtoLP(&pt);
  236.     pt.x -= size.cx/2;
  237.     pt.y -= size.cy/2;
  238. #ifdef UNICODE
  239.     pt.x -= size.cx; // accommodate wider popup
  240. #endif
  241.     GetClientRect(hwnd, &rc);
  242. // show it
  243.     _pBox->Paint(canvas, pt, rc);
  244. //--- dead code....
  245.     size = _pBox->GetSize();
  246.     
  247. POINT ptSize;
  248. ptSize.x = size.cx;
  249. ptSize.y = size.cy;
  250. canvas.LPtoDP(&ptSize);
  251. pt.x+=ptSize.x;
  252. pt.y+=ptSize.y;
  253. }
  254. void CController::ButtonUp(HWND hwnd, LONG lParam )
  255. {
  256.     ReleaseCapture();
  257. }
  258. void CController::KeyDown(HWND hwnd, WPARAM wParam, LPARAM lParam)
  259. {
  260.     switch( wParam )
  261.     {
  262.     case VK_PRIOR:
  263.          Page(hwnd, IDM_PREVPAGE);
  264.          break;
  265.     case VK_NEXT:
  266.          Page(hwnd, IDM_NEXTPAGE);
  267.          break;
  268.     case VK_HOME:
  269.          Page(hwnd, IDM_FIRSTPAGE);
  270.          break;
  271.     case VK_END:
  272.          Page(hwnd, IDM_LASTPAGE);
  273.          break;
  274.     case VK_UP:
  275.          _pView->SetVScrollPos(hwnd, SB_LINEUP, lParam, _pModel);       
  276.          break;
  277.     case VK_DOWN:
  278.          _pView->SetVScrollPos(hwnd, SB_LINEDOWN, lParam, _pModel);     
  279.          break;
  280.     case VK_LEFT:
  281.          _pView->SetHScrollPos(hwnd, SB_LINEUP, lParam, _pModel);       
  282.          break;
  283.     case VK_RIGHT:
  284.          _pView->SetHScrollPos(hwnd, SB_LINEDOWN, lParam, _pModel);     
  285.          break;
  286.     }
  287. }
  288. void CController::KeyUp(HWND hwnd, WPARAM wParam, LPARAM lParam)
  289. {
  290. }
  291. void CController::HScroll(HWND hwnd, WPARAM wParam, LPARAM lParam)
  292. {
  293. if (_pBox)
  294. {
  295. // Remove box by simulating second mouse click
  296. ButtonDown(hwnd, 0); 
  297. UpdateWindow(hwnd);
  298. }
  299.     _pView->SetHScrollPos(hwnd, wParam, lParam, _pModel);       
  300. }
  301. void CController::VScroll(HWND hwnd, WPARAM wParam, LPARAM lParam)
  302. {
  303. if (_pBox)
  304. {
  305. // Remove box by simulating second mouse click
  306. ButtonDown(hwnd, 0); 
  307. UpdateWindow(hwnd);
  308. }
  309.     _pView->SetVScrollPos(hwnd, wParam, lParam, _pModel);       
  310. }
  311. // Main application
  312. // WinMain - Main window funtion
  313. //
  314. int WINAPI WinMain
  315.    ( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdParam, int cmdShow )
  316. {
  317.     TCHAR  szAppName [] = TEXT("Grid") ;
  318.     TCHAR  szCaption [] = TEXT("Character Grid") ;
  319.     // Create Window Class
  320.  
  321.     if ( hPrevInst == 0 )
  322.     {
  323.         MakeWindowClass ( WndProc, szAppName, hInst );
  324.     }
  325.     // Create Window
  326.     
  327.     CWindow win ( szCaption, szAppName, hInst );
  328.     
  329.     win.Show ( cmdShow );
  330.     
  331.     MSG  msg;
  332.     
  333.     while ( GetMessage (&msg, NULL, 0, 0 ) )
  334.     {
  335.         TranslateMessage ( &msg );
  336.         DispatchMessage ( &msg );
  337.     }
  338.     
  339.     return msg.wParam;
  340. }
  341. // Make Window Class
  342. //
  343. void MakeWindowClass ( WNDPROC WndProc, LPTSTR szAppName, HINSTANCE hInst )
  344. {
  345.     WNDCLASS cl;
  346.    
  347.     cl.style = CS_HREDRAW | CS_VREDRAW;
  348.     cl.lpfnWndProc = WndProc;
  349.     cl.cbClsExtra = 0;
  350.     cl.cbWndExtra = 0;
  351.     cl.hInstance = hInst;
  352.     cl.hIcon = LoadIcon ( hInst, szAppName );
  353.     cl.hCursor = LoadCursor ( NULL, IDC_ARROW );
  354.     cl.hbrBackground = GetStockBrush ( WHITE_BRUSH );
  355.     cl.lpszMenuName = szAppName;
  356.     cl.lpszClassName = szAppName;
  357.    
  358.     RegisterClass (&cl);
  359. }
  360. // Window Proc
  361. //
  362. LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
  363. {
  364.     static CController ctrl;
  365.     switch (message)
  366.     {
  367.         case WM_CREATE:
  368.             ctrl.Create(hwnd, lParam);
  369.             return 0;
  370.         case WM_SIZE:
  371.             ctrl.Size(lParam);
  372.             return 0;
  373.         case WM_PAINT:
  374.             ctrl.Paint(hwnd);
  375.             return 0;
  376.         case WM_COMMAND:
  377.             ctrl.Command(hwnd, wParam);
  378.             return 0;
  379.         case WM_LBUTTONUP:
  380.             ctrl.ButtonUp(hwnd, lParam);
  381.             return 0;
  382.         case WM_LBUTTONDOWN:
  383.             ctrl.ButtonDown(hwnd, lParam);
  384.             return 0;
  385.         case WM_KEYUP:
  386.             ctrl.KeyUp(hwnd, wParam, lParam);
  387.             return 0;
  388.         case WM_KEYDOWN:
  389.             ctrl.KeyDown(hwnd, wParam, lParam);
  390.             return 0;
  391.         case WM_VSCROLL:
  392.             ctrl.VScroll(hwnd, wParam, lParam );
  393.             return 0;
  394.         case WM_HSCROLL:
  395.             ctrl.HScroll(hwnd, wParam, lParam );
  396.             return 0;
  397.         case WM_DESTROY:
  398.             ctrl.Destroy();
  399.             return 0;
  400.     }
  401.     return DefWindowProc (hwnd, message, wParam, lParam );
  402. }
  403. // "About" dialog box procedure
  404. // Process messages from dialog box
  405. //
  406. BOOL CALLBACK AboutDlgProc
  407.    ( HWND hwnd, UINT message, WPARAM wParam, LONG lParam )
  408. {
  409.     switch(message)
  410.     {
  411.        case WM_INITDIALOG:
  412.             return TRUE;
  413.        case WM_COMMAND:
  414.             switch (wParam) //Command ID
  415.             {
  416.                case IDOK:
  417.                case IDCANCEL:
  418.                     EndDialog(hwnd, 0);
  419.                     return TRUE;
  420.             }
  421.             break;
  422.     }
  423.     return FALSE;
  424. }
  425. extern CPrintAux PrGlobal;
  426. //======== PrintDlgProc ===========================================
  427. BOOL CALLBACK PrintDlgProc
  428.    ( HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam )
  429. {
  430.     switch (message)
  431.     {
  432.         case WM_INITDIALOG:
  433.              SetWindowText (hwndDlg, (TCHAR *)lParam) ;
  434.              EnableMenuItem (GetSystemMenu (hwndDlg, FALSE), SC_CLOSE, MF_GRAYED) ;
  435.              return TRUE ;
  436.         case WM_COMMAND:
  437.              PrGlobal._bUserAbort = TRUE ;
  438.              EnableWindow (GetParent (hwndDlg), TRUE) ;
  439.              DestroyWindow (hwndDlg) ;
  440.              PrGlobal._hDlgPrint = 0 ;
  441.              return TRUE ;
  442.     }
  443.     return FALSE ;
  444. }
  445. //======== AbortProc ===========================================
  446. BOOL CALLBACK AbortProc(HDC hdcPrn, short nCode)
  447. {
  448.     MSG   msg ;
  449.     while (!PrGlobal._bUserAbort && PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
  450.     {
  451.         if (!PrGlobal._hDlgPrint 
  452.                 || 
  453.             !IsDialogMessage (PrGlobal._hDlgPrint, &msg))
  454.         {
  455.             TranslateMessage (&msg) ;
  456.             DispatchMessage (&msg) ;
  457.         }
  458.     }
  459.     return !PrGlobal._bUserAbort ;
  460. }
  461. //======== PropDlgProc ===========================================
  462. struct t_Ctype
  463. {
  464. WORD  fVal[3];
  465. LPTSTR pszName;
  466. } vCtype [] =  {
  467.  0x0001,0,0, TEXT("UPPER "),  // A
  468.  0x0002,0,0, TEXT("LOWER "),  //a
  469.  0x0004,0,0, TEXT("DIGIT "),  //1
  470.  0x0008,0,0, TEXT("SPACE "),  //_
  471.  0x0010,0,0, TEXT("PUNCT "),  //!
  472.  0x0020,0,0, TEXT("CNTRL "),
  473.  0x0040,0,0, TEXT("BLANK "),
  474.  0x0080,0,0, TEXT("XDIGIT "), //x
  475.  0x0100,0,0, TEXT("ALPHA "),  //alpha
  476.  0, 0x0001,0, TEXT("LEFTTORIGHT "), //>
  477.  0, 0x0002,0, TEXT("RIGHTTOLEFT "), //<
  478.  0, 0x0003,0, TEXT("EUROPENUMBER "),
  479.  0, 0x0004,0, TEXT("EUROPESEPARATOR "),
  480.  0, 0x0005,0, TEXT("EUROPETERMINATOR "),
  481.  0, 0x0006,0, TEXT("ARABICNUMBER "),
  482.  0, 0x0007,0, TEXT("COMMONSEPARATOR "),
  483.  0, 0x0008,0, TEXT("BLOCKSEPARATOR "),
  484.  0, 0x0009,0, TEXT("SEGMENTSEPARATOR "),
  485.  0, 0x000a,0, TEXT("WHITESPACE "),  // _
  486.  0, 0x000b,0, TEXT("OTHERNEUTRAL "),  //<>
  487.  0,0,0x0001, TEXT("NONSPACING "),
  488.  0,0,0x0002, TEXT("DIACRITIC "),  //  "
  489.  0,0,0x0004, TEXT("VOWELMARK "),
  490.  0,0,0x0008, TEXT("SYMBOL "),  //   =
  491.  0,0,0x0010, TEXT("KATAKANA "),  //   katakana a
  492.  0,0,0x0020, TEXT("HIRAGANA "),  //   hiragana a
  493.  0,0,0x0040, TEXT("HALFWIDTH "),  //  han
  494.  0,0,0x0080, TEXT("FULLWIDTH "),  //  zen
  495.  0,0,0x0100, TEXT("IDEOGRAPH "),  //  kan
  496.  0,0,0x0200, TEXT("KASHIDA "),
  497.  0,0,0x0400, TEXT("LEXICAL "),
  498.  0,0,0x8000, TEXT("C3ALPHA ") //  alpha
  499. };
  500. BOOL CALLBACK PropDlgProc
  501.    ( HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam )
  502. {
  503. int i;
  504.     switch (message)
  505.     {
  506.        case WM_INITDIALOG:
  507.     for( i=0; i<sizeof vCtype/sizeof t_Ctype; i++)
  508. {
  509.     SendDlgItemMessage(hwndDlg, IDC_PROPLIST, LB_ADDSTRING, i, (LPARAM) vCtype[i].pszName);
  510. }
  511.             return TRUE;
  512.        case WM_COMMAND:
  513.             switch (wParam) //Command ID
  514.             {
  515.                case IDOK:
  516.     if( pCSet )
  517.     {
  518. delete pCSet;
  519. }
  520.     i = SendDlgItemMessage(hwndDlg, IDC_PROPLIST, LB_GETCARETINDEX, 0, 0);
  521.     pCSet = new CCTypeSet(vCtype[i].fVal[0],vCtype[i].fVal[1], vCtype[i].fVal[2]);
  522.                     EndDialog(hwndDlg, 0);
  523. return TRUE;
  524.                case IDCANCEL:
  525.     if( pCSet )
  526. {
  527. delete pCSet;
  528. }
  529.                     EndDialog(hwndDlg, 0);
  530.                     return TRUE;
  531.             }
  532.             break;
  533.     }
  534.     return FALSE ;
  535. }