【发布时间】: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 自动生成的。我的环境使用命令行编译。
-
您想在大型机内创建两个带有
CWnd或CDialog的子窗口,在它们之间切换。 -
我已经尝试过用这样的框架来调整第一帧。它在客户区域内制作边框。但是经过搜索合适的方法是使用CDocument和CView。我已经搜索到谷歌第 10 页。甚至没有教程或代码片段,只是解释简单的事情。
-
@BarmakShemirani CDocument 如何绑定到 CFrameWnd。我找到的所有教程都是按图片显示的应用程序向导。这不是我想要的。我需要通过代码知道。如何启动单个文档。然后动态改变视图。我知道处理消息。但我需要第一步将 CDocument 绑定到 CFrame。我没有看到解释的方法。将 CDocument 绑定到 Frame。明确我想要什么。你可以看看这个代码pastecode.io/s/8snnqe8z。所有消息事件都在 View 类中实现。就像网络浏览器如何呈现页面和监听事件一样。 index.html、login.html、logout.html