|
|
1.1 ! root 1: ! 2: /******************************************************************************\ ! 3: * This is a part of the Microsoft Source Code Samples. ! 4: * Copyright (C) 1993 Microsoft Corporation. ! 5: * All rights reserved. ! 6: * This source code is only intended as a supplement to ! 7: * Microsoft Development Tools and/or WinHelp documentation. ! 8: * See these sources for detailed information regarding the ! 9: * Microsoft samples programs. ! 10: \******************************************************************************/ ! 11: ! 12: /*****************************************************************************\ ! 13: * ! 14: * Module: dialogs.c ! 15: * ! 16: * Contains dialog procs for the Windows debugging Spy SDK applet. ! 17: * ! 18: * Functions: ! 19: * ! 20: * MyDialogBox() ! 21: * AboutDlgProc() ! 22: * SelectWindowDlgProc() ! 23: * OutputDlgProc() ! 24: * SelectFont() ! 25: * MessagesDlgProc() ! 26: * SelectWindowCommand() ! 27: * FillListBox() ! 28: * AddOneWindow() ! 29: * MakeWindowName() ! 30: * FindHwndInListBox() ! 31: * HighlightWindow() ! 32: * SelectWindowUpdateInfo() ! 33: * SelectWindowEnableFields() ! 34: * OutputCommand() ! 35: * MessagesInit() ! 36: * MessagesCommand() ! 37: * MessagesUpdateCheckBoxes() ! 38: * ! 39: * Comments: ! 40: * ! 41: \*****************************************************************************/ ! 42: ! 43: #include "spy.h" ! 44: ! 45: #include <commdlg.h> ! 46: ! 47: ! 48: #define DINV 3 ! 49: ! 50: ! 51: PRIVATE HWND ghwndSpyingOnTemp; // Temp when selecting hwnd to spy on. ! 52: PRIVATE HWND ghwndDlgBeingFilled = NULL; ! 53: PRIVATE BOOL bBorderOn = FALSE; ! 54: PRIVATE INT gcItemsSave; ! 55: ! 56: ! 57: PRIVATE BOOL SelectWindowCommand(HWND hwnd, INT nCmd, INT nNotifyCode); ! 58: PRIVATE VOID FillListBox(HWND hDlg, HWND hwndList, HWND hwnd); ! 59: BOOL CALLBACK AddOneWindow(HWND hwnd, HWND hwndList); ! 60: PRIVATE VOID MakeWindowName(HWND hwnd, LPSTR lpString, INT nStringLen); ! 61: PRIVATE INT FindHwndInListBox(HWND hwndList, HWND hSpyWnd); ! 62: PRIVATE VOID HighlightWindow(HWND hwnd, BOOL fDraw); ! 63: PRIVATE VOID SelectWindowUpdateInfo(HWND hDlg, HWND hwnd); ! 64: PRIVATE VOID SelectWindowEnableFields(HWND hwnd, BOOL fEnable); ! 65: PRIVATE BOOL OutputCommand(HWND hwnd, INT nCmd, INT nNotifyCode); ! 66: PRIVATE VOID MessagesInit(HWND hwnd); ! 67: PRIVATE BOOL MessagesCommand(HWND hwnd, INT nCmd, INT nNotifyCode); ! 68: PRIVATE VOID MessagesUpdateCheckBoxes(HWND hwnd); ! 69: ! 70: ! 71: CHAR szConsoleWindowClass[] = "ConsoleWindowClass"; ! 72: ! 73: /*****************************************************************************\ ! 74: * MyDialogBox ! 75: * ! 76: * Puts up the specified dialog. ! 77: * ! 78: * Arguments: ! 79: * INT idDlg - The resource id of the dialog to display. ! 80: * DLGPROC pfnDlgProc - The dialog proc to use. ! 81: * ! 82: * Returns: ! 83: * The return value from DialogBox (whatever the dialog proc passes ! 84: * to EndDialog). ! 85: \*****************************************************************************/ ! 86: ! 87: BOOL ! 88: MyDialogBox( ! 89: INT idDlg, ! 90: DLGPROC pfnDlgProc ! 91: ) ! 92: { ! 93: return DialogBox(ghInst, MAKEINTRESOURCE(idDlg), ghwndSpyApp, pfnDlgProc); ! 94: } ! 95: ! 96: ! 97: ! 98: /*****************************************************************************\ ! 99: * AboutDlgProc ! 100: * ! 101: * Dialog proc for the About box. ! 102: * ! 103: \*****************************************************************************/ ! 104: ! 105: BOOL CALLBACK ! 106: AboutDlgProc( ! 107: HWND hwnd, ! 108: UINT msg, ! 109: WPARAM wParam, ! 110: LPARAM lParam ! 111: ) ! 112: { ! 113: switch (msg) { ! 114: case WM_INITDIALOG: ! 115: return TRUE; ! 116: ! 117: case WM_COMMAND: ! 118: EndDialog(hwnd, IDOK); ! 119: break; ! 120: } ! 121: ! 122: return FALSE; ! 123: } ! 124: ! 125: ! 126: ! 127: /*****************************************************************************\ ! 128: * SelectWindowDlgProc ! 129: * ! 130: * Dialog proc for the Select Window dialog. This dialog allows the user ! 131: * to select which window they want to spy on. ! 132: * ! 133: * Arguments: ! 134: * HWND hwnd - Window handle of the dialog. ! 135: * UINT msg - Message sent to window. ! 136: * WPARAM wParam - Message parameter. ! 137: * LPARAM lParam - Message parameter. ! 138: * ! 139: * Returns: ! 140: * The value that the dialog proc should return, based on the processing ! 141: * of the specific WM_COMMAND message received. ! 142: \*****************************************************************************/ ! 143: ! 144: BOOL CALLBACK ! 145: SelectWindowDlgProc( ! 146: HWND hwnd, ! 147: UINT msg, ! 148: WPARAM wParam, ! 149: LPARAM lParam ! 150: ) ! 151: { ! 152: HWND hwndList; ! 153: INT nIndex; ! 154: ! 155: UNREFERENCED_PARAMETER(lParam); ! 156: ! 157: switch (msg) ! 158: { ! 159: case WM_INITDIALOG: ! 160: hwndList = GetDlgItem(hwnd, DID_SELWINLIST); ! 161: ghwndSpyingOnTemp = ghwndSpyingOn == HWND_ALL ? NULL : (ghwndSpyingOn == NULL ? NULL ! 162: : GetParent(ghwndSpyingOn)); ! 163: FillListBox(hwnd, hwndList, ghwndSpyingOnTemp); ! 164: nIndex = FindHwndInListBox(hwndList, ghwndSpyingOn == HWND_ALL ? NULL ! 165: : ghwndSpyingOn); ! 166: SendMessage(hwndList, LB_SETCURSEL, nIndex, 0); ! 167: ghwndSpyingOnTemp = (HWND)SendMessage(hwndList, LB_GETITEMDATA, nIndex, 0); ! 168: SelectWindowUpdateInfo(hwnd, ghwndSpyingOnTemp); ! 169: CheckDlgButton(hwnd, DID_SELWINALLWINDOWS, gfSpyAll); ! 170: SelectWindowEnableFields(hwnd, !gfSpyAll); ! 171: SetFocus(hwnd); ! 172: HighlightWindow(ghwndSpyingOnTemp, TRUE); ! 173: ! 174: return TRUE; ! 175: ! 176: case WM_NCLBUTTONDOWN: ! 177: if (wParam == HTCAPTION) ! 178: { ! 179: // ! 180: // The mouse is down for a move of the dialog, so clean up the ! 181: // border stuff. ! 182: // ! 183: if (bBorderOn) ! 184: HighlightWindow(ghwndSpyingOnTemp, FALSE); ! 185: } ! 186: ! 187: return FALSE; ! 188: ! 189: case WM_KEYDOWN: ! 190: case WM_LBUTTONUP: ! 191: case WM_NCLBUTTONUP: ! 192: // ! 193: // The mouse is up from a move of the dialog, so put up the ! 194: // border stuff again. ! 195: // ! 196: if (!bBorderOn) ! 197: HighlightWindow(ghwndSpyingOnTemp, TRUE); ! 198: ! 199: return FALSE; ! 200: ! 201: case WM_CANCELMODE: ! 202: return FALSE; ! 203: ! 204: case WM_COMMAND: ! 205: return SelectWindowCommand(hwnd, LOWORD(wParam), HIWORD(wParam)); ! 206: } ! 207: ! 208: return FALSE; ! 209: } ! 210: ! 211: ! 212: ! 213: /*****************************************************************************\ ! 214: * SelectWindowCommand ! 215: * ! 216: * Handles thw WM_COMMAND messages for the Select Window dialog. ! 217: * ! 218: * Arguments: ! 219: * HWND hwnd - Window handle of the dialog. ! 220: * INT nCmd - Command value. ! 221: * INT nNotifyCode - The notify code. ! 222: * ! 223: * Returns: ! 224: * The value that the dialog proc should return, based on the processing ! 225: * of the specific WM_COMMAND message received. ! 226: \*****************************************************************************/ ! 227: ! 228: PRIVATE BOOL ! 229: SelectWindowCommand( ! 230: HWND hwnd, ! 231: INT nCmd, ! 232: INT nNotifyCode ! 233: ) ! 234: { ! 235: INT nIndex; ! 236: HWND hwndList; ! 237: CHAR rgString[32]; ! 238: ! 239: switch (nCmd) ! 240: { ! 241: case IDOK: ! 242: SetWindowToSpyOn(IsDlgButtonChecked(hwnd, DID_SELWINALLWINDOWS) ? ! 243: HWND_ALL : ghwndSpyingOnTemp); ! 244: ! 245: if (bBorderOn) ! 246: HighlightWindow(ghwndSpyingOnTemp, FALSE); ! 247: ! 248: EndDialog(hwnd, IDOK); ! 249: return TRUE; ! 250: ! 251: case IDCANCEL: ! 252: if (bBorderOn) ! 253: HighlightWindow(ghwndSpyingOnTemp, FALSE); ! 254: ! 255: EndDialog(hwnd, IDCANCEL); ! 256: return TRUE; ! 257: ! 258: case DID_SELWINLIST: ! 259: // ! 260: // User single clicked or doubled clicked in listbox - ! 261: // Single click means select a window to spy on ! 262: // Double click means enumerate all the children of that window. ! 263: // ! 264: hwndList = GetDlgItem(hwnd, DID_SELWINLIST); ! 265: switch (nNotifyCode) ! 266: { ! 267: case LBN_SELCHANGE: ! 268: // ! 269: // Single click case. Select a window to spy upon. ! 270: // ! 271: // Get the window handle, set it as the window to spy on. ! 272: // ! 273: ! 274: if (bBorderOn) ! 275: HighlightWindow(ghwndSpyingOnTemp, FALSE); ! 276: ! 277: nIndex = (INT)SendMessage(hwndList, LB_GETCURSEL, 0, 0); ! 278: ghwndSpyingOnTemp = (HWND)SendMessage(hwndList, LB_GETITEMDATA, ! 279: nIndex, 0); ! 280: SelectWindowUpdateInfo(hwnd, ghwndSpyingOnTemp); ! 281: ! 282: HighlightWindow(ghwndSpyingOnTemp, TRUE); ! 283: ! 284: break; ! 285: ! 286: case LBN_DBLCLK: ! 287: // ! 288: // Double click case - first click has already been ! 289: // processed as single click. In this case, the user has ! 290: // requested to look at all the children of a given ! 291: // selection. ! 292: // ! 293: // Get the current selection, and check to see if it is the ! 294: // " [ parent.. ]" entry. If so, go up one level first. ! 295: // ! 296: ! 297: SetCursor(LoadCursor(NULL, IDC_WAIT)); ! 298: ! 299: if (bBorderOn) ! 300: HighlightWindow(ghwndSpyingOnTemp, FALSE); ! 301: ! 302: nIndex = (INT)SendMessage(hwndList, LB_GETCURSEL, 0, 0); ! 303: ghwndSpyingOnTemp = (HWND)SendMessage(hwndList, LB_GETITEMDATA, ! 304: nIndex, 0); ! 305: SendMessage(hwndList, LB_GETTEXT, nIndex, (LPARAM)rgString); ! 306: ! 307: if (rgString[0] == ' ') ! 308: { ! 309: // At top? If so, we are done. ! 310: if (ghwndSpyingOnTemp == NULL) ! 311: { ! 312: SetCursor(LoadCursor(NULL, IDC_ARROW)); ! 313: break; ! 314: } ! 315: ! 316: ghwndSpyingOnTemp = GetParent(ghwndSpyingOnTemp); ! 317: } ! 318: ! 319: SendMessage(hwndList, LB_RESETCONTENT, 0, 0); ! 320: FillListBox(hwnd, hwndList, ghwndSpyingOnTemp); ! 321: ! 322: nIndex = FindHwndInListBox(hwndList, ghwndSpyingOnTemp); ! 323: SendMessage(hwndList, LB_SETCURSEL, nIndex, 0); ! 324: ghwndSpyingOnTemp = (HWND)SendMessage(hwndList, LB_GETITEMDATA, ! 325: nIndex, 0); ! 326: HighlightWindow(ghwndSpyingOnTemp,TRUE); ! 327: SelectWindowUpdateInfo(hwnd, ghwndSpyingOnTemp); ! 328: SetCursor(LoadCursor(NULL, IDC_ARROW)); ! 329: break; ! 330: } ! 331: ! 332: break; ! 333: ! 334: case DID_SELWINALLWINDOWS: ! 335: SelectWindowEnableFields(hwnd, ! 336: !IsDlgButtonChecked(hwnd, DID_SELWINALLWINDOWS)); ! 337: ! 338: break; ! 339: } ! 340: ! 341: return FALSE; ! 342: } ! 343: ! 344: ! 345: ! 346: /*****************************************************************************\ ! 347: * FillListBox ! 348: * ! 349: * Fills the listbox in the Select Window dialog with the names of ! 350: * the child windows of the given window. ! 351: * ! 352: * Arguments: ! 353: * hDlg - Window handle of the dialog window ! 354: * hwndList - Handle to the listbox within the dialog. ! 355: * hwnd - Parent whose children to enumerate. ! 356: * ! 357: * Returns: ! 358: * VOID ! 359: \*****************************************************************************/ ! 360: ! 361: PRIVATE VOID ! 362: FillListBox( ! 363: HWND hDlg, ! 364: HWND hwndList, ! 365: HWND hwnd ! 366: ) ! 367: { ! 368: INT nIndex; ! 369: ! 370: // ! 371: // First fill the list box with child windows ! 372: // ! 373: // Make sure we display the list box after things are added. ! 374: // ! 375: ! 376: SendMessage(hwndList, WM_SETREDRAW, 0, 0); ! 377: ! 378: // ! 379: // remember which dialog we are processing ! 380: // ! 381: ! 382: ghwndDlgBeingFilled = hDlg; ! 383: ! 384: if (hwnd == NULL) ! 385: { ! 386: // ! 387: // Enumerate the top level separately... gross unsymmetry, but ! 388: // hey. ! 389: // ! 390: EnumWindows(AddOneWindow, (LPARAM)hwndList); ! 391: } ! 392: else ! 393: { ! 394: EnumChildWindows(hwnd, AddOneWindow, (LPARAM)hwndList); ! 395: } ! 396: ! 397: // ! 398: // Now give the user a method of getting back to the parent. The space at ! 399: // the beginning of the " [parent]" string identifies the entry as the ! 400: // parent entry and makes it different from all the other entries since ! 401: // the others start with a handle number of some sort. ! 402: // ! 403: ! 404: nIndex = SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)" [ parent... ]"); ! 405: SendMessage(hwndList, LB_SETITEMDATA, nIndex, (LONG)hwnd); ! 406: ! 407: // ! 408: // Now do the redraw... ! 409: // ! 410: ! 411: SendMessage(hwndList, WM_SETREDRAW, 1, 0); ! 412: } ! 413: ! 414: ! 415: ! 416: /*****************************************************************************\ ! 417: * AddOneWindow ! 418: * ! 419: * Gets the windows to add to the list of windows to spy on. ! 420: * ! 421: * Arguments: ! 422: * HWND hwnd - handle of the window to add. ! 423: * HWND hwndList - handle to the listbox. ! 424: * ! 425: * Returns: ! 426: * TRUE - if a window was created. ! 427: \*****************************************************************************/ ! 428: #define CCH_RGBUF 32 ! 429: ! 430: BOOL CALLBACK ! 431: AddOneWindow( ! 432: HWND hwnd, ! 433: HWND hwndList ! 434: ) ! 435: { ! 436: CHAR rgBuf[CCH_RGBUF]; ! 437: INT nIndex; ! 438: HWND htemp; ! 439: ! 440: // ! 441: // Make sure we don't add any window that has anything to do with ! 442: // the dialog or any other spy window ! 443: // ! 444: ! 445: htemp = GetParent(hwnd); ! 446: ! 447: // Don't put console windows in the list since they can not be hooked ! 448: if (GetClassName(hwnd, (LPTSTR) rgBuf, CCH_RGBUF) != 0 && ! 449: strcmp(rgBuf, szConsoleWindowClass) == 0 ) ! 450: { ! 451: return 1; ! 452: } ! 453: ! 454: // Don't put windows that belong to spy in the list ! 455: if (hwnd == ghwndDlgBeingFilled || htemp == ghwndDlgBeingFilled ! 456: || hwnd == ghwndSpyApp ! 457: || htemp == ghwndSpyApp || hwnd == ghwndPrintf || htemp == ghwndPrintf ! 458: || hwnd == ghwndSpyHook || htemp == ghwndSpyHook) ! 459: { ! 460: return 1; ! 461: } ! 462: ! 463: MakeWindowName(hwnd, rgBuf, CCH_RGBUF); ! 464: ! 465: nIndex = SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)rgBuf); ! 466: ! 467: if (nIndex == LB_ERR || nIndex == LB_ERRSPACE) ! 468: return 0; ! 469: ! 470: if (SendMessage(hwndList, LB_SETITEMDATA, nIndex, (LPARAM)hwnd) == LB_ERR) ! 471: return 0; ! 472: ! 473: return 1; ! 474: } ! 475: ! 476: ! 477: ! 478: /*****************************************************************************\ ! 479: * MakeWindowName ! 480: * ! 481: * Builds the window name from the window handle passed in. ! 482: * ! 483: * Arguments: ! 484: * HWND hwnd - handle to the window. ! 485: * LPSTR lpString - String to put window name into. ! 486: * INT nSTringLen - Length of window string. ! 487: * ! 488: * Returns: ! 489: * VOID ! 490: \*****************************************************************************/ ! 491: ! 492: PRIVATE VOID ! 493: MakeWindowName( ! 494: HWND hwnd, ! 495: LPSTR lpString, ! 496: INT nStringLen ! 497: ) ! 498: { ! 499: wsprintf(lpString, "%8.8lX:", hwnd); ! 500: ! 501: if (hwnd == NULL || !IsWindow(hwnd)) ! 502: { ! 503: lstrcat(lpString, "!!!"); ! 504: } ! 505: else ! 506: { ! 507: GetWindowText(hwnd, lpString + 9, nStringLen - 9); ! 508: } ! 509: } ! 510: ! 511: ! 512: ! 513: /*****************************************************************************\ ! 514: * FindHwndInListBox ! 515: * ! 516: * Gets the window from the list of windows in the listbox. ! 517: * ! 518: * Arguments: ! 519: * HWND hwndList - handle to the listbox. ! 520: * HWND hSpyWnd - handle to the spy window. ! 521: * ! 522: * Returns: ! 523: * INT - Index to the window in the listbox. ! 524: \*****************************************************************************/ ! 525: ! 526: PRIVATE INT ! 527: FindHwndInListBox( ! 528: HWND hwndList, ! 529: HWND hSpyWnd ! 530: ) ! 531: { ! 532: CHAR rgBuf[9]; ! 533: INT nIndex; ! 534: ! 535: wsprintf(rgBuf, "%08lX", (LONG)hSpyWnd); ! 536: ! 537: nIndex = SendMessage(hwndList, LB_FINDSTRING, (WPARAM)-1, (LPARAM)rgBuf); ! 538: ! 539: if (nIndex == LB_ERR) ! 540: nIndex = 0; ! 541: ! 542: return nIndex; ! 543: } ! 544: ! 545: ! 546: ! 547: /*****************************************************************************\ ! 548: * HighlightWindow ! 549: * ! 550: * Used to temporarily highlight the window that the user has selected from ! 551: * the Select Window dialog. It does this by inverting a border around the ! 552: * window. ! 553: * ! 554: * Arguments: ! 555: * HWND hwnd - handle to the selected window. ! 556: * BOOL fdraw - whether to draw the window inverted on non-inverted. ! 557: * ! 558: * Returns: ! 559: * VOID ! 560: \*****************************************************************************/ ! 561: ! 562: PRIVATE VOID ! 563: HighlightWindow( ! 564: HWND hwnd, ! 565: BOOL fDraw ! 566: ) ! 567: { ! 568: HDC hdc; ! 569: RECT rc; ! 570: ! 571: bBorderOn = fDraw; ! 572: ! 573: if (hwnd == NULL || !IsWindow(hwnd)) ! 574: return; ! 575: ! 576: hdc = GetWindowDC(hwnd); ! 577: GetWindowRect(hwnd, &rc); ! 578: OffsetRect(&rc, -rc.left, -rc.top); ! 579: ! 580: if (!IsRectEmpty(&rc)) ! 581: { ! 582: PatBlt(hdc, rc.left, rc.top, rc.right - rc.left, DINV, DSTINVERT); ! 583: PatBlt(hdc, rc.left, rc.bottom - DINV, DINV, ! 584: -(rc.bottom - rc.top - 2 * DINV), DSTINVERT); ! 585: PatBlt(hdc, rc.right - DINV, rc.top + DINV, DINV, ! 586: rc.bottom - rc.top - 2 * DINV, DSTINVERT); ! 587: PatBlt(hdc, rc.right, rc.bottom - DINV, -(rc.right - rc.left), ! 588: DINV, DSTINVERT); ! 589: } ! 590: ! 591: ReleaseDC(hwnd, hdc); ! 592: } ! 593: ! 594: ! 595: ! 596: /*****************************************************************************\ ! 597: * SelectWindowUpdateInfo ! 598: * ! 599: * Updates the informational fields in the Select Window dialog when ! 600: * a new window is selected from the hwnd listbox. ! 601: * ! 602: * Arguments: ! 603: * HWND hDlg - handle to the select window dialog box. ! 604: * HWND hwnd - handle to the new window selected. ! 605: * ! 606: * Returns: ! 607: * VOID ! 608: \*****************************************************************************/ ! 609: ! 610: PRIVATE VOID ! 611: SelectWindowUpdateInfo( ! 612: HWND hDlg, ! 613: HWND hwnd ! 614: ) ! 615: { ! 616: HWND hParent; ! 617: DWORD dwStyle; ! 618: RECT rc; ! 619: CHAR szTemp[MAXSTRING]; ! 620: ! 621: if (hwnd) ! 622: { ! 623: hParent = GetParent(hwnd); ! 624: dwStyle = GetWindowLong(hwnd, GWL_STYLE); ! 625: ! 626: MakeWindowName(hwnd, szTemp, MAXSTRING); ! 627: SetDlgItemText(hDlg, DID_SELWINWINDOW, szTemp); ! 628: ! 629: GetClassName(hwnd, szTemp, MAXSTRING); ! 630: SetDlgItemText(hDlg, DID_SELWINCLASS, szTemp); ! 631: ! 632: if (hParent) ! 633: { ! 634: MakeWindowName(hParent, szTemp, MAXSTRING); ! 635: SetDlgItemText(hDlg, DID_SELWINPARENT, szTemp); ! 636: } ! 637: else ! 638: { ! 639: SetDlgItemText(hDlg, DID_SELWINPARENT, "<No Parent>"); ! 640: } ! 641: ! 642: GetWindowRect(hwnd, &rc); ! 643: wsprintf(szTemp, "(%d,%d)-(%d,%d) %dx%d", rc, ! 644: rc.right-rc.left, rc.bottom-rc.top); ! 645: SetDlgItemText(hDlg, DID_SELWINRECT, szTemp); ! 646: ! 647: if (dwStyle & WS_POPUP) ! 648: wsprintf (szTemp, "%08lX: WS_POPUP", dwStyle); ! 649: else if (dwStyle & WS_CHILD) ! 650: wsprintf (szTemp, "%08lX: WS_CHILD, ID: %lX", dwStyle, ! 651: GetWindowLong(hwnd, GWL_ID)); ! 652: else if (dwStyle & WS_ICONIC) ! 653: wsprintf (szTemp, "%08lX: WS_ICONIC", dwStyle); ! 654: else ! 655: wsprintf (szTemp, "%08lX: WS_OVERLAPPED", dwStyle); ! 656: ! 657: SetDlgItemText(hDlg, DID_SELWINSTYLE, szTemp); ! 658: } ! 659: else ! 660: { ! 661: SetDlgItemText(hDlg, DID_SELWINWINDOW, "<Undefined>"); ! 662: SetDlgItemText(hDlg, DID_SELWINCLASS, "<Undefined>"); ! 663: SetDlgItemText(hDlg, DID_SELWINPARENT, "<Undefined>"); ! 664: SetDlgItemText(hDlg, DID_SELWINRECT, "<Undefined>"); ! 665: SetDlgItemText(hDlg, DID_SELWINSTYLE, "<Undefined>"); ! 666: } ! 667: } ! 668: ! 669: ! 670: ! 671: /*****************************************************************************\ ! 672: * SelectWindowEnableFields ! 673: * ! 674: * Enables/disables the different fields in the Select Window dialog ! 675: * based on whether the user wants to spy on all windows or individually ! 676: * select one. ! 677: * ! 678: * Arguments: ! 679: * HWND hwnd - Dialog window handle. ! 680: * BOOL fEnable - TRUE to enable the fields, FALSE to disable them. ! 681: * ! 682: * Returns: ! 683: * VOID ! 684: \*****************************************************************************/ ! 685: ! 686: PRIVATE VOID ! 687: SelectWindowEnableFields( ! 688: HWND hwnd, ! 689: BOOL fEnable ! 690: ) ! 691: { ! 692: EnableWindow(GetDlgItem(hwnd, DID_SELWINLIST), fEnable); ! 693: EnableWindow(GetDlgItem(hwnd, DID_SELWINWINDOW), fEnable); ! 694: EnableWindow(GetDlgItem(hwnd, DID_SELWINCLASS), fEnable); ! 695: EnableWindow(GetDlgItem(hwnd, DID_SELWINPARENT), fEnable); ! 696: EnableWindow(GetDlgItem(hwnd, DID_SELWINRECT), fEnable); ! 697: EnableWindow(GetDlgItem(hwnd, DID_SELWINSTYLE), fEnable); ! 698: } ! 699: ! 700: ! 701: ! 702: /*****************************************************************************\ ! 703: * OutputDlgProc ! 704: * ! 705: * Dialog proc for the Output dialog. ! 706: * ! 707: * Arguments: ! 708: * HWND hwnd - handle to the output dialog ! 709: * UINT msg - message sent to output dialog ! 710: * WPARAM wParam - message parameter. ! 711: * LPARAM lParam - message parameter. ! 712: * ! 713: * Returns: ! 714: * The value that the dialog proc should return, based on the processing ! 715: * of the specific WM_COMMAND message received. ! 716: * ! 717: \*****************************************************************************/ ! 718: ! 719: BOOL CALLBACK ! 720: OutputDlgProc( ! 721: HWND hwnd, ! 722: UINT msg, ! 723: WPARAM wParam, ! 724: LPARAM lParam ! 725: ) ! 726: { ! 727: switch (msg) ! 728: { ! 729: case WM_INITDIALOG: ! 730: CheckDlgButton(hwnd, DID_OUTPUTWINDOW, gfOutputWin); ! 731: CheckDlgButton(hwnd, DID_OUTPUTCOM1, gfOutputCom1); ! 732: CheckDlgButton(hwnd, DID_OUTPUTFILE, gfOutputFile); ! 733: ! 734: SetDlgItemText(hwnd, DID_OUTPUTFILENAME, gszFile); ! 735: SetDlgItemInt(hwnd, DID_OUTPUTLINES, gnLines, FALSE); ! 736: ! 737: return TRUE; ! 738: ! 739: case WM_COMMAND: ! 740: return OutputCommand(hwnd, LOWORD(wParam), HIWORD(wParam)); ! 741: } ! 742: ! 743: return FALSE; ! 744: } ! 745: ! 746: ! 747: ! 748: /*****************************************************************************\ ! 749: * OutputCommand ! 750: * ! 751: * Handles the WM_COMMAND messages for the Output dialog. ! 752: * ! 753: * Arguments: ! 754: * HWND hwnd - Window handle of the dialog. ! 755: * INT nCmd - Command value. ! 756: * INT nNotifyCode - The notify code. ! 757: * ! 758: * Returns: ! 759: * The value that the dialog proc should return, based on the processing ! 760: * of the specific WM_COMMAND message received. ! 761: * ! 762: \*****************************************************************************/ ! 763: ! 764: PRIVATE BOOL ! 765: OutputCommand( ! 766: HWND hwnd, ! 767: INT nCmd, ! 768: INT nNotifyCode ! 769: ) ! 770: { ! 771: HFILE fh; ! 772: INT i; ! 773: CHAR szTemp[MAXSTRING]; ! 774: ! 775: switch (nCmd) ! 776: { ! 777: case IDOK: ! 778: i = GetDlgItemInt(hwnd, DID_OUTPUTLINES, &i, FALSE); ! 779: if (i != gnLines) ! 780: { ! 781: if ( i > 0 && i <= LINES_MAX) ! 782: { ! 783: gnLines = i; ! 784: MyCreatePrintfWin(ghwndSpyApp); ! 785: } ! 786: else ! 787: { ! 788: Message(MB_OK | MB_ICONEXCLAMATION, ! 789: "Window lines should be between 1-%d", LINES_MAX); ! 790: SetFocus(GetDlgItem(hwnd, DID_OUTPUTLINES)); ! 791: break; ! 792: } ! 793: } ! 794: ! 795: gfOutputWin = IsDlgButtonChecked(hwnd, DID_OUTPUTWINDOW); ! 796: gfOutputCom1 = IsDlgButtonChecked(hwnd, DID_OUTPUTCOM1); ! 797: gfOutputFile = IsDlgButtonChecked(hwnd, DID_OUTPUTFILE); ! 798: ! 799: if (gfOutputFile) ! 800: { ! 801: GetDlgItemText(hwnd, DID_OUTPUTFILENAME, szTemp, MAXSTRING); ! 802: //BUGBUG verify that they entered a filename! ! 803: if (lstrcmp(gszFile, szTemp)) /* Not Equal */ ! 804: { ! 805: fh = _lcreat(szTemp, 0); ! 806: if (fh == (HFILE)(-1)) ! 807: { ! 808: if (Message(MB_OKCANCEL | MB_ICONEXCLAMATION, ! 809: "Cannot open %s", szTemp) == IDCANCEL) ! 810: { ! 811: EndDialog(hwnd, FALSE); ! 812: } ! 813: ! 814: return TRUE; ! 815: } ! 816: ! 817: lstrcpy(gszFile, szTemp); ! 818: if (gfhFile) ! 819: _lclose(gfhFile); ! 820: gfhFile = fh; ! 821: } ! 822: } ! 823: else ! 824: { ! 825: if (gfhFile) ! 826: { ! 827: _lclose(gfhFile); ! 828: gfhFile = 0; ! 829: } ! 830: } ! 831: ! 832: EndDialog(hwnd, TRUE); ! 833: return TRUE; ! 834: ! 835: case IDCANCEL: ! 836: EndDialog(hwnd, FALSE); ! 837: return TRUE; ! 838: } ! 839: ! 840: return FALSE; ! 841: } ! 842: ! 843: ! 844: ! 845: /*****************************************************************************\ ! 846: * SelectFont ! 847: * ! 848: * Allows the user to select a new font for the display. ! 849: * ! 850: * Arguments: ! 851: * none ! 852: * ! 853: * Returns: ! 854: * VOID ! 855: \*****************************************************************************/ ! 856: ! 857: VOID ! 858: SelectFont( ! 859: VOID ! 860: ) ! 861: { ! 862: CHOOSEFONT cf; ! 863: LOGFONT lf; ! 864: HFONT hfontNew; ! 865: ! 866: GetObject(ghfontPrintf, sizeof(LOGFONT), (LPVOID)&lf); ! 867: ! 868: cf.lStructSize = sizeof(cf); ! 869: cf.hwndOwner = ghwndSpyApp; ! 870: cf.hDC = NULL; ! 871: cf.lpLogFont = &lf; ! 872: cf.iPointSize = 0; ! 873: cf.Flags = CF_ANSIONLY | CF_FORCEFONTEXIST | CF_INITTOLOGFONTSTRUCT ! 874: | CF_SCREENFONTS; ! 875: cf.rgbColors = 0; ! 876: cf.lCustData = 0; ! 877: cf.lpfnHook = NULL; ! 878: cf.lpTemplateName = NULL; ! 879: cf.hInstance = NULL; ! 880: cf.lpszStyle = NULL; ! 881: cf.nFontType = 0; ! 882: cf.nSizeMin = 0; ! 883: cf.nSizeMax = 0; ! 884: ! 885: if (ChooseFont(&cf)) ! 886: { ! 887: if (hfontNew = CreateFontIndirect(&lf)) ! 888: { ! 889: SetPrintfFont(ghwndPrintf, hfontNew); ! 890: ghfontPrintf = hfontNew; ! 891: } ! 892: } ! 893: } ! 894: ! 895: ! 896: ! 897: /*****************************************************************************\ ! 898: * MessagesDlgProc ! 899: * ! 900: * Dialog proc for the Messages dialog. This dialog allows the user ! 901: * to select which messages they want to spy on. ! 902: * ! 903: * Arguments: ! 904: * HWND hwnd - handle to the dialog window. ! 905: * UINT msg - message to the window ! 906: * WPARAM wParam - message parameter ! 907: * LPARAM lParam - message parameter ! 908: * ! 909: * Returns: ! 910: * The value that the dialog proc should return, based on the processing ! 911: * of the specific WM_COMMAND message received. ! 912: \*****************************************************************************/ ! 913: ! 914: BOOL CALLBACK ! 915: MessagesDlgProc( ! 916: HWND hwnd, ! 917: UINT msg, ! 918: WPARAM wParam, ! 919: LPARAM lParam ! 920: ) ! 921: { ! 922: switch (msg) ! 923: { ! 924: case WM_INITDIALOG: ! 925: MessagesInit(hwnd); ! 926: return TRUE; ! 927: ! 928: case WM_COMMAND: ! 929: return MessagesCommand(hwnd, LOWORD(wParam), HIWORD(wParam)); ! 930: } ! 931: ! 932: return FALSE; ! 933: } ! 934: ! 935: ! 936: ! 937: /*****************************************************************************\ ! 938: * MessagesInit ! 939: * ! 940: * Initializes the messages dialog. ! 941: * ! 942: * Arguments: ! 943: * HWND hwnd - Dialog window handle. ! 944: * ! 945: * Returns: ! 946: * VOID ! 947: \*****************************************************************************/ ! 948: ! 949: PRIVATE VOID ! 950: MessagesInit( ! 951: HWND hwnd ! 952: ) ! 953: { ! 954: HWND hwndList; ! 955: INT i; ! 956: INT j; ! 957: INT iSel; ! 958: PMSGDESC pmd; ! 959: ! 960: for (j = 0; j < gcMsgGroups; j++) ! 961: gaMsgGroup[j].cUseCount = 0; ! 962: ! 963: hwndList = GetDlgItem(hwnd, DID_MSGSLIST); ! 964: ! 965: for (i = 0, pmd = gaMsgs; i < gcMessages; i++, pmd++) ! 966: { ! 967: iSel = (INT)SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)pmd->pszMsg); ! 968: SendMessage(hwndList, LB_SETITEMDATA, iSel, (LPARAM)pmd); ! 969: ! 970: if (pmd->Flags & MTF_SELECTED) ! 971: { ! 972: SendMessage(hwndList, LB_SETSEL, TRUE, iSel); ! 973: ! 974: for (j = 0; j < gcMsgGroups; j++) ! 975: { ! 976: if (gaMsgGroup[j].flMask & pmd->Flags) ! 977: gaMsgGroup[j].cUseCount++; ! 978: } ! 979: } ! 980: } ! 981: ! 982: // ! 983: // Set the selection rectangle to the first item in the listbox. ! 984: // ! 985: SendMessage(hwndList, LB_SETCARETINDEX, 0, FALSE); ! 986: ! 987: // ! 988: // Loop through all the message groups. ! 989: // ! 990: for (j = 0; j < gcMsgGroups; j++) ! 991: { ! 992: // ! 993: // Is at least one message in the group selected? ! 994: // ! 995: if (gaMsgGroup[j].cUseCount) ! 996: { ! 997: // ! 998: // Check the corresponding checkbox. If all messages ! 999: // in the group are selected, the checkbox is checked. ! 1000: // If only some are selected, the checkbox is set to ! 1001: // grayed (3-state). ! 1002: // ! 1003: CheckDlgButton(hwnd, gaMsgGroup[j].idCheckBox, ! 1004: (gaMsgGroup[j].cUseCount == gaMsgGroup[j].cMsgs) ? 1 : 2); ! 1005: } ! 1006: } ! 1007: ! 1008: if (gfMsgsUser) ! 1009: CheckDlgButton(hwnd, DID_MSGSUSER, 1); ! 1010: ! 1011: if (gfMsgsUnknown) ! 1012: CheckDlgButton(hwnd, DID_MSGSUNKNOWN, 1); ! 1013: ! 1014: gcItemsSave = SendMessage(hwndList, LB_GETSELITEMS, ! 1015: gcMessages, (LPARAM)gaiSelected); ! 1016: } ! 1017: ! 1018: ! 1019: ! 1020: /*****************************************************************************\ ! 1021: * MessagesCommand ! 1022: * ! 1023: * Handles the WM_COMMAND messages for the Messages dialog. ! 1024: * ! 1025: * Arguments: ! 1026: * HWND hwnd - Window handle of the dialog. ! 1027: * INT nCmd - Command value. ! 1028: * INT nNotifyCode - The notify code. ! 1029: * ! 1030: * Returns: ! 1031: * The value that the dialog proc should return, based on the processing ! 1032: * of the specific WM_COMMAND message received. ! 1033: * ! 1034: \*****************************************************************************/ ! 1035: ! 1036: PRIVATE BOOL ! 1037: MessagesCommand( ! 1038: HWND hwnd, ! 1039: INT nCmd, ! 1040: INT nNotifyCode ! 1041: ) ! 1042: { ! 1043: INT i; ! 1044: INT j; ! 1045: PMSGGROUP pmg; ! 1046: PMSGDESC pmd; ! 1047: BOOL fChecked; ! 1048: HWND hwndList; ! 1049: INT cItems; ! 1050: BOOL fSel; ! 1051: INT iSel; ! 1052: INT cSelItemsMax; ! 1053: INT iTopIndex; ! 1054: ! 1055: switch (nCmd) ! 1056: { ! 1057: case DID_MSGSLIST: ! 1058: if (nNotifyCode == LBN_SELCHANGE) ! 1059: { ! 1060: hwndList = GetDlgItem(hwnd, DID_MSGSLIST); ! 1061: cItems = SendMessage(hwndList, LB_GETSELITEMS, ! 1062: gcMessages, (LPARAM)gaiSelected2); ! 1063: if (cItems == gcItemsSave) ! 1064: { ! 1065: // ! 1066: // Nothing changed except for the selection ! 1067: // rectangle moving. We are done. ! 1068: // ! 1069: break; ! 1070: } ! 1071: ! 1072: if (cItems > gcItemsSave) ! 1073: { ! 1074: // ! 1075: // A message was selected. Look for it. ! 1076: // ! 1077: for (i = 0; i < gcItemsSave && ! 1078: gaiSelected[i] == gaiSelected2[i]; i++) ! 1079: ; ! 1080: ! 1081: iSel = gaiSelected2[i]; ! 1082: fSel = TRUE; ! 1083: } ! 1084: else ! 1085: { ! 1086: // ! 1087: // A message was unselected. Look for it. ! 1088: // ! 1089: for (i = 0; i < cItems && ! 1090: gaiSelected[i] == gaiSelected2[i]; i++) ! 1091: ; ! 1092: ! 1093: iSel = gaiSelected[i]; ! 1094: fSel = FALSE; ! 1095: } ! 1096: ! 1097: // ! 1098: // Get the currently selected item. It was either ! 1099: // just turned on or off. ! 1100: // ! 1101: pmd = (PMSGDESC)SendMessage(hwndList, LB_GETITEMDATA, iSel, 0); ! 1102: ! 1103: // ! 1104: // Loop through the message groups and update the use ! 1105: // counts for all groups that contain this message. ! 1106: // ! 1107: for (i = 0; i < gcMsgGroups; i++) ! 1108: { ! 1109: if (pmd->Flags & gaMsgGroup[i].flMask) ! 1110: { ! 1111: gaMsgGroup[i].cUseCount += fSel ? 1 : -1; ! 1112: } ! 1113: } ! 1114: ! 1115: // ! 1116: // Be sure that the checkboxes reflect the updated ! 1117: // status of the message group use counts. ! 1118: // ! 1119: MessagesUpdateCheckBoxes(hwnd); ! 1120: ! 1121: // ! 1122: // Save away the new selected item array. ! 1123: // ! 1124: cSelItemsMax = max(cItems, gcItemsSave); ! 1125: for (i = 0; i < cSelItemsMax; i++) ! 1126: { ! 1127: gaiSelected[i] = gaiSelected2[i]; ! 1128: } ! 1129: ! 1130: gcItemsSave = cItems; ! 1131: } ! 1132: ! 1133: break; ! 1134: ! 1135: case DID_MSGSALL: ! 1136: hwndList = GetDlgItem(hwnd, DID_MSGSLIST); ! 1137: SendMessage(hwndList, LB_SETSEL, TRUE, (LPARAM)-1); ! 1138: ! 1139: for (i = 0; i < gcMsgGroups; i++) ! 1140: { ! 1141: gaMsgGroup[i].cUseCount = gaMsgGroup[i].cMsgs; ! 1142: CheckDlgButton(hwnd, gaMsgGroup[i].idCheckBox, 1); ! 1143: } ! 1144: ! 1145: gcItemsSave = SendMessage(hwndList, LB_GETSELITEMS, gcMessages, ! 1146: (LPARAM)gaiSelected); ! 1147: ! 1148: CheckDlgButton(hwnd, DID_MSGSUSER, 1); ! 1149: CheckDlgButton(hwnd, DID_MSGSUNKNOWN, 1); ! 1150: ! 1151: break; ! 1152: ! 1153: case DID_MSGSNONE: ! 1154: hwndList = GetDlgItem(hwnd, DID_MSGSLIST); ! 1155: SendMessage(hwndList, LB_SETSEL, FALSE, (LPARAM)-1); ! 1156: ! 1157: for (i = 0; i < gcMsgGroups; i++) ! 1158: { ! 1159: gaMsgGroup[i].cUseCount = 0; ! 1160: CheckDlgButton(hwnd, gaMsgGroup[i].idCheckBox, 0); ! 1161: } ! 1162: ! 1163: gcItemsSave = 0; ! 1164: ! 1165: CheckDlgButton(hwnd, DID_MSGSUSER, 0); ! 1166: CheckDlgButton(hwnd, DID_MSGSUNKNOWN, 0); ! 1167: ! 1168: break; ! 1169: ! 1170: case DID_MSGSDDE: ! 1171: case DID_MSGSCLIP: ! 1172: case DID_MSGSMOUSE: ! 1173: case DID_MSGSNC: ! 1174: case DID_MSGSKEYBD: ! 1175: case DID_MSGSBM: ! 1176: case DID_MSGSCB: ! 1177: case DID_MSGSEM: ! 1178: case DID_MSGSLB: ! 1179: case DID_MSGSSTM: ! 1180: for (i = 0; i < gcMsgGroups; i++) ! 1181: { ! 1182: if (gaMsgGroup[i].idCheckBox == nCmd) ! 1183: { ! 1184: pmg = &gaMsgGroup[i]; ! 1185: break; ! 1186: } ! 1187: } ! 1188: ! 1189: fChecked = IsDlgButtonChecked(hwnd, pmg->idCheckBox); ! 1190: if (fChecked == 1) ! 1191: fChecked = FALSE; ! 1192: else ! 1193: fChecked = TRUE; ! 1194: ! 1195: hwndList = GetDlgItem(hwnd, DID_MSGSLIST); ! 1196: ! 1197: if (fChecked) ! 1198: { ! 1199: SendMessage(hwndList, WM_SETREDRAW, FALSE, 0); ! 1200: iTopIndex = SendMessage(hwndList, LB_GETTOPINDEX, 0, 0); ! 1201: } ! 1202: ! 1203: // ! 1204: // Get the list of currently selected items. ! 1205: // ! 1206: cItems = SendMessage(hwndList, LB_GETSELITEMS, ! 1207: gcMessages, (LPARAM)gaiSelected); ! 1208: ! 1209: // ! 1210: // Look for all the messages in this group. ! 1211: // ! 1212: for (i = 0, iSel = 0; i < gcMessages; i++) ! 1213: { ! 1214: pmd = (PMSGDESC)SendMessage(hwndList, LB_GETITEMDATA, i, 0); ! 1215: if (pmd->Flags & pmg->flMask) ! 1216: { ! 1217: // ! 1218: // Bump up through the list of selected items, looking ! 1219: // to see if this item is currently selected. ! 1220: // ! 1221: for (fSel = FALSE; iSel < cItems && ! 1222: gaiSelected[iSel] <= i; iSel++) ! 1223: { ! 1224: // ! 1225: // A match was found. The item is selected. ! 1226: // ! 1227: if(gaiSelected[iSel] == i) ! 1228: { ! 1229: fSel = TRUE; ! 1230: break; ! 1231: } ! 1232: } ! 1233: ! 1234: // ! 1235: // Is the current selection state of the item ! 1236: // different from the desired selection state? ! 1237: // ! 1238: if (fSel != fChecked) ! 1239: { ! 1240: // ! 1241: // Update the use counts of all groups that contain ! 1242: // this message. ! 1243: // ! 1244: for (j = 0; j < gcMsgGroups; j++) ! 1245: { ! 1246: if (pmd->Flags & gaMsgGroup[j].flMask) ! 1247: { ! 1248: gaMsgGroup[j].cUseCount += fChecked ? 1 : -1; ! 1249: } ! 1250: } ! 1251: ! 1252: // ! 1253: // Select/deselect the message in the list box. ! 1254: // ! 1255: SendMessage(hwndList, LB_SETSEL, fChecked, i); ! 1256: } ! 1257: } ! 1258: } ! 1259: ! 1260: // ! 1261: // Be sure that the checkboxes reflect the updated ! 1262: // status of the message group use counts. ! 1263: // ! 1264: MessagesUpdateCheckBoxes(hwnd); ! 1265: ! 1266: if (fChecked) ! 1267: { ! 1268: SendMessage(hwndList, LB_SETTOPINDEX, iTopIndex, 0); ! 1269: SendMessage(hwndList, WM_SETREDRAW, TRUE, 0); ! 1270: InvalidateRect(hwndList, NULL, FALSE); ! 1271: } ! 1272: ! 1273: gcItemsSave = SendMessage(hwndList, LB_GETSELITEMS, ! 1274: gcMessages, (LPARAM)gaiSelected); ! 1275: ! 1276: break; ! 1277: ! 1278: case IDOK: ! 1279: hwndList = GetDlgItem(hwnd, DID_MSGSLIST); ! 1280: cItems = SendMessage(hwndList, LB_GETSELITEMS, ! 1281: gcMessages, (LPARAM)gaiSelected); ! 1282: ! 1283: // ! 1284: // Unselect all messages. ! 1285: // ! 1286: for (i = 0; i < gcMessages; i++) ! 1287: gaMsgs[i].Flags &= ~MTF_SELECTED; ! 1288: ! 1289: // ! 1290: // Mark all the messages that are selected. ! 1291: // ! 1292: for (i = 0; i < cItems; i++) ! 1293: { ! 1294: pmd = (PMSGDESC)SendMessage(hwndList, LB_GETITEMDATA, ! 1295: gaiSelected[i], 0); ! 1296: pmd->Flags |= MTF_SELECTED; ! 1297: } ! 1298: ! 1299: if (IsDlgButtonChecked(hwnd, DID_MSGSUSER)) ! 1300: gfMsgsUser = TRUE; ! 1301: else ! 1302: gfMsgsUser = FALSE; ! 1303: ! 1304: if (IsDlgButtonChecked(hwnd, DID_MSGSUNKNOWN)) ! 1305: gfMsgsUnknown = TRUE; ! 1306: else ! 1307: gfMsgsUnknown = FALSE; ! 1308: ! 1309: #if 0 //Debug code! ! 1310: for (i = 0; i < gcMsgGroups; i++) ! 1311: { ! 1312: iSel = 0; ! 1313: for (j = 0; j < cItems; j++) ! 1314: { ! 1315: pmd = (PMSGDESC)SendMessage(hwndList, LB_GETITEMDATA, ! 1316: gaiSelected[j], 0); ! 1317: if (pmd->Flags & gaMsgGroup[i].flMask) ! 1318: iSel++; ! 1319: } ! 1320: ! 1321: if (iSel != gaMsgGroup[i].cUseCount) ! 1322: { ! 1323: DbgPrintf("Use counts are wrong!!!"); ! 1324: for (j = 0; j < gcMsgGroups; j++) ! 1325: { ! 1326: DbgPrintf("cMsgs:%d Use:%d", gaMsgGroup[j].cMsgs, gaMsgGroup[j].cUseCount); ! 1327: } ! 1328: } ! 1329: } ! 1330: #endif // end debug code ! 1331: ! 1332: EndDialog(hwnd, IDOK); ! 1333: return TRUE; ! 1334: ! 1335: case IDCANCEL: ! 1336: EndDialog(hwnd, IDCANCEL); ! 1337: return TRUE; ! 1338: } ! 1339: ! 1340: return FALSE; ! 1341: } ! 1342: ! 1343: ! 1344: ! 1345: /*****************************************************************************\ ! 1346: * MessagesUpdateCheckBoxes ! 1347: * ! 1348: * Updates the message group checkboxes in the Messages dialog. ! 1349: * This routine should be called when the use counts in the ! 1350: * message group table are changed, so that the state of the ! 1351: * checkboxes will get updated also. ! 1352: * ! 1353: * Arguments: ! 1354: * HWND hwnd - Dialog window handle. ! 1355: * ! 1356: * Returns: ! 1357: * VOID ! 1358: \*****************************************************************************/ ! 1359: ! 1360: PRIVATE VOID ! 1361: MessagesUpdateCheckBoxes( ! 1362: HWND hwnd ! 1363: ) ! 1364: { ! 1365: INT i; ! 1366: INT fState; ! 1367: ! 1368: for (i = 0; i < gcMsgGroups; i++) ! 1369: { ! 1370: if (gaMsgGroup[i].cUseCount == gaMsgGroup[i].cMsgs) ! 1371: fState = 1; ! 1372: else if (gaMsgGroup[i].cUseCount == 0) ! 1373: fState = 0; ! 1374: else ! 1375: fState = 2; ! 1376: ! 1377: CheckDlgButton(hwnd, gaMsgGroup[i].idCheckBox, fState); ! 1378: } ! 1379: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.