//---------------------------------------------------------------------------- // ObjectWindows - (C) Copyright 1991, 1993 by Borland International //---------------------------------------------------------------------------- #include #include #include #include #include const int CM_WINDOW = 100; // base id for different windows. class TSubWindow : public TFrameWindow { public: enum TType { Child, PopParent, PopNoParent }; TSubWindow(TWindow* parent, TType type); ~TSubWindow(); protected: void EvSize(UINT sizeType, TSize& size) {Invalidate(); TFrameWindow::EvSize(sizeType, size);} void Paint(TDC& dc, BOOL, TRect&); private: TType Type; DECLARE_RESPONSE_TABLE(TSubWindow); }; DEFINE_RESPONSE_TABLE1(TSubWindow, TFrameWindow) EV_WM_SIZE, END_RESPONSE_TABLE; // pointers to different child windows. // TWindow* SubWinPtr[] = { 0, 0, 0 }; // Titles for the different child windows. // const char* SubWinTitle[] = { "Child Window", "Popup with Parent", "Popup without Parent" }; // How the different child windows will be created. // long SubWinStyle[] = { WS_VISIBLE | WS_CHILD | WS_CAPTION | WS_BORDER | WS_SYSMENU | WS_MINIMIZEBOX | WS_THICKFRAME, WS_VISIBLE | WS_POPUP | WS_OVERLAPPEDWINDOW, WS_VISIBLE | WS_POPUP | WS_OVERLAPPEDWINDOW }; // Initial position of child windows. // TPoint SubWinPos[] = { TPoint(10, 10), TPoint(34, 72), TPoint(54, 92) }; // Some text to be display in the client area of the child windows. // const char* SubWinText[] = { "Child windows cannot be moved outside their parent window. When " \ "minimized, a child window's icon resides within the parent " \ "window.", "Popup windows can be moved outside their parent window. A popup " \ "with a parent is always displayed in front of the parent, " \ "even when the parent is focused. To test this, click on the " \ "parent window. When minimized, popup icons reside on the desktop.", "Popup windows can be moved outside their parent window. A popup " \ "without a parent allows the parent to be brought to the front " \ "when focused. To test this, click on the parent window. When " \ "minimized, popup icons reside on the desktop." }; // // Create window of specified type, indicated by 'type'. // Title and position of window set according to value of 'type'. // TSubWindow::TSubWindow(TWindow* parent, TType type) : TFrameWindow(parent, SubWinTitle[type]), Type(type) { Attr.Style = SubWinStyle[Type]; Attr.X = SubWinPos[Type].x; Attr.Y = SubWinPos[Type].y; Attr.W = 300; Attr.H = 150; } // // Destroy window. SubWinPtr[Type] is set to 0 to indicate that the window // has be closed. // TSubWindow::~TSubWindow() { SubWinPtr[Type] = 0; } // // Draw help text in client are of window. // void TSubWindow::Paint(TDC& dc, BOOL, TRect&) { TRect rect = GetClientRect(); rect.Inflate(-2, 0); dc.DrawText(SubWinText[Type], strlen(SubWinText[Type]), rect, DT_WORDBREAK); } //---------------------------------------------------------------------------- class TMainWindow : public TFrameWindow { public: TMainWindow(const char* title); void ShowSubWindow(TWindow* parent, TSubWindow::TType type); void EvInitMenu(HMENU menu); void CmChild(); void CmPopParent(); void CmPopNoParent(); DECLARE_RESPONSE_TABLE(TMainWindow); }; DEFINE_RESPONSE_TABLE1(TMainWindow, TFrameWindow) EV_WM_INITMENU, EV_COMMAND(CM_WINDOW + TSubWindow::Child, CmChild), EV_COMMAND(CM_WINDOW + TSubWindow::PopParent, CmPopParent), EV_COMMAND(CM_WINDOW + TSubWindow::PopNoParent, CmPopNoParent), END_RESPONSE_TABLE; TMainWindow::TMainWindow(const char* title) : TFrameWindow(0, title), TWindow(0, title) { Attr.X = 0; Attr.Y = 0; Attr.W = 400; Attr.H = 215; AssignMenu("COMMANDS"); } // // Create sub-window. If sub-window, specified by 'type', does not exist // then create it, else make the sub-window the active window. // void TMainWindow::ShowSubWindow(TWindow* parent, TSubWindow::TType type) { if (!SubWinPtr[type]) (SubWinPtr[type] = new TSubWindow(parent, type))->Create(); else { SubWinPtr[type]->SetFocus(); SubWinPtr[type]->SetActiveWindow(); } } // // Setup menu state. If sub-window has been created then then check that // menu item, else uncheck it. // void TMainWindow::EvInitMenu(HMENU menu) { for (int i = TSubWindow::Child; i <= TSubWindow::PopNoParent; i++) { WORD state; if (!SubWinPtr[i]) state = MF_UNCHECKED; else state = MF_CHECKED; ::CheckMenuItem(menu, CM_WINDOW + i, state); } } // // Create the different child windows... // void TMainWindow::CmChild() { ShowSubWindow(this, TSubWindow::Child); } void TMainWindow::CmPopParent() { ShowSubWindow(this, TSubWindow::PopParent); } void TMainWindow::CmPopNoParent() { ShowSubWindow(0, TSubWindow::PopNoParent); } //---------------------------------------------------------------------------- class TPopupApp : public TApplication { public: TPopupApp() : TApplication("Popup") {} void InitMainWindow() {MainWindow = new TMainWindow("Parent Window");} BOOL CanClose(); }; BOOL TPopupApp::CanClose() { // In order to avoid debugging kernel warning messages, ensure that // the parentless popup window is destroyed before exiting the // application. // if (SubWinPtr[TSubWindow::PopNoParent]) SubWinPtr[TSubWindow::PopNoParent]->ShutDownWindow(); return TRUE; } int OwlMain(int /*argc*/, char* /*argv*/ []) { return TPopupApp().Run(); }