home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 May / Pcwk5b98.iso / Borland / Cplus45 / BC45 / PEEPER.PAK / PEEPER.CPP < prev    next >
C/C++ Source or Header  |  1995-08-29  |  9KB  |  324 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows - (C) Copyright 1991, 1993 by Borland International
  3. //----------------------------------------------------------------------------
  4. #include <owl\owlpch.h>
  5. #include <owl\applicat.h>
  6. #include <owl\dc.h>
  7. #include <owl\dialog.h>
  8. #include <owl\framewin.h>
  9. #include <owl\listbox.h>
  10. #include <owl\statusba.h>
  11. #include <owl\controlb.h>
  12. #include <owl\buttonga.h>
  13. #include <owl\static.h>
  14. #include <owl\decframe.h>
  15. #include <owl\inputdia.h>
  16. #include <owl\checkbox.h>
  17. #include <cstring.h>
  18. #include "peeper.h"
  19.  
  20. //
  21. // ListBox id.
  22. //
  23. static const WORD ID_LISTBOX =            1000;
  24.  
  25. //
  26. // Variables that represent Windows' macros.
  27. //
  28. static WORD MAXIMIZE_MSG =                SC_MAXIMIZE;
  29. static WORD MINIMIZE_MSG =                SC_MINIMIZE;
  30. static WORD PAINT_MSG =                   WM_PAINT;
  31. static WORD RESTORE_MSG =                 SC_RESTORE;
  32. static WORD PASTE_MSG =                   WM_PASTE;
  33. static WORD CLOSE_MSG =                   WM_CLOSE;
  34.  
  35. //
  36. // TClientWindow response table.
  37. //
  38. DEFINE_RESPONSE_TABLE1(TClientWindow, TWindow)
  39.   EV_WM_LBUTTONDOWN,
  40.   EV_WM_RBUTTONDOWN,
  41.   EV_LBN_SELCHANGE(ID_LISTBOX, DisplayWinInfo),
  42. END_RESPONSE_TABLE;
  43.  
  44. //
  45. // TPeeper Response table
  46. //
  47. DEFINE_RESPONSE_TABLE1(TPeeper, TApplication)
  48.   EV_COMMAND(CM_PEEPING, CmPeeping),
  49.   EV_COMMAND(CM_CHANGE_CAPTION, CmChangeCaption),
  50.   EV_COMMAND(CM_CLEAR_WINDOWLIST, CmClearWindowList),
  51.   EV_COMMAND(CM_SEND_MESSAGE, CmSendMessage),
  52.   EV_COMMAND(CM_HELP, CmHelp),
  53. END_RESPONSE_TABLE;
  54.  
  55.  
  56. //
  57. // Global functions, used with ForEach().
  58. //
  59. void SendWMSetText(HWND& hWnd, void* p)
  60. {
  61.   ::SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)(LPCSTR)p);
  62. }
  63.  
  64. void SendSysMessage(HWND& hWnd, void* p)
  65. {
  66.   ::SendMessage(hWnd, WM_SYSCOMMAND, *(WORD*)p, 0);
  67. }
  68.  
  69. void SendWMMessage(HWND& hWnd, void* p)
  70. {
  71.   ::SendMessage(hWnd, *(WORD*)p, 0, 0);
  72. }
  73.  
  74. //////////////////////////////////////////////////////////////////////
  75.  
  76. //
  77. // TPeeper member functions.
  78. //
  79.  
  80. void
  81. TPeeper::InitMainWindow()
  82. {
  83.   Client = new TClientWindow;
  84.  
  85.   // Create frame.  Make it look like a dialog.  Enable menu tracking
  86.   // for hints.
  87.   //
  88.   TDecoratedFrame* frame = new TDecoratedFrame(0, "Peeper", Client, TRUE);
  89.   frame->Attr.Style &= ~(WS_MAXIMIZEBOX | WS_THICKFRAME);
  90.   frame->Attr.W = 324;
  91.   frame->Attr.H = 225;
  92.   frame->SetIcon(this, IDI_PEEPER);
  93.  
  94.   // Construct, build and insert a control bar into the frame
  95.   //
  96.   Actions = new TControlBar(frame);
  97.   Actions->Insert(*new TButtonGadget(IDB_EXIT, CM_EXIT));
  98.   Actions->Insert(*new TSeparatorGadget);
  99.   Actions->Insert(*new TButtonGadget(IDB_PEEPING, CM_PEEPING));
  100.   Actions->Insert(*new TButtonGadget(IDB_CLEAR_WINDOWLIST, CM_CLEAR_WINDOWLIST));
  101.   Actions->Insert(*new TSeparatorGadget);
  102.   Actions->Insert(*new TButtonGadget(IDB_CHANGE_CAPTION, CM_CHANGE_CAPTION));
  103.   Actions->Insert(*new TButtonGadget(IDB_MESSAGES, CM_SEND_MESSAGE));
  104.   Actions->Insert(*new TSeparatorGadget);
  105.   Actions->Insert(*new TButtonGadget(IDB_HELP, CM_HELP));
  106.   Actions->SetHintMode(TGadgetWindow::EnterHints);
  107.   frame->Insert(*Actions, TDecoratedFrame::Top);
  108.  
  109.   // Insert message bar into frame. Add some margins since our window has a
  110.   // thin frame & the message bar edges tend to get lost.
  111.   //
  112.   StatusLine = new TMessageBar(0);
  113.   StatusLine->SetText("Command Mode");
  114.  
  115.   TMargins margins;
  116.   margins.Units = TMargins::Pixels;
  117.   margins.Left = 2;
  118.   margins.Right = 2;
  119.   margins.Top = 1;
  120.   margins.Bottom = 1;
  121.   StatusLine->SetMargins(margins);
  122.   frame->Insert(*StatusLine, TDecoratedFrame::Bottom);
  123.  
  124.   // Create list box and it's title.
  125.   //
  126.   SelectedWindows = new TListBox(Client, ID_LISTBOX, 6, 28, 300, 106);
  127.   SelWinText = new TStatic(Client, -1, "SelectedWindows", 6, 4, 125, 16, 20);
  128.  
  129.   MainWindow = frame;
  130.  
  131.   // Create window list vector.
  132.   //
  133.   WindowList = new TCVectorImp<HWND>(20, 2);
  134. }
  135.  
  136. //
  137. // CmPeeping(). Set status line to 'Peeping!' and capture mouse.
  138. //
  139. void
  140. TPeeper::CmPeeping()
  141. {
  142.   SetCapture(Client->HWindow);
  143.   Actions->SetHintCommand(-1);
  144.   StatusLine->SetText("Peeping Mode. Right-click to end.");
  145. }
  146.  
  147. //
  148. // CmChangeCaption(). Prompt user for string.  Change caption of all windows
  149. // in list to string entered by user.
  150. //
  151. void
  152. TPeeper::CmChangeCaption()
  153. {
  154.   char           buffer[81];
  155.  
  156.   if (WindowList->Count()) {
  157.     buffer[0] = 0;
  158.     TInputDialog   input(Client, "Enter Text", "Text:", buffer, 80);
  159.  
  160.     if (input.Execute() == IDOK)
  161.        WindowList->ForEach(SendWMSetText, buffer);
  162.   } else
  163.     MainWindow->MessageBox("Must choose some windows first", "Error");
  164. }
  165.  
  166. //
  167. // CmClearWindowList(). Clear list box that contains the captions of the
  168. // selected windows.  Also, empty window list.
  169. //
  170. void
  171. TPeeper::CmClearWindowList()
  172. {
  173.   WindowList->Flush();
  174.   SelectedWindows->ClearList();
  175. }
  176.  
  177. //
  178. // CmSendMessage(). Send messages selected by user to all windows in window
  179. // list.
  180. //
  181. void
  182. TPeeper::CmSendMessage()
  183. {
  184.   if (WindowList->Count()) {
  185.     MessagesTB        mtb;      // transfer buffer.
  186.     TMessagesDialog   *messages = new TMessagesDialog(MainWindow, &mtb);
  187.  
  188.     if (messages->Execute() == IDOK) {
  189.       if (mtb.MaxCB)
  190.         WindowList->ForEach(SendSysMessage, &MAXIMIZE_MSG);
  191.       if (mtb.MinCB)
  192.         WindowList->ForEach(SendSysMessage, &MINIMIZE_MSG);
  193.       if (mtb.PaintCB)
  194.         WindowList->ForEach(SendWMMessage, &PAINT_MSG);
  195.       if (mtb.RestoreCB)
  196.         WindowList->ForEach(SendSysMessage, &RESTORE_MSG);
  197.       if (mtb.PasteCB)
  198.         WindowList->ForEach(SendWMMessage, &PASTE_MSG);
  199.       if (mtb.CloseCB) {
  200.         WindowList->ForEach(SendWMMessage, &CLOSE_MSG);
  201.         CmClearWindowList();
  202.       }
  203.     }
  204.   }
  205.   else
  206.     MainWindow->MessageBox("Must choose some windows first", "Error");
  207. }
  208.  
  209. //
  210. // CmHelp(). Display help message box.
  211. //
  212. void
  213. TPeeper::CmHelp()
  214. {
  215.   string  msg;
  216.  
  217.   msg += "Press 'Peep!' button to select windows.\n";
  218.   msg += "While peeping press left mouse button to select window under cursor.\n";
  219.   msg += "When finished peeping press right mouse button to return to command mode.\n";
  220.   MainWindow->MessageBox(msg.c_str(), "Help");
  221. }
  222.  
  223. //////////////////////////////////////////////////////////////////////
  224.  
  225. //
  226. // TClientWindow member functions.
  227. //
  228.  
  229. //
  230. // EvLButtonDown(). Used while peeping. Get caption and handle of window under
  231. // mouse and save.
  232. //
  233. void
  234. TClientWindow::EvLButtonDown(UINT, TPoint &point)
  235. {
  236.   TPoint     p = point;
  237.   HWND       chosenWindow;
  238.   char       caption[128];
  239.   TRect      r;
  240.   TPeeper*   peeper = TYPESAFE_DOWNCAST(GetApplication(),TPeeper);
  241.  
  242.   ::ClientToScreen(HWindow, &p);
  243.   ::GetWindowRect(peeper->MainWindow->HWindow, &r);
  244.  
  245.   if (!r.Contains(p)) {
  246.     chosenWindow = ::WindowFromPoint(p);
  247.     peeper->WindowList->Add(chosenWindow);
  248.     if (!::GetWindowText(chosenWindow, caption, sizeof caption))
  249.        peeper->SelectedWindows->AddString("No caption");
  250.     else
  251.        peeper->SelectedWindows->AddString(caption);
  252.   }
  253. }
  254.  
  255. //
  256. // EvRButtonDown(). Stop peeping. Set status line to 'Command Mode' and
  257. // release mouse capture.
  258. //
  259. void
  260. TClientWindow::EvRButtonDown( UINT, TPoint & )
  261. {
  262.   TPeeper*   peeper = TYPESAFE_DOWNCAST(GetApplication(),TPeeper);
  263.  
  264.   peeper->Actions->SetHintCommand(-1);
  265.   peeper->StatusLine->SetText("Command Mode.");
  266.   ReleaseCapture();
  267. }
  268.  
  269. //
  270. // DisplayWinInfo().  Display the following information in a message box when
  271. // item from list box is selected:
  272. //  * Window Class.
  273. //  * demensions of window (left, top, right, bottom).
  274. //  * does the window have a menu?
  275. //  * does the window have children?
  276. //
  277. void
  278. TClientWindow::DisplayWinInfo()
  279. {
  280.   string   infoText;
  281.   char     className[80];
  282.   TRect    winRect;
  283.   HWND     hWnd;
  284.   int      haveMenu;
  285.   int      haveChildren;
  286.   char     buf[80];
  287.   string   comma(", ");
  288.   string   yes("Yes");
  289.   string   no("No");
  290.   string   newLine("\n");
  291.   TPeeper* peeper = TYPESAFE_DOWNCAST(GetApplication(),TPeeper);
  292.  
  293.   hWnd = (*peeper->WindowList)[peeper->SelectedWindows->GetSelIndex()];
  294.  
  295.   ::GetClassName(hWnd, className, 80);
  296.   ::GetWindowRect(hWnd, &winRect);
  297.   haveMenu = ::GetMenu(hWnd) != 0;
  298.   haveChildren = ::GetTopWindow(hWnd) != 0;
  299.  
  300.   infoText += "Window Class: " + string(className) + newLine;
  301.   infoText += "Window Dimensions: ";
  302.   infoText += string(itoa(winRect.left, buf, 10)) + comma +
  303.               string(itoa(winRect.top, buf, 10)) + comma +
  304.               string(itoa(winRect.right, buf, 10)) + comma +
  305.               string(itoa(winRect.bottom, buf, 10)) + newLine;
  306.   infoText += "Window has a menu? " + (haveMenu ? yes : no) + newLine;
  307.   infoText += "Window has Children? " + (haveChildren ? yes : no) + newLine;
  308.  
  309.   ::MessageBox(0, infoText.c_str(), "Window Info", MB_OK);
  310. }
  311.  
  312. //////////////////////////////////////////////////////////////////////
  313.  
  314. int OwlMain(int, char* [])
  315. {
  316. #if defined(__WIN32__)
  317.   if (!(HIWORD(GetVersion())&0x8000)) {
  318.     ::MessageBox(0,"This is not a WIN NT Example", "OWL Examples", MB_OK);
  319.     return 0;
  320.   }
  321. #endif
  322.   return TPeeper().Run();
  323. }
  324.