home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Programmierung / SOURCE.mdf / programm / windows / c / mobjm260 / mditool.cp_ / mditool.cp
Encoding:
Text File  |  1994-09-06  |  11.3 KB  |  460 lines

  1. //    Microworks ObjectMate  2.6
  2. //
  3. //    MDITOOL - MDI Toolbar Demonstration
  4. //
  5. //    Copyright 1992-94 Microworks Sydney, Australia.
  6. //
  7. //  MDITOOL.CPP
  8.  
  9. /* MDITool sets up a moveable tool bar in a MDI frame window. There are only two
  10.  * window styles that can be used with an SFX MDI frame window: MWS_3DFRAME or 
  11.  * MWS_SFXFRAME. MDITool uses the MWS_3DFRAME style and the new SFXChooseFont 
  12.  * function to display an SFX font common dialog box.
  13.  */
  14.  
  15. #define ID_TOOLBAR    100
  16. #define CM_POPUP      101
  17. #define CM_TOP        102
  18. #define CM_LEFT       103
  19. #define CM_RIGHT      104
  20. #define CM_BOTTOM     105
  21. #define CM_STATUS     106
  22. #define CM_EXITWINDOW 107
  23. #define CM_FONT       201
  24. #define CM_SHOW       202
  25. #define CM_ABOUT      203
  26. #define APPNAME       "MDITOOL"
  27.  
  28. #include <owl\owlpch.h>
  29. #include <sfx\sfx200.h>
  30. #include <sfx\smdi.h>
  31. #include <sfx\smchild.h>
  32. #include <sfx\stoolbar.h>
  33. #include <owl\choosefo.h>
  34.  
  35. TColor Color;
  36. TFont* Font;
  37.  
  38. //    TAboutDialog class
  39.  
  40. class TAboutDialog : public TDialog {
  41.   public:
  42.     TAboutDialog(TWindow*, TResId);
  43.     void SetupWindow();
  44.   DECLARE_RESPONSE_TABLE(TAboutDialog);
  45. };
  46.  
  47. DEFINE_RESPONSE_TABLE1(TAboutDialog, TDialog)
  48. END_RESPONSE_TABLE;
  49.  
  50. TAboutDialog::TAboutDialog(TWindow* parent, TResId resId)
  51.     :TDialog(parent, resId),
  52.      TWindow(parent)
  53. {
  54. }
  55.  
  56. void
  57. TAboutDialog::SetupWindow()
  58. {
  59.     TDialog::SetupWindow();
  60.     CenterWindow(Parent->HWindow, HWindow);
  61. }
  62.  
  63. //    TChildClient class
  64.  
  65. class TChildClient : public TWindow {
  66.   public:
  67.     TChildClient();
  68.     char far* GetClassName();
  69.     void      GetWindowClass(WNDCLASS&);
  70.     void      Paint(TDC& dc, BOOL erase, TRect& rect);
  71.   DECLARE_RESPONSE_TABLE(TChildClient);
  72. };
  73.  
  74. DEFINE_RESPONSE_TABLE1(TChildClient, TWindow)
  75. END_RESPONSE_TABLE;
  76.  
  77. TChildClient::TChildClient()
  78.   : TWindow(0, 0, 0)
  79. {
  80. }
  81.  
  82. char far*
  83. TChildClient::GetClassName()
  84. {
  85.     return "ChildClient";
  86. }
  87.  
  88. void  
  89. TChildClient::GetWindowClass(WNDCLASS& wndClass)
  90. {
  91.     TWindow::GetWindowClass(wndClass);
  92.     wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
  93.     wndClass.style |= CS_HREDRAW | CS_VREDRAW;
  94. }
  95.  
  96. void  
  97. TChildClient::Paint(TDC& dc, BOOL /*erase*/, TRect& /* rect*/)
  98. {
  99.     TRect rect = GetClientRect();
  100.     dc.FillRect(rect, TBrush(TColor::Black));
  101.     dc.SetBkMode(TRANSPARENT);
  102.     dc.SetTextColor(Color);
  103.     dc.SelectObject(*Font);
  104.     dc.DrawText("Borland C++ 4.0", -1, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  105.     dc.RestoreFont();
  106. }
  107.  
  108. //    TClient class
  109.  
  110. class TClient : public TMDIClient {
  111.   public:
  112.     TClient() : TMDIClient() { Attr.Style &= ~(WS_BORDER); }
  113.     TSFXMDIChild* InitChild();
  114.   DECLARE_RESPONSE_TABLE (TClient);
  115. };
  116.  
  117. DEFINE_RESPONSE_TABLE2(TClient, TMDIClient, TWindow)
  118. END_RESPONSE_TABLE;
  119.  
  120. TSFXMDIChild*
  121. TClient::InitChild()
  122. {
  123.     char childName[] = "MDI Child Window";
  124.  
  125.     /* FALSE sets the MWS_3DFRAME flag and TRUE sets the MWS_SFXCAPTION flag
  126.      */
  127.     return new TSFXMDIChild(*this, childName, new TChildClient(), FALSE, TRUE);
  128. }
  129.  
  130. //    TMDITool class
  131.  
  132. class TMDITool : public TSFXMDIFrame {
  133.   public:
  134.     int          OldToolbarPos, ToolbarPos;
  135.     TSFXToolbar* Toolbar;
  136.     TClient*     Client;
  137.     TChooseFontDialog::TData FontData;
  138.     TMDITool(const char far* title, TResId menuResId, TClient& clientWnd,
  139.              BOOL sfxFrame, BOOL sfxCaption);
  140.     ~TMDITool();
  141.     char far*    GetClassName();
  142.     void         SetupWindow();
  143.     void         EvInitMenuPopup(HMENU, UINT, BOOL);
  144.     void         EvSize(UINT, TSize&);
  145.     void         UpdateClientArea(int width, int height);
  146.     void         CmPopup();
  147.     void         CmTop();
  148.     void         CmLeft();
  149.     void         CmRight();
  150.     void         CmBottom();
  151.     void         CmStatus();
  152.     void         CmExitWindow();
  153.     void         CmFont();
  154.     void         CmShow();
  155.     void         CmAbout();
  156.   DECLARE_RESPONSE_TABLE(TMDITool);
  157. };
  158.  
  159. DEFINE_RESPONSE_TABLE3(TMDITool, TSFXMDIFrame, TMDIFrame, TFrameWindow)
  160.   EV_WM_INITMENUPOPUP,
  161.   EV_WM_SIZE,
  162.   EV_COMMAND(CM_POPUP, CmPopup),
  163.   EV_COMMAND(CM_TOP, CmTop),
  164.   EV_COMMAND(CM_LEFT, CmLeft),
  165.   EV_COMMAND(CM_RIGHT, CmRight),
  166.   EV_COMMAND(CM_BOTTOM, CmBottom),
  167.   EV_COMMAND(CM_STATUS, CmStatus),
  168.   EV_COMMAND(CM_EXITWINDOW, CmExitWindow),
  169.   EV_COMMAND(CM_FONT, CmFont),
  170.   EV_COMMAND(CM_SHOW, CmShow),
  171.   EV_COMMAND(CM_ABOUT, CmAbout),
  172. END_RESPONSE_TABLE;
  173.  
  174. TMDITool::TMDITool(const char far* title, TResId menuResId, TClient& clientWnd,
  175.                    BOOL sfxFrame, BOOL sfxCaption)
  176.    :TSFXMDIFrame(title, menuResId, clientWnd, sfxFrame, sfxCaption),
  177.     TMDIFrame(title, menuResId, clientWnd)
  178. {
  179.     Client = &clientWnd;
  180.     Toolbar = 0;
  181.     ToolbarPos = 0;
  182.  
  183.     //    Default LogFont data
  184.     FontData.LogFont.lfHeight = -35;
  185.     FontData.LogFont.lfWidth = 0;
  186.     FontData.LogFont.lfEscapement = 0;
  187.     FontData.LogFont.lfOrientation = 0;
  188.     FontData.LogFont.lfWeight = FW_BOLD;
  189.     FontData.LogFont.lfItalic = FALSE;
  190.     FontData.LogFont.lfUnderline = FALSE;
  191.     FontData.LogFont.lfStrikeOut = FALSE;
  192.     FontData.LogFont.lfCharSet = 1;
  193.     FontData.LogFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
  194.     FontData.LogFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
  195.     FontData.LogFont.lfQuality = DEFAULT_QUALITY;
  196.     FontData.LogFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
  197.     strcpy(FontData.LogFont.lfFaceName, "Times New Roman");
  198.  
  199.     //    Set initial text color to Red }
  200.     Color = TColor::LtRed;
  201.  
  202.     //    Create default font
  203.     Font = new TFont(&FontData.LogFont);
  204. }
  205.     
  206. TMDITool::~TMDITool()
  207. {
  208.     delete Font;
  209. }
  210.  
  211. char far*
  212. TMDITool::GetClassName()
  213. {
  214.     return APPNAME;
  215. }
  216.  
  217. void TMDITool::SetupWindow()
  218. {
  219.     TSFXMDIFrame::SetupWindow();
  220.  
  221.     /* Create a top aligned toolbar
  222.      */
  223.     CmTop();
  224.  
  225.     /* Create MDI child window
  226.      */
  227.     Client->CreateChild();
  228. }
  229.  
  230. void
  231. TMDITool::EvInitMenuPopup(HMENU hPopupMenu, UINT index, BOOL sysMenu)
  232. {
  233.     if (!sysMenu && index == 0 && ToolbarPos != OldToolbarPos)
  234.     {
  235.         CheckMenuItem(hPopupMenu, ToolbarPos, MF_CHECKED);
  236.         CheckMenuItem(hPopupMenu, OldToolbarPos, MF_UNCHECKED);
  237.     }
  238.     else
  239.     if (!sysMenu && index == 1)
  240.     {
  241.         if (Toolbar->IsWindowVisible())
  242.             EnableMenuItem(hPopupMenu, CM_SHOW, MF_GRAYED);
  243.         else
  244.             EnableMenuItem(hPopupMenu, CM_SHOW, MF_ENABLED);
  245.     }
  246.     else
  247.         TSFXMDIFrame::EvInitMenuPopup(hPopupMenu, index, sysMenu);
  248. }
  249.  
  250. void
  251. TMDITool::EvSize(UINT /*sizeType*/, TSize& size)
  252. {
  253.     Toolbar->AlignToolbar();
  254.     UpdateClientArea(size.cx, size.cy);
  255. }
  256.  
  257. void
  258. TMDITool::UpdateClientArea(int width, int height)
  259. {
  260.     /* Resize the client window depending on the toolbar position
  261.      */
  262.     if (Client && Client->HWindow)    
  263.     {
  264.         int x = 0, y = 0;
  265.         if (!width && !height)
  266.         {
  267.             TRect rect = GetClientRect();
  268.             width = rect.Width();
  269.             height = rect.Height();
  270.         }
  271.         if (ToolbarPos == CM_TOP)
  272.             y = 29;
  273.         else
  274.         if (ToolbarPos == CM_LEFT)
  275.             x = 29;
  276.         else
  277.         if (ToolbarPos == CM_RIGHT)
  278.             width -= 29;
  279.         else
  280.         if (ToolbarPos == CM_BOTTOM || ToolbarPos == CM_STATUS)
  281.             height -= 29;
  282.         Client->MoveWindow(x, y, width, height, TRUE);
  283.     }
  284. }
  285.  
  286. void
  287. TMDITool::CmPopup()
  288. {
  289.     OldToolbarPos = ToolbarPos;
  290.     if (ToolbarPos != CM_POPUP)
  291.     {
  292.         ToolbarPos = CM_POPUP;
  293.         if (Toolbar && Toolbar->HWindow)
  294.             DestroyWindow(Toolbar->HWindow);
  295.  
  296.         /* A popup toolbar is confined to the Windows' desktop and cannot be moved
  297.          * outside. The x value 'GetSystemMetrics(SM_CXSCREEN)' and the y value '0'
  298.          * ensure that the toolbar is positioned in the top-left corner of the
  299.          * desktop window.
  300.          */
  301.         Toolbar = new TSFXToolbar(this, ID_TOOLBAR, "?,301,302,303,304,305,306,307,308",
  302.                                   GetSystemMetrics(SM_CXSCREEN), 0, FALSE);
  303.         Toolbar->Attr.Style |= MTB_ROW4 | MTB_COLUMN2 | MTB_FLOAT | MTB_3DFRAME | 
  304.                                MTB_BITMAPBUTTON | WS_CAPTION | WS_SYSMENU;
  305.         Toolbar->Create();
  306.         UpdateClientArea(0, 0);
  307.     }
  308. }
  309.  
  310. void
  311. TMDITool::CmTop()
  312. {
  313.     OldToolbarPos = ToolbarPos;
  314.     if (ToolbarPos != CM_TOP)
  315.     {
  316.         /* An SFX Toolbar sizes itself according to the specified flags and the size
  317.          * of the first button's first bitmap, so cx and cy can be zero. x and y have
  318.          * no effect on an aligned toolbar and should be set to zero. To re position a
  319.          * toolbar you have to destroy the current one and create a new one. When you
  320.          * do, you will have to change the MTB_ROWXX, MTB_COLOUMNXX and the toolbar
  321.          * style flags: MTB_TOP, MTB_LEFT, MTB_RIGHT, MTB_BOTTOM, MTB_FLOAT and MTB_STATUS.
  322.          */
  323.         ToolbarPos = CM_TOP;
  324.         if (Toolbar && Toolbar->HWindow)
  325.             DestroyWindow(Toolbar->HWindow);
  326.         Toolbar = new TSFXToolbar(this, ID_TOOLBAR, "?,301,302,303,304,305,306,307,308",
  327.                                   0, 0, TRUE);
  328.         Toolbar->Attr.Style |= MTB_ROW1 | MTB_COLUMN8 | MTB_TOP | MTB_BITMAPBUTTON;
  329.         Toolbar->Create();
  330.         UpdateClientArea(0, 0);
  331.     }
  332. }
  333.  
  334. void
  335. TMDITool::CmLeft()
  336. {
  337.     OldToolbarPos = ToolbarPos;
  338.     if (ToolbarPos != CM_LEFT)
  339.     {
  340.         ToolbarPos = CM_LEFT;
  341.         if (Toolbar && Toolbar->HWindow)
  342.             DestroyWindow(Toolbar->HWindow);
  343.         Toolbar = new TSFXToolbar(this, ID_TOOLBAR, "?,301,302,303,304,305,306,307,308",
  344.                                   0, 0, TRUE);
  345.         Toolbar->Attr.Style |= MTB_ROW8 | MTB_COLUMN1 | MTB_LEFT | MTB_BITMAPBUTTON;
  346.         Toolbar->Create();
  347.         UpdateClientArea(0, 0);
  348.     }
  349. }
  350.  
  351. void
  352. TMDITool::CmRight()
  353. {
  354.     OldToolbarPos = ToolbarPos;
  355.     if (ToolbarPos != CM_RIGHT)
  356.     {
  357.         ToolbarPos = CM_RIGHT;
  358.         if (Toolbar && Toolbar->HWindow)
  359.             DestroyWindow(Toolbar->HWindow);
  360.         Toolbar = new TSFXToolbar(this, ID_TOOLBAR, "?,301,302,303,304,305,306,307,308",
  361.                                   0, 0, TRUE);
  362.         Toolbar->Attr.Style |= MTB_ROW8 | MTB_COLUMN1 | MTB_RIGHT | MTB_BITMAPBUTTON;
  363.         Toolbar->Create();
  364.         UpdateClientArea(0, 0);
  365.     }
  366. }
  367.  
  368. void
  369. TMDITool::CmBottom()
  370. {
  371.     OldToolbarPos = ToolbarPos;
  372.     if (ToolbarPos != CM_BOTTOM)
  373.     {
  374.         ToolbarPos = CM_BOTTOM;
  375.         if (Toolbar && Toolbar->HWindow)
  376.             DestroyWindow(Toolbar->HWindow);
  377.         Toolbar = new TSFXToolbar(this, ID_TOOLBAR, "?,301,302,303,304,305,306,307,308",
  378.                                   0, 0, TRUE);
  379.         Toolbar->Attr.Style |= MTB_ROW1 | MTB_COLUMN8 | MTB_BOTTOM | MTB_BITMAPBUTTON;
  380.         Toolbar->Create();
  381.         UpdateClientArea(0, 0);
  382.     }
  383. }
  384.  
  385. void
  386. TMDITool::CmStatus()
  387. {
  388.     OldToolbarPos = ToolbarPos;
  389.     if (ToolbarPos != CM_STATUS)
  390.     {
  391.         ToolbarPos = CM_STATUS;
  392.         if (Toolbar && Toolbar->HWindow)
  393.             DestroyWindow(Toolbar->HWindow);
  394.         Toolbar = new TSFXToolbar(this, ID_TOOLBAR, "?,301,302,303,304,305,306,307,308",
  395.                                   0, 0, TRUE);
  396.         Toolbar->Attr.Style |= MTB_ROW1 | MTB_COLUMN8 | MTB_STATUS | MTB_BITMAPBUTTON;
  397.         Toolbar->Create();
  398.         UpdateClientArea(0, 0);
  399.     }
  400. }
  401.  
  402. void
  403. TMDITool::CmExitWindow()
  404. {
  405.     CloseWindow();
  406. }
  407.  
  408. void
  409. TMDITool::CmFont()
  410. {
  411.     /* Uses the new SFXChooseFont function to display an SFX ChooseFont common dialog box
  412.      */
  413.     DWORD flags = CF_EFFECTS | CF_BOTH;
  414.     int id = GetSFXTemplateId("SFXSteelDlg", DLG_FONT);
  415.  
  416.     if (SFXChooseFont(HWindow, (LOGFONT far*)&FontData.LogFont, flags, id,
  417.                       FALSE, (COLORREF far*)&Color))
  418.     {
  419.         delete Font;
  420.         Font = new TFont(&FontData.LogFont);
  421.         TMDIChild* child = Client->GetActiveMDIChild();
  422.         child->GetClientWindow()->Invalidate();
  423.     }
  424. }
  425.  
  426. void
  427. TMDITool::CmShow()
  428. {
  429.     Toolbar->Show(SW_SHOWNORMAL);
  430. }
  431.  
  432. void
  433. TMDITool::CmAbout()
  434. {
  435.     TAboutDialog(this, "AboutDialog").Execute();
  436. }
  437.  
  438. //    TMDIToolApop class
  439.  
  440. class TMDIToolApp : public TApplication {
  441.   public:
  442.     TMDIToolApp() : TApplication("MDITool - Toolbar Demonstration") {}
  443.     void InitMainWindow();
  444. };
  445.  
  446. void
  447. TMDIToolApp::InitMainWindow()
  448. {
  449.     /* FALSE sets the MWS_3DFRAME flag  and TRUE sets the MWS_SFXCAPTION flag
  450.      */
  451.     MainWindow = new TMDITool(GetName(), "MDITOOL", *new TClient(), FALSE, TRUE);
  452.     MainWindow->SetIcon(this, APPNAME);
  453. }
  454.  
  455. int
  456. OwlMain(int /*argc*/, char* /*argv*/ [])
  457. {
  458.     return TMDIToolApp().Run();
  459. }
  460.