|
|
1.1 ! root 1: //+-------------------------------------------------------- ! 2: // File: App.cxx ! 3: // ! 4: // Classes: CController ! 5: // ! 6: // Functions: WinMain ! 7: // WndProc ! 8: // MakeWindowClass ! 9: // AboutDlgProc ! 10: // ! 11: // History: 22-Jan-1993 asmusf created ! 12: //---------------------------------------------------------- ! 13: ! 14: #include <windows.h> ! 15: #include <windowsx.h> ! 16: #include "app.hxx" ! 17: //+-------------------------------------------------------- ! 18: // Class: CController ! 19: // ! 20: // Purpose: Controlling the application, UI handler ! 21: // ! 22: // History: 22-Jan-1993 asmusf created ! 23: //---------------------------------------------------------- ! 24: ! 25: void CController::Create(HWND hwnd, LONG lParam ) ! 26: { ! 27: HANDLE handle = ((LPCREATESTRUCT) lParam)->hInstance; ! 28: _hInst = (HINSTANCE)handle; ! 29: _funAbout = (DLGPROC) MakeProcInstance((FARPROC)AboutDlgProc, _hInst); ! 30: ! 31: // Set up the Main View ! 32: _pView = new CScrollableView(((LPCREATESTRUCT) lParam)->cx, ! 33: ((LPCREATESTRUCT) lParam)->cy); ! 34: _pView->SetScale(100); ! 35: ! 36: SetScrollRange(hwnd, SB_VERT, 0, PAGEHEIGHT, FALSE); ! 37: SetScrollRange(hwnd, SB_HORZ, 0, PAGEWIDTH, FALSE); ! 38: ! 39: SetScrollPos(hwnd, SB_HORZ, 0, TRUE ); ! 40: SetScrollPos(hwnd, SB_VERT, 0, TRUE ); ! 41: ! 42: // Set up the Model ! 43: _pModel= new CModel(_hInst, HEXADECIMAL); ! 44: ! 45: // Set up the initial state of the Menu ! 46: Page(hwnd, IDM_FIRSTPAGE); ! 47: ! 48: // initially no pop-up character box ! 49: _pBox = 0; ! 50: } ! 51: ! 52: void CController::Destroy() ! 53: { ! 54: ! 55: FreeProcInstance((FARPROC)AboutDlgProc); ! 56: ! 57: delete _pView; ! 58: delete _pModel; ! 59: PostQuitMessage(0); ! 60: } ! 61: ! 62: void CController::Size ( LONG lParam ) ! 63: { ! 64: _pView->SetSize ( LOWORD(lParam), HIWORD(lParam) ); ! 65: } ! 66: ! 67: // Message Box with text from resource file ! 68: void CController::AlertBox( HWND hwnd, UINT idsText, UINT fuStyle) ! 69: { ! 70: TCHAR szText[100]; ! 71: TCHAR szCaption[100]; ! 72: ! 73: LoadString(_hInst, idsText, (LPTSTR)szText, 100); ! 74: LoadString(_hInst, IDS_MSGCAPTION, (LPTSTR)szCaption, 100); ! 75: ! 76: ::MessageBox (hwnd, (LPTSTR)szText, (LPTSTR)szCaption, fuStyle) ; ! 77: }; ! 78: ! 79: // Menu commands processing ! 80: ! 81: void CController::Command ( HWND hwnd, WPARAM wID ) ! 82: { ! 83: switch ( wID ) ! 84: { ! 85: // File Menu ! 86: case IDM_PRINT: ! 87: { ! 88: CPrintRequest job(hwnd, 1, _pModel->GetMaxPage()); ! 89: ! 90: if(!job.Cancelled()) ! 91: { ! 92: CPrintCanvas canvas (job); ! 93: job.Print (_hInst, canvas, _pModel); ! 94: ! 95: if(job.Error()) ! 96: { ! 97: AlertBox (hwnd, IDS_PRINTERR, MB_OK | MB_ICONEXCLAMATION) ; ! 98: } ! 99: } ! 100: } ! 101: break; ! 102: case IDM_EXIT: ! 103: SendMessage ( hwnd, WM_CLOSE, 0L, 0L ); ! 104: break; ! 105: ! 106: // View Menu ! 107: case IDM_NEXTPAGE: ! 108: Page(hwnd, IDM_NEXTPAGE); ! 109: break; ! 110: case IDM_PREVPAGE: ! 111: Page(hwnd, IDM_PREVPAGE); ! 112: break; ! 113: case IDM_NEXTSECTION: ! 114: Page(hwnd, IDM_NEXTSECTION); ! 115: break; ! 116: case IDM_PREVSECTION: ! 117: Page(hwnd, IDM_PREVSECTION); ! 118: break; ! 119: case IDM_ZOOMIN: ! 120: { ! 121: UINT iScale; ! 122: _pView->GetScale(iScale); ! 123: iScale -= (iScale > 50 ? 25 : 0); ! 124: _pView->SetScale(iScale); ! 125: _pView->Invalidate(hwnd); ! 126: } ! 127: break; ! 128: case IDM_ZOOMOUT: ! 129: { ! 130: UINT iScale; ! 131: _pView->GetScale(iScale); ! 132: iScale += (iScale < 200 ? 25 : 0); ! 133: _pView->SetScale(iScale); ! 134: _pView->Invalidate(hwnd); ! 135: } ! 136: break; ! 137: ! 138: // Options Menu ! 139: case IDM_FONT: ! 140: _pModel->ChooseFont(hwnd); ! 141: _pView->Invalidate(hwnd); ! 142: break; ! 143: case IDM_DECIMAL: ! 144: { ! 145: UINT fuFormat; ! 146: _pModel->GetFormat(fuFormat); ! 147: fuFormat ^= DECIMAL; ! 148: CheckMenuItem (GetMenu(hwnd), IDM_DECIMAL, ! 149: fuFormat & DECIMAL ? MF_CHECKED : MF_UNCHECKED ) ; ! 150: _pModel->SetFormat(fuFormat); ! 151: } ! 152: _pView->Invalidate(hwnd); ! 153: break; ! 154: ! 155: // Help Menu ! 156: case IDM_HELP: ! 157: AlertBox ( hwnd, IDS_NOTIMPLEM, MB_ICONINFORMATION | MB_OK); ! 158: break; ! 159: case IDM_ABOUT: ! 160: DialogBox ( _hInst, TEXT("AboutBox"), hwnd, _funAbout ); ! 161: break; ! 162: } ! 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: ! 195: EnableMenuItem (hmenu, IDM_PREVPAGE, _pModel->CanPrevPage() ? ! 196: MF_ENABLED : MF_DISABLED | MF_GRAYED ) ; ! 197: EnableMenuItem (hmenu, IDM_NEXTPAGE, _pModel->CanNextPage() ? ! 198: MF_ENABLED : MF_DISABLED | MF_GRAYED ) ; ! 199: EnableMenuItem (hmenu, IDM_NEXTSECTION, _pModel->CanNextSection() ? ! 200: MF_ENABLED : MF_DISABLED | MF_GRAYED ) ; ! 201: EnableMenuItem (hmenu, IDM_PREVSECTION,_pModel->CanPrevSection() ? ! 202: MF_ENABLED : MF_DISABLED | MF_GRAYED ) ; ! 203: } ! 204: ! 205: void CController::ButtonDown(HWND hwnd, LONG lParam ) ! 206: { ! 207: static RECT rc; ! 208: SetCapture (hwnd); ! 209: ! 210: if( _pBox ) ! 211: { ! 212: delete _pBox; ! 213: _pBox = 0; ! 214: _pView->Invalidate(hwnd, &rc); ! 215: return; ! 216: } ! 217: ! 218: SIZE size = { 4*(INCH1-INCH8)/5, INCH1 /*-INCH8*/ }; ! 219: CBoxFormat bxf(size); ! 220: ! 221: CScreenCanvas canvas(hwnd); ! 222: ! 223: POINT pt = {LOWORD(lParam), HIWORD(lParam)}; ! 224: ! 225: UINT iChar = _pView->Hittest(canvas, pt, _pModel); ! 226: ! 227: if( iChar == 0xFFFF ) ! 228: { ! 229: return; ! 230: } ! 231: HFONT hfont = _pModel->GetFont(); ! 232: _pBox = new CBox(bxf, iChar, hfont); ! 233: ! 234: canvas.DPtoLP(&pt); ! 235: pt.x -= size.cx/2; ! 236: pt.y -= size.cy/2; ! 237: #ifdef UNICODE ! 238: pt.x -= size.cx; // accommodate wider popup ! 239: #endif ! 240: ! 241: GetClientRect(hwnd, &rc); ! 242: ! 243: _pBox->Paint(canvas, pt, rc); ! 244: size = _pBox->GetSize(); ! 245: ! 246: canvas.LPtoDP(&pt); ! 247: rc.left = pt.x; ! 248: rc.top = pt.y; ! 249: ! 250: canvas.DPtoLP(&pt); ! 251: pt.x+=size.cx; ! 252: pt.y+=size.cy; ! 253: ! 254: canvas.LPtoDP(&pt); ! 255: rc.right = pt.x; ! 256: rc.bottom = pt.y; ! 257: } ! 258: ! 259: void CController::ButtonUp(HWND hwnd, LONG lParam ) ! 260: { ! 261: ReleaseCapture(); ! 262: } ! 263: ! 264: void CController::KeyDown(HWND hwnd, WPARAM wParam, LPARAM lParam) ! 265: { ! 266: switch( wParam ) ! 267: { ! 268: case VK_PRIOR: ! 269: Page(hwnd, IDM_PREVPAGE); ! 270: break; ! 271: case VK_NEXT: ! 272: Page(hwnd, IDM_NEXTPAGE); ! 273: break; ! 274: case VK_HOME: ! 275: Page(hwnd, IDM_FIRSTPAGE); ! 276: break; ! 277: case VK_END: ! 278: Page(hwnd, IDM_LASTPAGE); ! 279: break; ! 280: case VK_UP: ! 281: _pView->SetVScrollPos(hwnd, SB_LINEUP, lParam, _pModel); ! 282: break; ! 283: case VK_DOWN: ! 284: _pView->SetVScrollPos(hwnd, SB_LINEDOWN, lParam, _pModel); ! 285: break; ! 286: case VK_LEFT: ! 287: _pView->SetHScrollPos(hwnd, SB_LINEUP, lParam, _pModel); ! 288: break; ! 289: case VK_RIGHT: ! 290: _pView->SetHScrollPos(hwnd, SB_LINEDOWN, lParam, _pModel); ! 291: break; ! 292: } ! 293: } ! 294: ! 295: void CController::KeyUp(HWND hwnd, WPARAM wParam, LPARAM lParam) ! 296: { ! 297: } ! 298: ! 299: void CController::HScroll(HWND hwnd, WPARAM wParam, LPARAM lParam) ! 300: { ! 301: _pView->SetHScrollPos(hwnd, wParam, lParam, _pModel); ! 302: } ! 303: ! 304: void CController::VScroll(HWND hwnd, WPARAM wParam, LPARAM lParam) ! 305: { ! 306: _pView->SetVScrollPos(hwnd, wParam, lParam, _pModel); ! 307: } ! 308: ! 309: // Main application ! 310: ! 311: // NOTE: for October Beta needed to declare WinMain with HANDLE instead ! 312: // of HINSTANCE, which requires the two casts further down ! 313: // (compiler internally faults otherwise) ! 314: ! 315: ! 316: // WinMain - Main window funtion ! 317: // ! 318: int PASCAL WinMain ! 319: ( HANDLE hInst, HANDLE hPrevInst, LPSTR cmdParam, int cmdShow ) ! 320: { ! 321: TCHAR szAppName [] = TEXT("Grid") ; ! 322: TCHAR szCaption [] = TEXT("Character Grid") ; ! 323: ! 324: // Create Window Class ! 325: ! 326: if ( hPrevInst == 0 ) ! 327: { ! 328: MakeWindowClass ( WndProc, szAppName, (HINSTANCE) hInst ); ! 329: } ! 330: ! 331: // Create Window ! 332: ! 333: CWindow win ( szCaption, szAppName, (HINSTANCE) hInst ); ! 334: ! 335: win.Show ( cmdShow ); ! 336: ! 337: MSG msg; ! 338: ! 339: while ( GetMessage (&msg, NULL, 0, 0 ) ) ! 340: { ! 341: TranslateMessage ( &msg ); ! 342: DispatchMessage ( &msg ); ! 343: } ! 344: ! 345: return msg.wParam; ! 346: } ! 347: ! 348: // Make Window Class ! 349: // ! 350: void MakeWindowClass ( WNDPROC WndProc, LPTSTR szAppName, HINSTANCE hInst ) ! 351: { ! 352: WNDCLASS cl; ! 353: ! 354: cl.style = CS_HREDRAW | CS_VREDRAW; ! 355: cl.lpfnWndProc = WndProc; ! 356: cl.cbClsExtra = 0; ! 357: cl.cbWndExtra = 0; ! 358: cl.hInstance = hInst; ! 359: cl.hIcon = LoadIcon ( hInst, szAppName ); ! 360: cl.hCursor = LoadCursor ( NULL, IDC_ARROW ); ! 361: cl.hbrBackground = GetStockBrush ( WHITE_BRUSH ); ! 362: cl.lpszMenuName = szAppName; ! 363: cl.lpszClassName = szAppName; ! 364: ! 365: RegisterClass (&cl); ! 366: } ! 367: ! 368: // Window Proc ! 369: // ! 370: ! 371: LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) ! 372: { ! 373: static CController ctrl; ! 374: ! 375: switch (message) ! 376: { ! 377: case WM_CREATE: ! 378: ctrl.Create(hwnd, lParam); ! 379: return 0; ! 380: case WM_SIZE: ! 381: ctrl.Size(lParam); ! 382: return 0; ! 383: case WM_PAINT: ! 384: ctrl.Paint(hwnd); ! 385: return 0; ! 386: case WM_COMMAND: ! 387: ctrl.Command(hwnd, wParam); ! 388: return 0; ! 389: case WM_LBUTTONUP: ! 390: ctrl.ButtonUp(hwnd, lParam); ! 391: return 0; ! 392: case WM_LBUTTONDOWN: ! 393: ctrl.ButtonDown(hwnd, lParam); ! 394: return 0; ! 395: case WM_KEYUP: ! 396: ctrl.KeyUp(hwnd, wParam, lParam); ! 397: return 0; ! 398: case WM_KEYDOWN: ! 399: ctrl.KeyDown(hwnd, wParam, lParam); ! 400: return 0; ! 401: case WM_VSCROLL: ! 402: ctrl.VScroll(hwnd, wParam, lParam ); ! 403: return 0; ! 404: case WM_HSCROLL: ! 405: ctrl.HScroll(hwnd, wParam, lParam ); ! 406: return 0; ! 407: case WM_DESTROY: ! 408: ctrl.Destroy(); ! 409: return 0; ! 410: ! 411: } ! 412: return DefWindowProc (hwnd, message, wParam, lParam ); ! 413: } ! 414: ! 415: // "About" dialog box procedure ! 416: // Process messages from dialog box ! 417: // ! 418: ! 419: BOOL CALLBACK AboutDlgProc ! 420: ( HWND hwnd, UINT message, WPARAM wParam, LONG lParam ) ! 421: { ! 422: ! 423: switch(message) ! 424: { ! 425: case WM_INITDIALOG: ! 426: return TRUE; ! 427: case WM_COMMAND: ! 428: switch (wParam) //Command ID ! 429: { ! 430: case IDOK: ! 431: case IDCANCEL: ! 432: EndDialog(hwnd, 0); ! 433: return TRUE; ! 434: } ! 435: break; ! 436: } ! 437: return FALSE; ! 438: } ! 439: ! 440: extern CPrintAux PrGlobal; ! 441: ! 442: //======== PrintDlgProc =========================================== ! 443: ! 444: BOOL CALLBACK PrintDlgProc ! 445: ( HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam ) ! 446: { ! 447: switch (message) ! 448: { ! 449: case WM_INITDIALOG: ! 450: SetWindowText (hwndDlg, (TCHAR *)lParam) ; ! 451: EnableMenuItem (GetSystemMenu (hwndDlg, FALSE), SC_CLOSE, MF_GRAYED) ; ! 452: return TRUE ; ! 453: ! 454: case WM_COMMAND: ! 455: PrGlobal._bUserAbort = TRUE ; ! 456: EnableWindow (GetParent (hwndDlg), TRUE) ; ! 457: DestroyWindow (hwndDlg) ; ! 458: PrGlobal._hDlgPrint = 0 ; ! 459: return TRUE ; ! 460: } ! 461: return FALSE ; ! 462: } ! 463: ! 464: //======== AbortProc =========================================== ! 465: ! 466: BOOL CALLBACK AbortProc(HDC hdcPrn, short nCode) ! 467: { ! 468: MSG msg ; ! 469: ! 470: while (!PrGlobal._bUserAbort && PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) ! 471: { ! 472: if (!PrGlobal._hDlgPrint ! 473: || ! 474: !IsDialogMessage (PrGlobal._hDlgPrint, &msg)) ! 475: { ! 476: TranslateMessage (&msg) ; ! 477: DispatchMessage (&msg) ; ! 478: } ! 479: } ! 480: return !PrGlobal._bUserAbort ; ! 481: } ! 482: ! 483:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.