|
|
1.1 ! root 1: /****************************************************************************\ ! 2: * ! 3: * MODULE: anicmd.c ! 4: * ! 5: * PURPOSE: Processes WM_COMMANDs for the Animated Cursor Editor ! 6: * ! 7: * Copyright 1993, Microsoft Corp. ! 8: * ! 9: * ! 10: * History: ! 11: * 21-Apr-1993 JonPa Wrote it. ! 12: * ! 13: \****************************************************************************/ ! 14: ! 15: #include <windows.h> ! 16: #include <commdlg.h> ! 17: #include <search.h> ! 18: #include "anidefs.h" ! 19: ! 20: static DWORD WINAPI ProcWaitThread( LPVOID lpv ); ! 21: static BOOL CALLBACK ETWProc( HWND hwnd, LPARAM lParam ); ! 22: ! 23: BOOL gfEditFrame = FALSE; ! 24: TCHAR gszTempFile[MAX_PATH]; ! 25: ! 26: /****************************************************************************\ ! 27: * ! 28: * FUNCTION: DoCommand(HWND, unsigned, WORD, LONG) ! 29: * ! 30: * PURPOSE: Processes commands for the main dialog box ! 31: * ! 32: * MESSAGES: ! 33: * ! 34: * WM_INITDIALOG - initialize dialog box ! 35: * WM_COMMAND - Input received ! 36: * ! 37: * COMMENTS: ! 38: * ! 39: * ! 40: * History: ! 41: * 21-Apr-1993 JonPa Created it ! 42: * ! 43: \****************************************************************************/ ! 44: BOOL DoCommand( HWND hWnd, UINT wParam, LONG lParam ) ! 45: { ! 46: int cmd = LOWORD(wParam); ! 47: ! 48: switch(cmd){ ! 49: ! 50: ! 51: case MENU_FILE_NEW: ! 52: case DLG_MAIN_BTNNEW: ! 53: /* If dirty, then prompt for save */ ! 54: if(!CheckDirty(hWnd)) ! 55: break; ! 56: ! 57: /* free used memory and init structures and dlg */ ! 58: NewAniCursor(hWnd); ! 59: ResumePreview(hWnd, DLG_MAIN_PREVIEW); ! 60: break; ! 61: ! 62: case DLG_MAIN_BTNOPEN: ! 63: case MENU_FILE_OPEN: { ! 64: HANDLE hfCursor; ! 65: TCHAR szFileTitle[MAX_PATH]; ! 66: TCHAR szFile[MAX_PATH]; ! 67: ! 68: ! 69: szFile[0] = TEXT('\0'); ! 70: ! 71: /* check for dirty file */ ! 72: if(!CheckDirty(hWnd)) ! 73: break; ! 74: ! 75: /* Put up the open file dialog and get the open handle back */ ! 76: hfCursor = PromptAndOpenFile(hWnd, MAX_PATH, szFileTitle, ! 77: COUNTOF(ganiAcon.szFile), szFile, gpszAniFilter); ! 78: ! 79: if (hfCursor == INVALID_HANDLE_VALUE) ! 80: break; ! 81: ! 82: /* delete any existing ani file */ ! 83: NewAniCursor( hWnd ); ! 84: ! 85: /* read in the file */ ! 86: if (!ReadAniFile( hWnd, hfCursor )) { ! 87: FmtMessageBox( hWnd, TITL_ERROR, NULL, MB_OK | MB_ICONSTOP, TRUE, ! 88: MSG_INVALIDCURSORFILE, szFileTitle ); ! 89: } else { ! 90: /* ! 91: * Put the filename in the title. ! 92: */ ! 93: lstrcpy(ganiAcon.szFile, szFile); ! 94: SetWindowFileTitle(hWnd, szFileTitle); ! 95: SetDlgItemInt( hWnd, DLG_MAIN_RATE, ganiAcon.anih.jifRate, FALSE); ! 96: } ! 97: ! 98: ResumePreview(hWnd, DLG_MAIN_PREVIEW); ! 99: break; ! 100: } ! 101: ! 102: case DLG_MAIN_BTNSAVE: ! 103: case MENU_FILE_SAVE: ! 104: case MENU_FILE_SAVEAS: ! 105: SaveFile(hWnd, cmd == MENU_FILE_SAVEAS); ! 106: break; ! 107: ! 108: case MENU_FILE_INSERT: { ! 109: TCHAR szFile[MAX_PATH]; ! 110: ! 111: szFile[0] = TEXT('\0'); ! 112: ! 113: /* Put up the open file dialog and get the open handle back */ ! 114: if (PromptForFile(hWnd, 0, NULL, ! 115: MAX_PATH, szFile, gpszCurFilter, gpszImport, FALSE)) { ! 116: ! 117: /* ! 118: * If we got a file, open it and read the icon data, linking ! 119: * it into the frame list and maintaining the steps as well. ! 120: */ ! 121: ganiAcon.fDirty = TRUE; ! 122: CreateFrameFromCursorFile(hWnd, szFile, FALSE); ! 123: } ! 124: break; ! 125: } ! 126: ! 127: case MENU_FILE_EXPORT: { ! 128: #if 0 ! 129: TCHAR szFile[MAX_PATH]; ! 130: szFile[0] = TEXT('\0'); ! 131: ! 132: /* Put up the open file dialog and get the open handle back */ ! 133: if (PromptForFile(hWnd, 0, NULL, ! 134: MAX_PATH, szFile, NULL, gpszExport, TRUE)) { ! 135: ! 136: /* ! 137: * If we got a file, open it and read the icon data, linking ! 138: * it into the frame list and maintaining the steps as well. ! 139: */ ! 140: ???? ! 141: } ! 142: #else ! 143: WRITEME(hWnd); ! 144: #endif ! 145: break; ! 146: } ! 147: ! 148: case MENU_FILE_EXIT: ! 149: ExitCommand(hWnd); ! 150: break; ! 151: ! 152: case DLG_MAIN_BTNCUT: ! 153: case MENU_EDIT_CUT: ! 154: ganiAcon.fDirty = TRUE; ! 155: ! 156: FALLTHRU(MENU_EDIT_COPY); ! 157: ! 158: case DLG_MAIN_BTNCOPY: ! 159: case MENU_EDIT_COPY: { ! 160: int *piSel; ! 161: int cSel; ! 162: ! 163: cSel = GetSelStepCount(hWnd); ! 164: ! 165: if( cSel > 0 && (piSel = AllocMem(cSel * sizeof(int))) != NULL) { ! 166: PCLPBRDDAT pcbd, pcbdNext, *ppcbd; ! 167: ! 168: int i; ! 169: ! 170: GetCurrentSel(hWnd, DLG_MAIN_FRAMELIST, piSel, cSel, &cSel); ! 171: ! 172: /* Clear clipboard */ ! 173: for( pcbd = gpbdClipBoard; pcbd != NULL; pcbd = pcbdNext ) { ! 174: pcbdNext = pcbd->pcbdNext; ! 175: ! 176: DestroyClpBrdDat(pcbd); ! 177: } ! 178: ! 179: /* ! 180: * Get the steps and put them in the clipboard in the correct order ! 181: */ ! 182: ppcbd = &gpbdClipBoard; ! 183: ! 184: for( i = 0; i < cSel; i++ ) { ! 185: PSTEP ps; ! 186: ! 187: ps = GetStep(hWnd, piSel[i]); ! 188: ! 189: if( IsValidPS(ps) && (pcbd = NewClpBrdDat()) != NULL) { ! 190: CopyStep(&(pcbd->stp), ps); ! 191: *ppcbd = pcbd; ! 192: ppcbd = &(pcbd->pcbdNext); ! 193: } ! 194: } ! 195: ! 196: *ppcbd = NULL; ! 197: ! 198: /* ! 199: * If this is a cut, then yank them out of the listbox ! 200: */ ! 201: if (cmd == MENU_EDIT_CUT || cmd == DLG_MAIN_BTNCUT) { ! 202: qsort( piSel, cSel, sizeof(piSel[0]), RevCompInts ); ! 203: for( i = 0; i < cSel; i++ ) { ! 204: SendDlgItemMessage(hWnd, DLG_MAIN_FRAMELIST, ! 205: LB_DELETESTRING, piSel[i], 0); ! 206: } ! 207: ! 208: FreeMem(piSel); ! 209: ! 210: ClearStepSel(hWnd); ! 211: } ! 212: } ! 213: ! 214: break; ! 215: } ! 216: ! 217: case DLG_MAIN_BTNPASTE: ! 218: case MENU_EDIT_PASTE: { ! 219: PCLPBRDDAT pcbd; ! 220: int iSel, cSel; ! 221: ! 222: cSel = GetSelStepCount(hWnd); ! 223: ! 224: if (cSel > 1) { ! 225: FmtMessageBox( hWnd, TITL_ERROR, NULL, MB_OK | MB_ICONSTOP, ! 226: TRUE, MSG_LESSEQONEFRAME); ! 227: break; ! 228: } ! 229: ! 230: GetCurrentSel(hWnd, DLG_MAIN_FRAMELIST, &iSel, 1, &cSel); ! 231: ! 232: if (cSel == 0) ! 233: iSel = GetStepCount(hWnd) - 1; ! 234: ! 235: cSel = iSel; ! 236: ganiAcon.fDirty = TRUE; ! 237: ! 238: for( pcbd = gpbdClipBoard; pcbd != NULL; pcbd = pcbd->pcbdNext ) { ! 239: PSTEP ps = NewStep(); ! 240: ! 241: if (IsValidPS(ps)) { ! 242: CopyStep(ps, &(pcbd->stp)); ! 243: ! 244: SendDlgItemMessage(hWnd, DLG_MAIN_FRAMELIST, LB_INSERTSTRING, ! 245: ++cSel, (LPARAM)ps); ! 246: } else { ! 247: FmtMessageBox( hWnd, TITL_ERROR, NULL, MB_OKCANCEL | ! 248: MB_ICONEXCLAMATION, TRUE, MSG_PASTEERR ); ! 249: } ! 250: } ! 251: ! 252: /* in this case, cSel is actually an index */ ! 253: iSel += 1; ! 254: ClearStepSel(hWnd); ! 255: SetStepSel(hWnd, iSel, cSel); ! 256: ! 257: break; ! 258: } ! 259: ! 260: case DLG_MAIN_DELFRAME: ! 261: case MENU_EDIT_CLEAR: { ! 262: int *piSel; ! 263: int cSteps = GetSelStepCount(hWnd); ! 264: int i; ! 265: ! 266: if (cSteps <= 0) ! 267: //BUGBUG - should we put a message box up here? ! 268: break; ! 269: ! 270: ganiAcon.fDirty = TRUE; ! 271: ! 272: piSel = AllocMem(cSteps * sizeof(int)); ! 273: if (piSel == NULL) ! 274: break; ! 275: ! 276: GetCurrentSel(hWnd, DLG_MAIN_FRAMELIST, piSel, cSteps, &cSteps); ! 277: ! 278: qsort( piSel, cSteps, sizeof(piSel[0]), RevCompInts ); ! 279: for( i = 0; i < cSteps; i++ ) { ! 280: SendDlgItemMessage(hWnd, DLG_MAIN_FRAMELIST, LB_DELETESTRING, ! 281: piSel[i], 0); ! 282: } ! 283: ! 284: FreeMem(piSel); ! 285: ClearStepSel(hWnd); ! 286: ! 287: break; ! 288: } ! 289: ! 290: case DLG_MAIN_DUPFRAME: ! 291: case MENU_EDIT_DUP: ! 292: /* copy */ ! 293: /* paste */ ! 294: ganiAcon.fDirty = TRUE; ! 295: WRITEME(hWnd); ! 296: break; ! 297: ! 298: case DLG_MAIN_EDITFRAME: ! 299: case MENU_EDIT_EDITFRAME: ! 300: case DLG_MAIN_ADDFRAME: ! 301: case MENU_EDIT_ADDFRAME: { ! 302: BOOL fEditFrame; ! 303: ! 304: ganiAcon.fDirty = TRUE; ! 305: ! 306: fEditFrame = (cmd == MENU_EDIT_EDITFRAME || ! 307: cmd == DLG_MAIN_EDITFRAME); ! 308: ! 309: ! 310: EditFrame(hWnd, fEditFrame); ! 311: ! 312: break; ! 313: } ! 314: ! 315: case DLG_MAIN_STOP: ! 316: PausePreview(hWnd, DLG_MAIN_PREVIEW); ! 317: break; ! 318: ! 319: case DLG_MAIN_PLAY: ! 320: ResumePreview(hWnd, DLG_MAIN_PREVIEW); ! 321: break; ! 322: ! 323: case MENU_HELP_ABOUT: ! 324: DialogBox(hInst, MAKEINTRESOURCE(DLG_ABOUT), hWnd, About); ! 325: break; ! 326: ! 327: case MENU_EDIT_OPTIONS: ! 328: if (DialogBox(hInst, MAKEINTRESOURCE(DLG_OPTIONS), hWnd, OptionsProc)){ ! 329: InvalidateRect( GetDlgItem(hWnd, DLG_MAIN_PREVIEW), NULL, TRUE); ! 330: } ! 331: break; ! 332: ! 333: case DLG_MAIN_FRAMELIST: { ! 334: HWND hwndLB = (HWND)lParam; ! 335: ! 336: switch(HIWORD(wParam)) { ! 337: ! 338: case LBN_SELCHANGE: { ! 339: PSTEP ps; ! 340: int cSel; ! 341: LPTSTR pszText; ! 342: ! 343: cSel = SendMessage(hwndLB, LB_GETSELCOUNT, 0, 0); ! 344: ! 345: if (cSel > 1) { ! 346: int *piSel; ! 347: int i; ! 348: ! 349: pszText = FmtSprintf( cSel == GetStepCount(hWnd) ? ! 350: MSG_ALLFRAMES : MSG_FRAMESSELECTED, cSel ); ! 351: SetDlgItemText(hWnd, DLG_MAIN_FRAMEGRP, pszText); ! 352: FmtFree( pszText ); ! 353: ! 354: piSel = AllocMem( cSel * sizeof(int) ); ! 355: if( piSel == NULL ) ! 356: break; ! 357: ! 358: GetCurrentSel(hWnd, DLG_MAIN_FRAMELIST, piSel, cSel, &cSel); ! 359: for( i = 0; i < cSel; i++ ) { ! 360: ps = GetStep(hWnd, piSel[i]); ! 361: ! 362: if( IsValidPS(ps) ) { ! 363: if (i == 0) { ! 364: ganiAcon.anih.jifRate = ps->jif; ! 365: } else if(ganiAcon.anih.jifRate != ps->jif) { ! 366: break; ! 367: } ! 368: } ! 369: } ! 370: ! 371: if (i < cSel) { ! 372: /* rates differ, wipe out jiffy edit control */ ! 373: SetDlgItemText(hWnd, DLG_MAIN_RATE, ""); ! 374: } else { ! 375: SetDlgItemInt(hWnd, DLG_MAIN_RATE, ! 376: ganiAcon.anih.jifRate, FALSE); ! 377: } ! 378: ! 379: FreeMem(piSel); ! 380: ! 381: } else if (cSel == 1) { ! 382: int iLBSel; ! 383: ! 384: GetCurrentSel(hWnd, DLG_MAIN_FRAMELIST, &iLBSel, 1, &cSel); ! 385: ! 386: SetPreviewStep(hWnd, DLG_MAIN_PREVIEW, iLBSel); ! 387: ! 388: pszText = FmtSprintf( MSG_FRAMEOFSEL, iLBSel + 1, ! 389: GetStepCount(hWnd) ); ! 390: SetDlgItemText(hWnd, DLG_MAIN_FRAMEGRP, pszText); ! 391: FmtFree( pszText ); ! 392: ! 393: ps = (PSTEP)SendMessage(hwndLB, LB_GETITEMDATA, iLBSel, 0); ! 394: ! 395: if (IsValidPS(ps)) { ! 396: SetDlgItemInt( hWnd, DLG_MAIN_RATE, ps->jif, FALSE); ! 397: } ! 398: } else { ! 399: pszText = FmtSprintf( MSG_NOFRAMESSEL ); ! 400: SetDlgItemText(hWnd, DLG_MAIN_FRAMEGRP, pszText); ! 401: FmtFree( pszText ); ! 402: SetPreviewStep(hWnd, DLG_MAIN_PREVIEW, 0); ! 403: } ! 404: break; ! 405: ! 406: case LBN_DBLCLK: ! 407: ganiAcon.fDirty = TRUE; ! 408: EditFrame(hWnd, TRUE); ! 409: break; ! 410: } ! 411: } ! 412: break; ! 413: ! 414: } ! 415: ! 416: case DLG_MAIN_RATE: { ! 417: static BOOL fEditCtlHasFocus = FALSE; ! 418: static BOOL fEditCtlHasChanged = FALSE; ! 419: int *piSel; ! 420: int cSteps; ! 421: int i; ! 422: ! 423: switch(HIWORD(wParam)) { ! 424: case EN_SETFOCUS: ! 425: fEditCtlHasFocus = TRUE; ! 426: break; ! 427: ! 428: case EN_KILLFOCUS: ! 429: fEditCtlHasFocus = FALSE; ! 430: break; ! 431: ! 432: case EN_CHANGE: ! 433: ! 434: cSteps = GetSelStepCount(hWnd); ! 435: ! 436: if (fEditCtlHasFocus && cSteps >=1 && ! 437: GetWindowTextLength(GetDlgItem(hWnd, DLG_MAIN_RATE)) > 0) { ! 438: JIF jif; ! 439: BOOL fOK; ! 440: ! 441: ganiAcon.fDirty = TRUE; ! 442: piSel = AllocMem( cSteps * sizeof(int) ); ! 443: if (piSel == NULL) { ! 444: SetFocus((HWND)lParam); ! 445: break; ! 446: } ! 447: ! 448: ! 449: jif = GetDlgItemInt(hWnd, DLG_MAIN_RATE, &fOK, FALSE); ! 450: ! 451: if (jif == 0 || !fOK) { ! 452: FmtMessageBox(hWnd, MSG_LITERAL, gszWindowTitle, ! 453: MB_OK | MB_ICONEXCLAMATION, TRUE, ! 454: MSG_RATERANGE); ! 455: SetFocus((HWND)lParam); ! 456: break; ! 457: } ! 458: ! 459: GetCurrentSel(hWnd, DLG_MAIN_FRAMELIST, piSel, cSteps, ! 460: &cSteps); ! 461: ! 462: for( i = 0; i < cSteps; i++ ) { ! 463: PSTEP ps = GetStep(hWnd, piSel[i]); ! 464: ! 465: if (IsValidPS(ps)) { ! 466: ps->jif = jif; ! 467: } ! 468: } ! 469: InvalidateRect(GetDlgItem(hWnd,DLG_MAIN_FRAMELIST), NULL,TRUE); ! 470: ! 471: FreeMem( piSel ); ! 472: } ! 473: break; ! 474: } ! 475: break; ! 476: } ! 477: ! 478: default: ! 479: return FALSE; ! 480: } ! 481: ! 482: return TRUE; ! 483: } ! 484: ! 485: /****************************************************************************\ ! 486: * ! 487: * FUNCTION: About(HWND, unsigned, WORD, LONG) ! 488: * ! 489: * PURPOSE: Processes messages for "About" dialog box ! 490: * ! 491: * MESSAGES: ! 492: * ! 493: * WM_INITDIALOG - initialize dialog box ! 494: * WM_COMMAND - Input received ! 495: * ! 496: * COMMENTS: ! 497: * ! 498: * No initialization is needed for this particular dialog box, but TRUE ! 499: * must be returned to Windows. ! 500: * ! 501: * Wait for user to click on "Ok" button, then close the dialog box. ! 502: * ! 503: \****************************************************************************/ ! 504: ! 505: BOOL APIENTRY About( ! 506: HWND hDlg, /* window handle of the dialog box */ ! 507: UINT message, /* type of message */ ! 508: UINT wParam, /* message-specific information */ ! 509: LONG lParam) ! 510: { ! 511: switch (message) { ! 512: case WM_INITDIALOG: /* message: initialize dialog box */ ! 513: return (TRUE); ! 514: ! 515: case WM_COMMAND: /* message: received a command */ ! 516: if (LOWORD(wParam) == IDOK /* "OK" box selected? */ ! 517: || LOWORD(wParam) == IDCANCEL) { /*System menu close command?*/ ! 518: EndDialog(hDlg, TRUE); /* Exits the dialog box */ ! 519: return (TRUE); ! 520: } ! 521: break; ! 522: } ! 523: return (FALSE); /* Didn't process a message */ ! 524: UNREFERENCED_PARAMETER(lParam); ! 525: } ! 526: ! 527: ! 528: /****************************************************************************\ ! 529: * ! 530: * FUNCTION: OptionsProc(HWND, unsigned, WORD, LONG) ! 531: * ! 532: * PURPOSE: Processes messages for "Options" dialog box ! 533: * ! 534: * MESSAGES: ! 535: * ! 536: * WM_INITDIALOG - initialize dialog box ! 537: * WM_COMMAND - Input received ! 538: * ! 539: \****************************************************************************/ ! 540: ! 541: BOOL APIENTRY OptionsProc( ! 542: HWND hDlg, /* window handle of the dialog box */ ! 543: UINT message, /* type of message */ ! 544: UINT wParam, /* message-specific information */ ! 545: LONG lParam) ! 546: { ! 547: int i; ! 548: int fRepaint = FALSE; ! 549: ! 550: switch (message) { ! 551: case WM_INITDIALOG: /* message: initialize dialog box */ ! 552: SendDlgItemMessage(hDlg, DLG_OPTIONS_EDITOR, EM_LIMITTEXT, MAX_PATH, 0); ! 553: SetDlgItemText(hDlg, DLG_OPTIONS_EDITOR, gszCursorEditor); ! 554: CheckRadioButton( hDlg, ! 555: DLG_OPTIONS_RADIO_DESKCOL, ! 556: DLG_OPTIONS_RADIO_WINCOL, ! 557: garadColor[giradColor].id ); ! 558: return (TRUE); ! 559: ! 560: case WM_COMMAND: /* message: received a command */ ! 561: switch(LOWORD(wParam)) { ! 562: case IDOK: ! 563: ! 564: /* ! 565: * Get the new desk color ! 566: */ ! 567: for( i = 0; garadColor[i].id != 0; i++ ) { ! 568: if( IsDlgButtonChecked(hDlg, garadColor[i].id) ) { ! 569: break; ! 570: } ! 571: } ! 572: ! 573: if (i != giradColor ) { ! 574: /* new color, make new brush and repaint */ ! 575: if (ghbrPrevBackgnd != NULL) ! 576: DeleteObject(ghbrPrevBackgnd); ! 577: ! 578: ghbrPrevBackgnd = ! 579: CreateSolidBrush(GetSysColor(garadColor[i].idSys)); ! 580: giradColor = i; ! 581: fRepaint = TRUE; ! 582: } ! 583: ! 584: /* ! 585: * Get new editor ! 586: */ ! 587: GetDlgItemText(hDlg,DLG_OPTIONS_EDITOR, ! 588: gszCursorEditor,COUNTOF(gszCursorEditor)); ! 589: ! 590: for( i = 0; i < COUNTOF(gszCursorEditor); i++ ) { ! 591: ! 592: if (gszCursorEditor[i] == TEXT('\0')) ! 593: break; ! 594: ! 595: if (gszCursorEditor[i] == TEXT('%') && ! 596: ++i < COUNTOF(gszCursorEditor) && ! 597: gszCursorEditor[i] == TEXT('1')) { ! 598: break; ! 599: } ! 600: } ! 601: ! 602: ! 603: if (i >= COUNTOF(gszCursorEditor) || ! 604: gszCursorEditor[i] != TEXT('1')) { ! 605: ! 606: if (i >= (COUNTOF(gszCursorEditor) - 4)) { ! 607: i = COUNTOF(gszCursorEditor) - 4; ! 608: } ! 609: ! 610: lstrcpy(&gszCursorEditor[i], TEXT(" %1")); ! 611: } ! 612: ! 613: case IDCANCEL: ! 614: EndDialog(hDlg, fRepaint); /* Exits the dialog box */ ! 615: return (TRUE); ! 616: ! 617: default: ! 618: break; ! 619: } ! 620: break; ! 621: } ! 622: return (FALSE); /* Didn't process a message */ ! 623: UNREFERENCED_PARAMETER(lParam); ! 624: } ! 625: ! 626: ! 627: /****************************************************************************\ ! 628: * ! 629: * FUNCTION: ExitCommand(HWND) ! 630: * ! 631: * PURPOSE: Exit the program chekcing for dirty files etc. ! 632: * ! 633: * ! 634: \****************************************************************************/ ! 635: VOID ExitCommand(HWND hWnd) { ! 636: ! 637: /* if file is dirty then prompt for save */ ! 638: if(CheckDirty(hWnd)) ! 639: EndDialog(hWnd, TRUE); ! 640: } ! 641: ! 642: /****************************************************************************\ ! 643: * ! 644: * FUNCTION: CheckDirty(HWND) ! 645: * ! 646: * PURPOSE: check for dirty files and return TRUE if it is OK to continue. ! 647: * ! 648: * ! 649: \****************************************************************************/ ! 650: BOOL CheckDirty(HWND hWnd) { ! 651: int idRet; ! 652: ! 653: /* if file is dirty then prompt for save */ ! 654: if (ganiAcon.fDirty) { ! 655: idRet = FmtMessageBox( hWnd, MSG_LITERAL, gszWindowTitle, ! 656: MB_YESNOCANCEL | MB_ICONEXCLAMATION, TRUE, MSG_SAVEFILEQUEST, ! 657: ganiAcon.szFile); ! 658: ! 659: switch( idRet ) { ! 660: case IDYES: ! 661: SaveFile(hWnd, FALSE); ! 662: break; ! 663: ! 664: case IDNO: ! 665: break; ! 666: ! 667: case IDCANCEL: ! 668: return FALSE; ! 669: } ! 670: } ! 671: ! 672: return TRUE; ! 673: } ! 674: ! 675: ! 676: /****************************************************************************\ ! 677: * ! 678: * FUNCTION: HWND ExecProgram( HWND hwndCaller, LPTSTR pszCmdLine ) ! 679: * ! 680: * PURPOSE: Creates a process and returns the new processes main window ! 681: * ! 682: * RETURNS: NULL if the process could not be created, otherwise the ! 683: * processes main window handle. ! 684: * ! 685: * SIDEEFFECT: This function will also start a thread that will block ! 686: * on the process handle until the process terminates. At that ! 687: * time, the thread will post a message back to the calliers ! 688: * window. ! 689: * ! 690: * ! 691: * History: ! 692: * 22-Apr-1993 JonPa Created it ! 693: * ! 694: \****************************************************************************/ ! 695: BOOL ExecProgram( HWND hwndCaller, LPTSTR pszCmdLine ) { ! 696: STARTUPINFO si; ! 697: PROCESS_INFORMATION pi; ! 698: HWND hwnd; ! 699: PTHDDATA pthd; ! 700: DWORD tid; ! 701: HANDLE hthrd; ! 702: ! 703: /* ! 704: * Create the monitor thread (suspened) ! 705: */ ! 706: pthd = AllocMem(sizeof(THDDATA)); ! 707: ! 708: if (pthd == NULL) ! 709: return FALSE; ! 710: ! 711: /* set thread data to be invalid incase we have to abort */ ! 712: pthd->hprocMonitor = NULL; ! 713: pthd->hwndCaller = hwndCaller; ! 714: ! 715: if ((hthrd = CreateThread( NULL, 0, ProcWaitThread, pthd, CREATE_SUSPENDED, ! 716: &tid )) == NULL) { ! 717: /* could not create the monitor thread, return error */ ! 718: FreeMem(pthd); ! 719: return FALSE; ! 720: } ! 721: ! 722: /* ! 723: * Create the process ! 724: */ ! 725: ZeroMemory( &si, sizeof(si) ); ! 726: si.cb = sizeof(si); ! 727: si.wShowWindow = SW_SHOW; ! 728: si.dwFlags = STARTF_USESHOWWINDOW; ! 729: ! 730: if (!CreateProcess( NULL, pszCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, ! 731: &si, &pi)) { ! 732: ResumeThread(hthrd); // make thread localfree the data and exit ! 733: return FALSE; ! 734: } ! 735: ! 736: DPRINT(("MT:Child IDs proc/thd: 0x%lx / 0x%lx\n", pi.dwProcessId, pi.dwThreadId)); ! 737: DPRINT(("MT:Child Hnd proc/thd: 0x%lx / 0x%lx\n", pi.hProcess, pi.hThread)); ! 738: ! 739: /* ! 740: * Wait for the main window to be created ! 741: */ ! 742: if( WaitForInputIdle( pi.hProcess, CMS_WAIT_FOR_PROCESS ) != 0 ) { ! 743: ResumeThread(hthrd); // make thread localfree the data and exit ! 744: return FALSE; ! 745: } ! 746: ! 747: DPRINT(("MT:Child is idle\n")); ! 748: ! 749: /* ! 750: * Enumerate the new processes main thread's windows and ! 751: * return the main one. ! 752: */ ! 753: hwnd = NULL; ! 754: EnumThreadWindows( pi.dwThreadId, ETWProc, (LPARAM)&hwnd ); ! 755: ! 756: #if 0 ! 757: if (hwnd != NULL) { ! 758: pthd->hprocMonitor = pi.hProcess; ! 759: pthd->hwndMonitor = hwnd; ! 760: ! 761: SendMessage(hwndCaller, AIM_SETCHILDAPP, 0, hwnd); ! 762: } ! 763: #else ! 764: pthd->hprocMonitor = pi.hProcess; ! 765: pthd->hwndMonitor = hwnd; ! 766: ! 767: if (pthd->hprocMonitor != NULL) ! 768: SendMessage(hwndCaller, AIM_SETCHILDAPP, 0, hwnd); ! 769: #endif ! 770: ! 771: ResumeThread(hthrd); ! 772: CloseHandle(hthrd); ! 773: CloseHandle(pi.hThread); ! 774: return TRUE; ! 775: } ! 776: ! 777: ! 778: /****************************************************************************\ ! 779: * ! 780: * FUNCTION: BOOL CALLBACK ETWProc( HWND hwnd, LPARAM lParam ) ! 781: * ! 782: * PURPOSE: Enumeration proc for ExecProgram. It looks for the thread's ! 783: * top level window. ! 784: * ! 785: * History: ! 786: * 22-Apr-1993 JonPa Created it ! 787: * ! 788: \****************************************************************************/ ! 789: BOOL CALLBACK ETWProc( HWND hwnd, LPARAM lParam ) { ! 790: DWORD *pdw = (DWORD *)lParam; ! 791: ! 792: /* ! 793: * If this window has no parent, then it is a toplevel ! 794: * window for the thread. Remember the last one we find since it ! 795: * is probably the main window. ! 796: */ ! 797: ! 798: if (GetParent(hwnd) == NULL) { ! 799: DPRINT(("MT:EnumThdWin found 0x%lx\n", (DWORD)hwnd)); ! 800: *pdw = (DWORD)hwnd; ! 801: } ! 802: ! 803: return TRUE; ! 804: } ! 805: ! 806: /****************************************************************************\ ! 807: * ! 808: * FUNCTION: DWORD ProcWaitThread( LPDWORD lpdw ) ! 809: * ! 810: * PURPOSE: Thread to wait on a process and then post a message ! 811: * ! 812: * ! 813: * History: ! 814: * 22-Apr-1993 JonPa Created it ! 815: * ! 816: \****************************************************************************/ ! 817: DWORD WINAPI ProcWaitThread( LPVOID lpv ) { ! 818: LPDWORD lpdw = lpv; ! 819: PTHDDATA pthd = (PTHDDATA)lpdw; ! 820: DWORD dwRet; ! 821: ! 822: if (pthd->hprocMonitor == NULL) { ! 823: /* something went wrong, just exit now */ ! 824: DPRINT(("wt:Aborting\n")); ! 825: FreeMem( lpdw ); ! 826: ExitThread(0); ! 827: } ! 828: ! 829: DPRINT(("wt:Waiting\n")); ! 830: dwRet = WaitForSingleObject( pthd->hprocMonitor, INFINITE ); ! 831: ! 832: DPRINT(("wt:Send AIM_PROCESSTERM\n")); ! 833: SendMessage(pthd->hwndCaller, AIM_PROCESSTERM, (dwRet == WAIT_OBJECT_0), ! 834: (LPARAM)pthd->hwndMonitor); ! 835: ! 836: CloseHandle( pthd->hprocMonitor ); ! 837: FreeMem( lpdw ); ! 838: ExitThread(0); ! 839: ! 840: return 0; ! 841: } ! 842: ! 843: ! 844: /****************************************************************************\ ! 845: * ! 846: * FUNCTION: void NewAniCursor( HWND hwnd ) ! 847: * ! 848: * PURPOSE: erase any used memory and init to a clean slate ! 849: * ! 850: * ! 851: * History: ! 852: * 22-Apr-1993 JonPa Created it ! 853: * ! 854: \****************************************************************************/ ! 855: void NewAniCursor( HWND hwnd ) { ! 856: int i, cSteps; ! 857: LPTSTR psz; ! 858: ! 859: PausePreview(hwnd, DLG_MAIN_PREVIEW); ! 860: ! 861: /* Step through the list box, deleting all the lb entryies and everything ! 862: * that they point to (except the icons). ! 863: */ ! 864: cSteps = GetStepCount(hwnd); ! 865: ! 866: if (cSteps != LB_ERR) { ! 867: for( i = 0; i < cSteps; i++ ) { ! 868: /* ! 869: * Delete the top item of the list. Note that once that item ! 870: * (current index 0) is deleted, then the next item will move ! 871: * up and become index 0. ! 872: */ ! 873: SendDlgItemMessage( hwnd, DLG_MAIN_FRAMELIST, LB_DELETESTRING,0,0); ! 874: } ! 875: } ! 876: ! 877: ! 878: /* ! 879: * Step through the icon list deleting them. We don't need to call ! 880: * DestroyFrame since we are trashing the whole chain. ! 881: */ ! 882: ! 883: #if 0 ! 884: pf = gpfrmFrames; ! 885: gpfrmFrames = NULL; ! 886: ! 887: DON'T DO THIS!!! it will wipe out the clip board accidentally! ! 888: ! 889: for(; pf != NULL; pf = pfrmNext ) { ! 890: pfrmNext = pf->pfrmNext; ! 891: ! 892: DestroyIcon( pf->hcur ); ! 893: FreeMem(pf); ! 894: } ! 895: #endif ! 896: ! 897: /* ! 898: * Init Ani header ! 899: */ ! 900: ZeroMemory( &ganiAcon, sizeof(ganiAcon) ); ! 901: ganiAcon.anih.cbSizeof = sizeof(ganiAcon); ! 902: ganiAcon.anih.cbSizeof = AF_ICON; ! 903: ganiAcon.anih.jifRate = 10; ! 904: ! 905: SetDlgItemTextA(hwnd, DLG_MAIN_TITLE, ganiAcon.azTitle); ! 906: SetDlgItemTextA(hwnd, DLG_MAIN_AUTHOR, ganiAcon.azCreator); ! 907: ! 908: SetDlgItemInt( hwnd, DLG_MAIN_RATE, ganiAcon.anih.jifRate, FALSE); ! 909: ! 910: PreviewCursor(hwnd, DLG_MAIN_PREVIEW); ! 911: ! 912: SetWindowFileTitle(hwnd, gpszUntitled ); ! 913: ! 914: psz = FmtSprintf(MSG_NOFRAMESSEL); ! 915: SetDlgItemText(hwnd, DLG_MAIN_FRAMEGRP, psz); ! 916: FmtFree( psz ); ! 917: } ! 918: ! 919: /****************************************************************************\ ! 920: * ! 921: * FUNCTION: BOOL GetCurrentSel( HWND hwnd, int id, int * paiSel, ! 922: * int ciSel, int *pcSel ); ! 923: * ! 924: * PURPOSE: Gets the selections and returns it's index ! 925: * ! 926: * ! 927: * History: ! 928: * 22-Apr-1993 JonPa Created it ! 929: * ! 930: \****************************************************************************/ ! 931: BOOL GetCurrentSel( HWND hwnd, int id, int * paiSel, int ciSel, int *pcSel ) { ! 932: ! 933: #ifdef MULTISEL ! 934: *pcSel = SendDlgItemMessage(hwnd,id, LB_GETSELITEMS, ciSel,(LPARAM)paiSel); ! 935: ! 936: if (*pcSel == LB_ERR) { ! 937: *pcSel = 0; ! 938: } ! 939: #else ! 940: ! 941: *paiSel = SendDlgItemMessage(hwnd, id, LB_GETCURSEL, 0, 0); ! 942: *pcSel = 1; ! 943: ! 944: if (*paiSel == LB_ERR) ! 945: *pcSel = 0; ! 946: #endif ! 947: ! 948: return TRUE; ! 949: } ! 950: ! 951: /****************************************************************************\ ! 952: * ! 953: * FUNCTION: VOID SetCurrentSel( HWND hwnd, int id, BOOL fExtend, int iSel); ! 954: * ! 955: * PURPOSE: Sets the selections and returns it's index ! 956: * ! 957: * ! 958: * History: ! 959: * 29-Apr-1993 JonPa Created it ! 960: * ! 961: \****************************************************************************/ ! 962: VOID SetCurrentSel( HWND hwnd, int id, BOOL fExtend, int iSel) { ! 963: #ifdef MULTISEL ! 964: if (!fExtend) { ! 965: SendDlgItemMessage(hwnd, id, LB_SETSEL, FALSE, -1); ! 966: } ! 967: ! 968: SendDlgItemMessage(hwnd, id, LB_SETSEL, TRUE, iSel); ! 969: #else ! 970: SendDlgItemMessage(hwnd, id, LB_SETCURSEL, iSel, 0); ! 971: #endif ! 972: ! 973: UpdateStepSel( hwnd ); ! 974: } ! 975: ! 976: ! 977: /****************************************************************************\ ! 978: * ! 979: * FUNCTION: VOID EditFrame(HWND hwnd, int iSel); ! 980: * ! 981: * PURPOSE: Runs ImagEdit on the frame indexed by iSel ! 982: * ! 983: * ! 984: * History: ! 985: * 27-Apr-1993 JonPa ! 986: * ! 987: \****************************************************************************/ ! 988: VOID EditFrame(HWND hWnd, BOOL fEditFrame) { ! 989: LPTSTR pszCmdLine = NULL; ! 990: int cchCmdLine; ! 991: HANDLE hf; ! 992: DWORD cb; ! 993: PBYTE pbIcon; ! 994: DWORD cbIcon; ! 995: int iSel; ! 996: int cSel; ! 997: BOOL fExeced; ! 998: ! 999: /* create a temp .cur file name */ ! 1000: if( !GetTempCursorFileName( gszTempFile ) ) { ! 1001: FmtMessageBox( hWnd, TITL_ERROR, NULL, MB_OK | MB_ICONSTOP, ! 1002: TRUE, MSG_OUTOFRESOUCES ); ! 1003: return; ! 1004: } ! 1005: ! 1006: ! 1007: cSel = GetSelStepCount(hWnd); ! 1008: ! 1009: if ( (fEditFrame && (cSel != 1)) || cSel > 1 ) { ! 1010: ! 1011: FmtMessageBox( hWnd, TITL_ERROR, NULL, MB_OK | MB_ICONSTOP, ! 1012: TRUE, fEditFrame ? MSG_MUSTEQONEFAME : MSG_LESSEQONEFRAME); ! 1013: return; ! 1014: } ! 1015: ! 1016: /* cache the currently selected item (Singluar) */ ! 1017: GetCurrentSel( hWnd, DLG_MAIN_FRAMELIST, &iSel, 1, &cSel ); ! 1018: ! 1019: /* ! 1020: * If edit, then write the frame to the file and save checksum ! 1021: * otherwise write the blank cursor to the file. ! 1022: */ ! 1023: ! 1024: hf = CreateFile( gszTempFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, ! 1025: FILE_ATTRIBUTE_NORMAL, NULL ); ! 1026: ! 1027: ! 1028: if (hf == INVALID_HANDLE_VALUE) { ! 1029: FmtMessageBox( hWnd, TITL_ERROR, NULL, MB_OK | MB_ICONSTOP, TRUE, ! 1030: MSG_CANTCREATEFILE, gszTempFile ); ! 1031: return; ! 1032: } ! 1033: ! 1034: if (fEditFrame || cSel != 0) { ! 1035: PSTEP ps = GetStep(hWnd, iSel); ! 1036: ! 1037: if( !IsValidPS(ps) ) { ! 1038: FmtMessageBox( hWnd, TITL_ERROR, NULL, MB_OK | MB_ICONSTOP, ! 1039: TRUE, MSG_OUTOFRESOUCES ); ! 1040: CloseHandle(hf); ! 1041: return; ! 1042: } ! 1043: ! 1044: ! 1045: pbIcon = ps->pfrmFrame->abIcon; ! 1046: cbIcon = ps->pfrmFrame->rtag.ckSize; ! 1047: ! 1048: } else { ! 1049: ! 1050: HRSRC hr = FindResource(hInst, MAKEINTRESOURCE(ID_BLANKCUR), ! 1051: MAKEINTRESOURCE(RCT_RAWDATA)); ! 1052: ! 1053: if (hr == NULL || (pbIcon =LockResource(LoadResource(hInst, hr))) == ! 1054: NULL) { ! 1055: FmtMessageBox( hWnd, TITL_ERROR, NULL, MB_OK | MB_ICONSTOP, ! 1056: TRUE, MSG_OUTOFRESOUCES ); ! 1057: CloseHandle(hf); ! 1058: return; ! 1059: } ! 1060: ! 1061: cbIcon = SizeofResource(hInst, hr); ! 1062: } ! 1063: ! 1064: WriteFile(hf, pbIcon, cbIcon, &cb, NULL); ! 1065: ! 1066: CloseHandle(hf); ! 1067: ! 1068: /* ! 1069: * change .tmp to .cur ! 1070: */ ! 1071: { TCHAR szOldName[MAX_PATH]; ! 1072: ! 1073: cchCmdLine = lstrlen(gszTempFile); ! 1074: ! 1075: lstrcpy( szOldName, gszTempFile ); ! 1076: lstrcpy( &gszTempFile[cchCmdLine - 3], gpszCUR ); ! 1077: ! 1078: if(!MoveFile(szOldName, gszTempFile)) ! 1079: lstrcpy( gszTempFile, szOldName ); ! 1080: ! 1081: cchCmdLine = (cchCmdLine + lstrlen(gszCursorEditor) + 1 + 1) * ! 1082: sizeof(TCHAR); ! 1083: ! 1084: pszCmdLine = AllocMem(cchCmdLine); ! 1085: } ! 1086: ! 1087: if (pszCmdLine == NULL) ! 1088: return; ! 1089: ! 1090: { ! 1091: LPTSTR pszTempFile = gszTempFile; ! 1092: ! 1093: FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, ! 1094: gszCursorEditor, 0, 0, pszCmdLine, cchCmdLine, &pszTempFile); ! 1095: } ! 1096: ! 1097: /* spawn imagedit on the file */ ! 1098: fExeced = ExecProgram( hWnd, pszCmdLine ); ! 1099: DPRINT(("MT:Begin Defer to child\n")); ! 1100: ! 1101: FreeMem(pszCmdLine); ! 1102: ! 1103: if ( fExeced ) { ! 1104: gfEditFrame = fEditFrame; ! 1105: } else { ! 1106: FmtMessageBox( hWnd, TITL_ERROR, NULL, MB_OK | MB_ICONSTOP, ! 1107: TRUE, MSG_NOIMAGEDIT, gszCursorEditor ); ! 1108: } ! 1109: } ! 1110: ! 1111: ! 1112: ! 1113: ! 1114: /****************************************************************************\ ! 1115: * ! 1116: * FUNCTION: PSTEP NewStep( void ); ! 1117: * ! 1118: * ! 1119: * PURPOSE: Creates a new step and set's its pfrmFrame to NULL; ! 1120: * ! 1121: * ! 1122: * History: ! 1123: * 29-Apr-1993 JonPa Created it ! 1124: * ! 1125: \****************************************************************************/ ! 1126: PSTEP NewStep( void ) { ! 1127: PSTEP ps; ! 1128: ! 1129: ps = AllocMem(sizeof(STEP)); ! 1130: ! 1131: if (IsValidPS(ps)) ! 1132: ps->pfrmFrame = NULL; ! 1133: ! 1134: return ps; ! 1135: } ! 1136: ! 1137: /****************************************************************************\ ! 1138: * ! 1139: * FUNCTION: VOID DestroyStep( PSTEP ps ); ! 1140: * ! 1141: * ! 1142: * PURPOSE: Deletes a step, and derefernces its frame, deleting it if ! 1143: * necessary. ! 1144: * ! 1145: * History: ! 1146: * 29-Apr-1993 JonPa Created it ! 1147: * ! 1148: \****************************************************************************/ ! 1149: VOID DestroyStep( PSTEP ps ) { ! 1150: LinkStepFrame(ps, NULL); ! 1151: ! 1152: FreeMem(ps); ! 1153: } ! 1154: ! 1155: ! 1156: /****************************************************************************\ ! 1157: * ! 1158: * FUNCTION: VOID CopyStep( PSTEP psDst, PSTEP psSrc ); ! 1159: * ! 1160: * ! 1161: * PURPOSE: Copyies a step, bumping the ref count of the frame if it ! 1162: * needs it. ! 1163: * ! 1164: * History: ! 1165: * 07-May-1993 JonPa Created it ! 1166: * ! 1167: \****************************************************************************/ ! 1168: VOID CopyStep( PSTEP psDst, PSTEP psSrc ) { ! 1169: *psDst = *psSrc; ! 1170: ! 1171: if( psDst->pfrmFrame != NULL ) { ! 1172: psDst->pfrmFrame->cRef += 1; ! 1173: } ! 1174: } ! 1175: ! 1176: ! 1177: /****************************************************************************\ ! 1178: * ! 1179: * FUNCTION: VOID LinkStepFrame( PSTEP ps, PFRAME pf ); ! 1180: * ! 1181: * ! 1182: * PURPOSE: Unlinks a step from its frame and then links the new ! 1183: * frame in its place. If the old frame is an orphan, it ! 1184: * gets destroyed. ! 1185: * ! 1186: * ! 1187: * History: ! 1188: * 29-Apr-1993 JonPa Created it ! 1189: * ! 1190: \****************************************************************************/ ! 1191: VOID LinkStepFrame(PSTEP ps, PFRAME pf ) { ! 1192: PFRAME pfOld = ps->pfrmFrame; ! 1193: ! 1194: if (pf != NULL) ! 1195: pf->cRef++; ! 1196: ! 1197: if (pfOld != NULL && --(pfOld->cRef) == 0) ! 1198: DestroyFrame(pfOld); ! 1199: ! 1200: ps->pfrmFrame = pf; ! 1201: } ! 1202: ! 1203: /****************************************************************************\ ! 1204: * ! 1205: * FUNCTION: VOID DestroyFrame( PFRAME pf ); ! 1206: * ! 1207: * ! 1208: * PURPOSE: Unlinks a frame from the list, deletes its hcur, and ! 1209: * Frees its memory. ! 1210: * ! 1211: * ! 1212: * History: ! 1213: * 28-Apr-1993 JonPa Created it ! 1214: * ! 1215: \****************************************************************************/ ! 1216: VOID DestroyFrame( PFRAME pf ) { ! 1217: PFRAME pfList; ! 1218: ! 1219: if (pf == gpfrmFrames) { ! 1220: gpfrmFrames = pf->pfrmNext; ! 1221: } else { ! 1222: ! 1223: for( pfList = gpfrmFrames; pfList != NULL; ! 1224: pfList = pfList->pfrmNext ) { ! 1225: ! 1226: if (pfList->pfrmNext == pf) { ! 1227: break; ! 1228: } ! 1229: } ! 1230: ! 1231: if (pfList != NULL) { ! 1232: pfList->pfrmNext = pf->pfrmNext; ! 1233: } ! 1234: } ! 1235: ! 1236: DestroyIcon( pf->hcur ); ! 1237: FreeMem(pf); ! 1238: } ! 1239: ! 1240: /****************************************************************************\ ! 1241: * ! 1242: * FUNCTION: PCLPBRDDAT NewClpBrdDat( void ) ! 1243: * ! 1244: * ! 1245: * PURPOSE: Creates a new clip board data struct ! 1246: * ! 1247: * ! 1248: * History: ! 1249: * 29-Apr-1993 JonPa Created it ! 1250: * ! 1251: \****************************************************************************/ ! 1252: PCLPBRDDAT NewClpBrdDat( void ) { ! 1253: PCLPBRDDAT pcbd = AllocMem( sizeof(CLPBRDDAT) ); ! 1254: ! 1255: if (pcbd != NULL) ! 1256: pcbd->stp.pfrmFrame = NULL; ! 1257: ! 1258: return pcbd; ! 1259: } ! 1260: ! 1261: /****************************************************************************\ ! 1262: * ! 1263: * FUNCTION: VOID DestroyClpBrdDat(PCLPBRDDAT pcbd) ! 1264: * ! 1265: * ! 1266: * PURPOSE: Creates a new clip board data struct ! 1267: * ! 1268: * ! 1269: * History: ! 1270: * 29-Apr-1993 JonPa Created it ! 1271: * ! 1272: \****************************************************************************/ ! 1273: VOID DestroyClpBrdDat(PCLPBRDDAT pcbd) { ! 1274: LinkStepFrame(&(pcbd->stp), NULL); ! 1275: ! 1276: FreeMem(pcbd); ! 1277: } ! 1278: ! 1279: /****************************************************************************\ ! 1280: * ! 1281: * FUNCTION: VOID SetWindowFileTitle(HWND hWnd, LPTSTR szFileTitle) ! 1282: * ! 1283: * ! 1284: * PURPOSE: Sets the file title ! 1285: * ! 1286: * ! 1287: * History: ! 1288: * 30-Apr-1993 JonPa Created it ! 1289: * ! 1290: \****************************************************************************/ ! 1291: VOID SetWindowFileTitle(HWND hWnd, LPTSTR szFileTitle) { ! 1292: ! 1293: /* ! 1294: * We use LocalAlloc here instead of AllocMem because we don't really ! 1295: * char if it fails ! 1296: */ ! 1297: int cch = lstrlen( gszWindowTitle ) + lstrlen(szFileTitle); ! 1298: LPTSTR pszTitle = LocalAlloc(LPTR, (cch+4) * sizeof(TCHAR) ); ! 1299: ! 1300: if (pszTitle != NULL) { ! 1301: wsprintf( pszTitle, "%s - %s", gszWindowTitle, szFileTitle ); ! 1302: SetWindowText(hWnd, pszTitle); ! 1303: ! 1304: LocalFree(pszTitle); ! 1305: } else { ! 1306: SetWindowText(hWnd, gszWindowTitle); ! 1307: } ! 1308: } ! 1309: ! 1310: int __cdecl RevCompInts(const void *elm1, const void *elm2) { ! 1311: return *((int *)elm2) - *((int *)elm1); ! 1312: } ! 1313: ! 1314: /****************************************************************************\ ! 1315: * ! 1316: * FUNCTION: ClearStepSel ! 1317: * ! 1318: * ! 1319: * PURPOSE: Clears all selections from the frame list ! 1320: * ! 1321: * ! 1322: * History: ! 1323: * 02-Jul-1993 JonPa Created it ! 1324: * ! 1325: \****************************************************************************/ ! 1326: VOID ClearStepSel( HWND hWnd ) { ! 1327: int cItems = GetStepCount(hWnd); ! 1328: ! 1329: if (cItems != 0) { ! 1330: SendDlgItemMessage(hWnd, DLG_MAIN_FRAMELIST, ! 1331: LB_SELITEMRANGE, (WPARAM)FALSE, MAKELPARAM(0, cItems - 1)); ! 1332: } ! 1333: ! 1334: UpdateStepSel(hWnd); ! 1335: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.