【问题标题】:How to make one frame can switch page? like a web browser如何让一帧可以切换页面?像网络浏览器
【发布时间】:2021-12-11 22:24:09
【问题描述】:

我还在学习 mfc,我想创建像 webbrowser 这样的应用程序。它有单独的页面,可以随时调用。我尝试实现这一点。但我无法实现第二页等等。在代码中只有 2 页。登录和注销页面。我把登录放在渲染方法中。但我不知道如何实现第二页(注销)。现在我只是直接把它放在登录方法中。你能告诉我在 mfc 中实现这一点的方法吗?

#include <afxwin.h>

#define LOGIN_BTN 5
#define LOGOUT_BTN 6

class CMainFrame: public CFrameWnd
{
  CPoint mCoordinate;
  CSize mDimension;
  public:
    CMainFrame()
    {
      // Get primary screen resolution
         int widthScreen = GetSystemMetrics(SM_CXSCREEN);
         int heightScreen = GetSystemMetrics(SM_CYSCREEN);
         
      // Set size and position to middle screen
      mDimension.cx = 280;
      mDimension.cy = 133;
      mCoordinate.x = (widthScreen / 2) - (mDimension.cx / 2);
      mCoordinate.y = (heightScreen / 2) - (mDimension.cy / 2);

      Create(
        NULL, 
        "Pandora", 
        WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU, 
        CRect(mCoordinate, mDimension));
    };

    void render()
    {
      CButton* loginBtn = new CButton();
      loginBtn->Create(
        "Login", 
        WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
        CRect(CPoint(100, 60), CSize(150, 25)), 
        this, LOGIN_BTN);
    };

    void removeAllChild()
    {
      CWnd* pChild = nullptr;
      while(true)
      {
        pChild = GetWindow(GW_CHILD);

        if(pChild == NULL) { break; }

        delete pChild;
      };
    };

    protected:
      afx_msg int OnCreate(LPCREATESTRUCT);
      afx_msg void login();
      afx_msg void logout();
      DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_COMMAND(LOGIN_BTN, &CMainFrame::login)
ON_COMMAND(LOGOUT_BTN, &CMainFrame::logout)
END_MESSAGE_MAP()

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  render();

  return 0;
};

void CMainFrame::login()
{
  // delete all child
  removeAllChild();

  // How to make this logout button such it in 2nd page? 
  CButton* logoutBtn = new CButton;
  logoutBtn->Create(
    "Logout", 
    WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
    CRect(CPoint(40, 32), CSize(200, 70)), 
    this, LOGOUT_BTN);
};

void CMainFrame::logout()
{
  removeAllChild();
  render();
};

class CApplication : public CWinApp {
   BOOL InitInstance() {
      CMainFrame* mainWnd = new CMainFrame();
      m_pMainWnd = mainWnd;

      mainWnd->ShowWindow(SW_NORMAL);
      mainWnd->UpdateWindow();
      
      return TRUE;
   }
};

CApplication app;

【问题讨论】:

  • 你需要一个标签控件吗?最简单的方法是创建一个基于对话框的应用程序,并在其中插入一个选项卡控件。如果您有这样的框架窗口,您可以创建多个子窗口,在这些子窗口(或子对话框)中放置按钮。顺便说一句,在你的 OnCreate 方法中确保调用基类 CFrameWnd::OnCreate(lpCreateStruct);
  • @BarmakShemirani 不,我不需要标签。只是一个可以交换整个内容的客户区。比如登录页面,注销页面。搜索后。我认为它与CView有关。但我不知道如何将 CView 添加到 CFrameWnd。从我搜索,View 就像一个页面。它只出现在客户区部分。但我不知道如何将 CView 添加到 CFrameWnd。没有教程只显示这个简单的东西。所有教程都是基于 App Wizard 自动生成的。我的环境使用命令行编译。
  • 您想在大型机内创建两个带有CWndCDialog 的子窗口,在它们之间切换。
  • 我已经尝试过用这样的框架来调整第一帧。它在客户区域内制作边框。但是经过搜索合适的方法是使用CDocument和CView。我已经搜索到谷歌第 10 页。甚至没有教程或代码片段,只是解释简单的事情。
  • @BarmakShemirani CDocument 如何绑定到 CFrameWnd。我找到的所有教程都是按图片显示的应用程序向导。这不是我想要的。我需要通过代码知道。如何启动单个文档。然后动态改变视图。我知道处理消息。但我需要第一步将 CDocument 绑定到 CFrame。我没有看到解释的方法。将 CDocument 绑定到 Frame。明确我想要什么。你可以看看这个代码pastecode.io/s/8snnqe8z。所有消息事件都在 View 类中实现。就像网络浏览器如何呈现页面和监听事件一样。 index.html、login.html、logout.html

标签: c++ winapi mfc


【解决方案1】:

您可以参考文档:Adding Multiple Views to a Single Document。这里还有一个类似的线程可能会有所帮助:How to change MFC View by clicking a Button inside the MainFrame。 您可以使用下面的代码来切换视图:

pActiveView->ShowWindow(SW_HIDE);
pNewView->ShowWindow(SW_SHOW);
((CFrameWnd *)m_pMainWnd)->SetActiveView(pNewView);
((CFrameWnd *)m_pMainWnd)->RecalcLayout();
pNewView->Invalidate();

【讨论】:

    猜你喜欢
    • 2019-12-28
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    相关资源
    最近更新 更多