kittmaster Posted March 11, 2021 Posted March 11, 2021 (edited) EDIT: Link added below to the full project for downloading > Link: http://www.kittmaster.com/imagedump/snd/App1.rar Long time....Greetz to all. I'm honing some skills going forward and I can't seem to get my head around how to call a function without issue of it being static or object errors....or simply, it doesn't work. I have built an MFC MDI using the wizard, compiled it...great...starts up works fine. The point, I'm trying to write messages to the output panes......3 of them...find/debug/build. There is pre-code that starts up showing the controls all work etc....so structurally I have done nothing to alter the code from the wizard.....all is right with the world. So, now I want to start adding my own code...just to learn the operation methods....and that is where it falls apart. There are 3 files of interest: OutputWnd.cpp, OutputWnd.h, and MainFrm.h. The output.cpp is where it creates the bottom output pane, tabs, and names everything and then calls: FillBuildWindow(); FillDebugWindow(); FillFindWindow(); and fills in junk default text from those functions all load up into the output window. So, just to see if I can fire all of the preloaded messages again, I want to call for example FillBuildWindow(); again from the MainFrm.cpp and if I do it right....I should be able to fill the pane with the same text repeated the same way as the application on startup.....that is what is falling apart, I can't seem to figure out the correct way to call that function to fire again from MainFrm. The 3 file unmodified from the MFC wizard are below, to test it, I've tried: COutputWnd::FillBuildWindow(); case ID_VIEW_APPLOOK_OFF_2007_BLUE: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue); &COutputWnd::FillBuildWindow; break; case ID_VIEW_APPLOOK_OFF_2007_BLUE: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue); COutputWnd::FillBuildWindow(); break; COutputList m_wndOutputBuild; // TUTS 4 U Clarification of this line > Top of the MainFrm.cpp file for Ojbect Instantiation COutputWnd::FillBuildWindow(); case ID_VIEW_APPLOOK_OFF_2007_BLUE: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue); m_wndOutputBuild.AddString(_T("Build output is being displayed here.")); break; .....everything has been a dead end or compile error. I'm sure it is something stupid on my end. So the question is, how do I call the FillDebugWindow(); from the MainFrm.cpp correctly? I know it's a C++ 101, I have been scrubbing Google for some answers and I just can't seem to make the puzzle click. Thanks in advance. OutputWnd.cpp: #include "pch.h" #include "framework.h" #include "OutputWnd.h" #include "Resource.h" #include "MainFrm.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // COutputBar COutputWnd::COutputWnd() noexcept { } COutputWnd::~COutputWnd() { } BEGIN_MESSAGE_MAP(COutputWnd, CDockablePane) ON_WM_CREATE() ON_WM_SIZE() END_MESSAGE_MAP() int COutputWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDockablePane::OnCreate(lpCreateStruct) == -1) return -1; CRect rectDummy; rectDummy.SetRectEmpty(); // Create tabs window: if (!m_wndTabs.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, 1)) { TRACE0("Failed to create output tab window\n"); return -1; // fail to create } // Create output panes: const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL; if (!m_wndOutputBuild.Create(dwStyle, rectDummy, &m_wndTabs, 2) || !m_wndOutputDebug.Create(dwStyle, rectDummy, &m_wndTabs, 3) || !m_wndOutputFind.Create(dwStyle, rectDummy, &m_wndTabs, 4)) { TRACE0("Failed to create output windows\n"); return -1; // fail to create } UpdateFonts(); CString strTabName; BOOL bNameValid; // Attach list windows to tab: bNameValid = strTabName.LoadString(IDS_BUILD_TAB); ASSERT(bNameValid); m_wndTabs.AddTab(&m_wndOutputBuild, strTabName, (UINT)0); bNameValid = strTabName.LoadString(IDS_DEBUG_TAB); ASSERT(bNameValid); m_wndTabs.AddTab(&m_wndOutputDebug, strTabName, (UINT)1); bNameValid = strTabName.LoadString(IDS_FIND_TAB); ASSERT(bNameValid); m_wndTabs.AddTab(&m_wndOutputFind, strTabName, (UINT)2); // Fill output tabs with some dummy text (nothing magic here) FillBuildWindow(); FillDebugWindow(); FillFindWindow(); return 0; } void COutputWnd::OnSize(UINT nType, int cx, int cy) { CDockablePane::OnSize(nType, cx, cy); // Tab control should cover the whole client area: m_wndTabs.SetWindowPos (nullptr, -1, -1, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); } void COutputWnd::AdjustHorzScroll(CListBox& wndListBox) { CClientDC dc(this); CFont* pOldFont = dc.SelectObject(&afxGlobalData.fontRegular); int cxExtentMax = 0; for (int i = 0; i < wndListBox.GetCount(); i ++) { CString strItem; wndListBox.GetText(i, strItem); cxExtentMax = max(cxExtentMax, (int)dc.GetTextExtent(strItem).cx); } wndListBox.SetHorizontalExtent(cxExtentMax); dc.SelectObject(pOldFont); } void COutputWnd::FillBuildWindow() { m_wndOutputBuild.AddString(_T("Build output is being displayed here.")); m_wndOutputBuild.AddString(_T("The output is being displayed in rows of a list view")); m_wndOutputBuild.AddString(_T("but you can change the way it is displayed as you wish...")); } void COutputWnd::FillDebugWindow() { m_wndOutputDebug.AddString(_T("Debug output is being displayed here.")); m_wndOutputDebug.AddString(_T("The output is being displayed in rows of a list view")); m_wndOutputDebug.AddString(_T("but you can change the way it is displayed as you wish...")); } void COutputWnd::FillFindWindow() { m_wndOutputFind.AddString(_T("Find output is being displayed here.")); m_wndOutputFind.AddString(_T("The output is being displayed in rows of a list view")); m_wndOutputFind.AddString(_T("but you can change the way it is displayed as you wish...")); } void COutputWnd::UpdateFonts() { m_wndOutputBuild.SetFont(&afxGlobalData.fontRegular); m_wndOutputDebug.SetFont(&afxGlobalData.fontRegular); m_wndOutputFind.SetFont(&afxGlobalData.fontRegular); } ///////////////////////////////////////////////////////////////////////////// // COutputList1 COutputList::COutputList() noexcept { } COutputList::~COutputList() { } BEGIN_MESSAGE_MAP(COutputList, CListBox) ON_WM_CONTEXTMENU() ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_COMMAND(ID_EDIT_CLEAR, OnEditClear) ON_COMMAND(ID_VIEW_OUTPUTWND, OnViewOutput) ON_WM_WINDOWPOSCHANGING() END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // COutputList message handlers void COutputList::OnContextMenu(CWnd* /*pWnd*/, CPoint point) { CMenu menu; menu.LoadMenu(IDR_OUTPUT_POPUP); CMenu* pSumMenu = menu.GetSubMenu(0); if (AfxGetMainWnd()->IsKindOf(RUNTIME_CLASS(CMDIFrameWndEx))) { CMFCPopupMenu* pPopupMenu = new CMFCPopupMenu; if (!pPopupMenu->Create(this, point.x, point.y, (HMENU)pSumMenu->m_hMenu, FALSE, TRUE)) return; ((CMDIFrameWndEx*)AfxGetMainWnd())->OnShowPopupMenu(pPopupMenu); UpdateDialogControls(this, FALSE); } SetFocus(); } void COutputList::OnEditCopy() { MessageBox(_T("Copy output")); } void COutputList::OnEditClear() { MessageBox(_T("Clear output")); } void COutputList::OnViewOutput() { CDockablePane* pParentBar = DYNAMIC_DOWNCAST(CDockablePane, GetOwner()); CMDIFrameWndEx* pMainFrame = DYNAMIC_DOWNCAST(CMDIFrameWndEx, GetTopLevelFrame()); if (pMainFrame != nullptr && pParentBar != nullptr) { pMainFrame->SetFocus(); pMainFrame->ShowPane(pParentBar, FALSE, FALSE, FALSE); pMainFrame->RecalcLayout(); } } OutputWnd.h: #pragma once ///////////////////////////////////////////////////////////////////////////// // COutputList window class COutputList : public CListBox { // Construction public: COutputList() noexcept; // Implementation public: virtual ~COutputList(); protected: afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); afx_msg void OnEditCopy(); afx_msg void OnEditClear(); afx_msg void OnViewOutput(); DECLARE_MESSAGE_MAP() }; class COutputWnd : public CDockablePane { // Construction public: COutputWnd() noexcept; void UpdateFonts(); // Attributes protected: CMFCTabCtrl m_wndTabs; COutputList m_wndOutputBuild; COutputList m_wndOutputDebug; COutputList m_wndOutputFind; protected: void FillBuildWindow(); void FillDebugWindow(); void FillFindWindow(); void AdjustHorzScroll(CListBox& wndListBox); // Implementation public: virtual ~COutputWnd(); protected: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnSize(UINT nType, int cx, int cy); DECLARE_MESSAGE_MAP() }; MainFrm.cpp: // MainFrm.cpp : implementation of the CMainFrame class // #include "pch.h" #include "framework.h" #include "TestApp.h" #include "MainFrm.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CMainFrame IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWndEx) const int iMaxUserToolbars = 10; const UINT uiFirstUserToolBarId = AFX_IDW_CONTROLBAR_FIRST + 40; const UINT uiLastUserToolBarId = uiFirstUserToolBarId + iMaxUserToolbars - 1; BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx) ON_WM_CREATE() ON_COMMAND(ID_WINDOW_MANAGER, &CMainFrame::OnWindowManager) ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize) ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew) ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook) ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook) ON_WM_SETTINGCHANGE() END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; // CMainFrame construction/destruction CMainFrame::CMainFrame() noexcept { // TODO: add member initialization code here theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_VS_2008); } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1) return -1; BOOL bNameValid; CMDITabInfo mdiTabParams; mdiTabParams.m_style = CMFCTabCtrl::STYLE_3D_ONENOTE; // other styles available... mdiTabParams.m_bActiveTabCloseButton = TRUE; // set to FALSE to place close button at right of tab area mdiTabParams.m_bTabIcons = FALSE; // set to TRUE to enable document icons on MDI taba mdiTabParams.m_bAutoColor = TRUE; // set to FALSE to disable auto-coloring of MDI tabs mdiTabParams.m_bDocumentMenu = TRUE; // enable the document menu at the right edge of the tab area EnableMDITabbedGroups(TRUE, mdiTabParams); if (!m_wndMenuBar.Create(this)) { TRACE0("Failed to create menubar\n"); return -1; // fail to create } m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY); // prevent the menu bar from taking the focus on activation CMFCPopupMenu::SetForceMenuFocus(FALSE); if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } CString strToolBarName; bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD); ASSERT(bNameValid); m_wndToolBar.SetWindowText(strToolBarName); CString strCustomize; bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid); m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); // Allow user-defined toolbars operations: InitUserToolbars(nullptr, uiFirstUserToolBarId, uiLastUserToolBarId); if (!m_wndStatusBar.Create(this)) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); // TODO: Delete these five lines if you don't want the toolbar and menubar to be dockable m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY); m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockPane(&m_wndMenuBar); DockPane(&m_wndToolBar); // enable Visual Studio 2005 style docking window behavior CDockingManager::SetDockingMode(DT_SMART); // enable Visual Studio 2005 style docking window auto-hide behavior EnableAutoHidePanes(CBRS_ALIGN_ANY); // create docking windows if (!CreateDockingWindows()) { TRACE0("Failed to create docking windows\n"); return -1; } m_wndOutput.EnableDocking(CBRS_ALIGN_ANY); DockPane(&m_wndOutput); // set the visual manager and style based on persisted value OnApplicationLook(theApp.m_nAppLook); // Enable enhanced windows management dialog EnableWindowsDialog(ID_WINDOW_MANAGER, ID_WINDOW_MANAGER, TRUE); // Enable toolbar and docking window menu replacement EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR); // enable quick (Alt+drag) toolbar customization CMFCToolBar::EnableQuickCustomization(); if (CMFCToolBar::GetUserImages() == nullptr) { // load user-defined toolbar images if (m_UserImages.Load(_T(".\\UserImages.bmp"))) { CMFCToolBar::SetUserImages(&m_UserImages); } } // enable menu personalization (most-recently used commands) // TODO: define your own basic commands, ensuring that each pulldown menu has at least one basic command. CList<UINT, UINT> lstBasicCommands; lstBasicCommands.AddTail(ID_FILE_NEW); lstBasicCommands.AddTail(ID_FILE_OPEN); lstBasicCommands.AddTail(ID_FILE_SAVE); lstBasicCommands.AddTail(ID_FILE_PRINT); lstBasicCommands.AddTail(ID_APP_EXIT); lstBasicCommands.AddTail(ID_EDIT_CUT); lstBasicCommands.AddTail(ID_EDIT_PASTE); lstBasicCommands.AddTail(ID_EDIT_UNDO); lstBasicCommands.AddTail(ID_APP_ABOUT); lstBasicCommands.AddTail(ID_VIEW_STATUS_BAR); lstBasicCommands.AddTail(ID_VIEW_TOOLBAR); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2003); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_VS_2005); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLUE); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_SILVER); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLACK); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_AQUA); lstBasicCommands.AddTail(ID_VIEW_APPLOOK_WINDOWS_7); CMFCToolBar::SetBasicCommands(lstBasicCommands); // Switch the order of document name and application name on the window title bar. This // improves the usability of the taskbar because the document name is visible with the thumbnail. ModifyStyle(0, FWS_PREFIXTITLE); return 0; } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CMDIFrameWndEx::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return TRUE; } BOOL CMainFrame::CreateDockingWindows() { BOOL bNameValid; // Create output window CString strOutputWnd; bNameValid = strOutputWnd.LoadString(IDS_OUTPUT_WND); ASSERT(bNameValid); if (!m_wndOutput.Create(strOutputWnd, this, CRect(0, 0, 100, 100), TRUE, ID_VIEW_OUTPUTWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI)) { TRACE0("Failed to create Output window\n"); return FALSE; // failed to create } SetDockingWindowIcons(theApp.m_bHiColorIcons); return TRUE; } void CMainFrame::SetDockingWindowIcons(BOOL bHiColorIcons) { HICON hOutputBarIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_OUTPUT_WND_HC : IDI_OUTPUT_WND), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0); m_wndOutput.SetIcon(hOutputBarIcon, FALSE); UpdateMDITabbedBarsIcons(); } // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CMDIFrameWndEx::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CMDIFrameWndEx::Dump(dc); } #endif //_DEBUG // CMainFrame message handlers void CMainFrame::OnWindowManager() { ShowWindowsDialog(); } void CMainFrame::OnViewCustomize() { CMFCToolBarsCustomizeDialog* pDlgCust = new CMFCToolBarsCustomizeDialog(this, TRUE /* scan menus */); pDlgCust->EnableUserDefinedToolbars(); pDlgCust->Create(); } LRESULT CMainFrame::OnToolbarCreateNew(WPARAM wp,LPARAM lp) { LRESULT lres = CMDIFrameWndEx::OnToolbarCreateNew(wp,lp); if (lres == 0) { return 0; } CMFCToolBar* pUserToolbar = (CMFCToolBar*)lres; ASSERT_VALID(pUserToolbar); BOOL bNameValid; CString strCustomize; bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid); pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); return lres; } void CMainFrame::OnApplicationLook(UINT id) { CWaitCursor wait; theApp.m_nAppLook = id; switch (theApp.m_nAppLook) { case ID_VIEW_APPLOOK_WIN_2000: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager)); break; case ID_VIEW_APPLOOK_OFF_XP: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP)); break; case ID_VIEW_APPLOOK_WIN_XP: CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE; CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); break; case ID_VIEW_APPLOOK_OFF_2003: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003)); CDockingManager::SetDockingMode(DT_SMART); break; case ID_VIEW_APPLOOK_VS_2005: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005)); CDockingManager::SetDockingMode(DT_SMART); break; case ID_VIEW_APPLOOK_VS_2008: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008)); CDockingManager::SetDockingMode(DT_SMART); break; case ID_VIEW_APPLOOK_WINDOWS_7: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7)); CDockingManager::SetDockingMode(DT_SMART); break; default: switch (theApp.m_nAppLook) { case ID_VIEW_APPLOOK_OFF_2007_BLUE: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue); break; case ID_VIEW_APPLOOK_OFF_2007_BLACK: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack); break; case ID_VIEW_APPLOOK_OFF_2007_SILVER: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver); break; case ID_VIEW_APPLOOK_OFF_2007_AQUA: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua); break; } CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007)); CDockingManager::SetDockingMode(DT_SMART); } m_wndOutput.UpdateFonts(); RedrawWindow(nullptr, nullptr, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE); theApp.WriteInt(_T("ApplicationLook"), theApp.m_nAppLook); } void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI) { pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID); } BOOL CMainFrame::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext) { // base class does the real work if (!CMDIFrameWndEx::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext)) { return FALSE; } // enable customization button for all user toolbars BOOL bNameValid; CString strCustomize; bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid); for (int i = 0; i < iMaxUserToolbars; i ++) { CMFCToolBar* pUserToolbar = GetUserToolBarByIndex(i); if (pUserToolbar != nullptr) { pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); } } return TRUE; } void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection) { CMDIFrameWndEx::OnSettingChange(uFlags, lpszSection); m_wndOutput.UpdateFonts(); } Edited March 17, 2021 by kittmaster
kao Posted March 11, 2021 Posted March 11, 2021 The code is incomplete and won't compile. But from the quick look, I think it should be something like m_wndOutput.FillFindWindow();
kittmaster Posted March 11, 2021 Author Posted March 11, 2021 I did try exactly that, and I get: Error C2248 'COutputWnd::FillFindWindow': cannot access protected member declared in class 'COutputWnd' \desktop\example\mainfrm.cpp 276 I moved FillBuildWindow from protected to public as shown below: #pragma once ///////////////////////////////////////////////////////////////////////////// // COutputList window class COutputList : public CListBox { // Construction public: COutputList() noexcept; // Implementation public: virtual ~COutputList(); protected: afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); afx_msg void OnEditCopy(); afx_msg void OnEditClear(); afx_msg void OnViewOutput(); DECLARE_MESSAGE_MAP() }; class COutputWnd : public CDockablePane { // Construction public: COutputWnd() noexcept; void UpdateFonts(); void FillBuildWindow(); COutputList m_wndOutputBuild; // Attributes protected: CMFCTabCtrl m_wndTabs; //COutputList m_wndOutputBuild; COutputList m_wndOutputDebug; COutputList m_wndOutputFind; protected: //void FillBuildWindow(); void FillDebugWindow(); void FillFindWindow(); void AdjustHorzScroll(CListBox& wndListBox); // Implementation public: virtual ~COutputWnd(); protected: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnSize(UINT nType, int cx, int cy); DECLARE_MESSAGE_MAP() };
kittmaster Posted March 11, 2021 Author Posted March 11, 2021 BTW, thank you for the response.......to be able to build this if it will help: File > New Project > MFC App > 1st Wizard > Multiple Documents (in my case, no change to dialog) 2nd > No Changes 3rd > No changes 4th > Uncheck Explorer docking pane/Properties dialog pane .......... Leave Output docking pane (This is where my issue lies) Skip 5th > Click finish.... Build...example should be 100%. I can also build and post the entire solution for download if that would be helpful. Thank you again for your time.
kittmaster Posted March 11, 2021 Author Posted March 11, 2021 Well shoot............I copied the wrong function, I did the find and not build after I made it public....I got it work...."for now"....LOL. Thanks for the insight.....good lord that was easy... Best,
kittmaster Posted March 12, 2021 Author Posted March 12, 2021 Well, I ran into another brick wall I can't figure out....the solution works exactly as it should....but only within the MainFrame.cpp file. When I try to do the same calls from Application.cpp or ViewChapters.cpp....i.e. my other CPP files trying to call the same function. I don't get any build errors or warnings, but the breakpoint shows it runs the command from Application.cpp and nothing shows up in the output pane....almost like it was sent elsewhere. I've instantiated this: COutputWnd m_wndOutput; In the application.h and ViewChapters.h so that each has its own object to pump the data too. But that doesn't seem to matter. I'm not sure why this works perfectly for MainFrame.cpp but doesn't fire the function anywhere else from any other cpp file. Any ideas what I could be missing here? Soooooo close......LOL. Thanks.
kittmaster Posted March 13, 2021 Author Posted March 13, 2021 I checked with Teddy and was told it was ok to add link to the sample source project for additional help since the code doesn't compile with what is listed here. Linky: http://www.kittmaster.com/imagedump/snd/App1.rar So with what I have now, if you use the menu application look and selected Windows 2000.....will pump the default message. If you select the "about" menu which is called from App1.cpp, I get an assertion error before the dialog is built....and crashes. The thing I'm looking to do is pump the FillBuildWindow(); function from any cpp file....which only seems to work from the mainframe.cpp. Thanks for looking.
kittmaster Posted March 17, 2021 Author Posted March 17, 2021 (edited) I meant to circle back to this to update. I have the solution and here is how it is solved. The reason this: m_wndOutput.AddStringStatusTab(_T("Item Copied")); worked in MainFrame.cpp is that the handle is already known and can therefore talk to the OutputWnd directly. To be able to send data to the function from anywhere else, the MainFrame handle must be acquired first and then send the same updated command...like this: CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd(); pMainFrame->m_wndOutput.AddStringStatusTab(_T("Item Copied")); However another byproduct that creates an issue is that the functions in the prototype are class protected and have to be switched from Protected to Public like this: public: CMFCMenuBar m_wndMenuBar; CMFCToolBar m_wndToolBar; CMFCStatusBar m_wndStatusBar; COutputWnd m_wndOutput; And since there are 3 tabs created by default from the MFC wizard, I only needed 2, so I removed one and rewrote a new function for better clarity (for me) and kept the default functions in place just as a reminder of how and why I did what I did in the future if I revisit the program for updates like this: Removed: void COutputWnd::FillBuildWindow() { //m_wndOutputBuild.AddString(_T("Build output is being displayed here.")); //m_wndOutputBuild.AddString(_T("The output is being displayed in rows of a list view")); //m_wndOutputBuild.AddString(_T("but you can change the way it is displayed as you wish...")); } void COutputWnd::FillDebugWindow() { //m_wndOutputDebug.AddString(_T("Debug output is being displayed here.")); //m_wndOutputDebug.AddString(_T("The output is being displayed in rows of a list view")); //m_wndOutputDebug.AddString(_T("but you can change the way it is displayed as you wish...")); } void COutputWnd::FillFindWindow() { //m_wndOutputFind.AddString(_T("Find output is being displayed here.")); //m_wndOutputFind.AddString(_T("The output is being displayed in rows of a list view")); //m_wndOutputFind.AddString(_T("but you can change the way it is displayed as you wish...")); } Replaced with: void COutputWnd::AddStringStatusTab(CString message) { m_wndOutputBuild.AddString(message); m_wndOutputBuild.SetCurSel(m_wndOutputBuild.GetCount() - 1); } void COutputWnd::AddStringDebugTab(CString message) { m_wndOutputDebug.AddString(message); m_wndOutputDebug.SetCurSel(m_wndOutputDebug.GetCount() - 1); } The -1 line forces the output window to scroll as more lines are added. I think that covers it, thanks for reading. Chris Edited March 17, 2021 by kittmaster 1
amelia Posted August 28, 2023 Posted August 28, 2023 Dear Sir, I am a newby, I am not able to convert the 3 tab "Build Debug Find" from "CListBox" class to "CListView". Can you modify at least one? Thank you very much.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now