科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件托管C++程序开发—Win表单文档程序设计(中)

托管C++程序开发—Win表单文档程序设计(中)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在托管C++中,编写一个文档应用程序是非常复杂的,尽管在编写过程中能很好地帮助我们理解其内部机制

作者:Adding 来源:YESKY 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
二、一个简单的MDI综合示例

  下面给出一个简单的MDI应用程序代码,运行后结果如图1所示。

#using
using namespace System;

#using "System.dll"
#using "System.Windows.Forms.dll"
#using "System.Drawing.dll"

using namespace System::ComponentModel;
using namespace System::Windows::Forms;
using namespace System::Drawing;

// 这是子窗口
__gc class ChildWnd: public Form
{
private:
TextBox* m_pTextBox;

public:
ChildWnd()
{
InitChildWnd(); // 调用自定义的表单初始化代码
}
void Dispose() // 表单释放,类似于析构函数
{
// 所有的删除代码添加在这里
Form::Dispose(); // 默认的释放操作
}
void InitChildWnd()
{
Text = S"文档窗口——未命名";
m_pTextBox = new TextBox();
m_pTextBox->Dock = DockStyle::Fill;
m_pTextBox->Multiline = true;
m_pTextBox->BackColor = Color::White;
m_pTextBox->BorderStyle = BorderStyle::Fixed3D;

Controls->Add(m_pTextBox);
}
};

// 这是主框架窗口
__gc class MainFrame: public Form
{
private:
MainMenu * m_pMenu;

MenuItem * m_pFileMenu;
MenuItem * m_pFileMenuNew;
MenuItem * m_pFileMenuOpen;
MenuItem * m_pFileMenuExit;

MenuItem * m_pWndMenu;
MenuItem * m_pWndMenuIcons;
MenuItem * m_pWndMenuCascade;
MenuItem * m_pWndMenuTileHori;
MenuItem * m_pWndMenuTileVert;
MenuItem * m_pWndMenuList;
public:
MainFrame()
{
InitMainFrame(); // 调用自定义的表单初始化代码
CreateChildWnd();
}
void Dispose() // 表单释放,类似于析构函数
{
// 所有的删除代码添加在这里
Form::Dispose(); // 默认的释放操作
}
void InitMainFrame()
{
Text = S"Win表单多文档应用程序";
IsMdiContainer = true;

m_pFileMenuNew = new MenuItem( S"新建(&N)",
new EventHandler(this, &MainFrame::OnFileNew));
m_pFileMenuOpen = new MenuItem( S"打开(&O)",
new EventHandler(this, &MainFrame::OnFileOpen));
m_pFileMenuExit = new MenuItem( S"退出(&X)",
new EventHandler(this, &MainFrame::OnFileExit));

MenuItem* rItems[] = new MenuItem *[3];
rItems[0] = m_pFileMenuNew;
rItems[1] = m_pFileMenuOpen;
rItems[2] = m_pFileMenuExit;

m_pFileMenu = new MenuItem( S"文件(&F)", rItems);

m_pWndMenu = new MenuItem( S"窗口(&X)");
m_pWndMenu->MdiList = true;

m_pWndMenuIcons = new MenuItem( S"图标排列");
m_pWndMenuIcons->Click += new EventHandler(this, &MainFrame::OnWndMenu);
m_pWndMenu->MenuItems->Add(m_pWndMenuIcons);

m_pWndMenuCascade = new MenuItem( S"窗口层叠");
m_pWndMenuCascade->Click += new EventHandler(this, &MainFrame::OnWndMenu);
m_pWndMenu->MenuItems->Add(m_pWndMenuCascade);

m_pWndMenuTileHori = new MenuItem( S"上下平铺");
m_pWndMenuTileHori->Click += new EventHandler(this, &MainFrame::OnWndMenu);
m_pWndMenu->MenuItems->Add(m_pWndMenuTileHori);

m_pWndMenuTileVert = new MenuItem( S"左右平铺");
m_pWndMenuTileVert->Click += new EventHandler(this, &MainFrame::OnWndMenu);
m_pWndMenu->MenuItems->Add(m_pWndMenuTileVert);

m_pMenu = new MainMenu();
m_pMenu->MenuItems->Add(m_pFileMenu);
m_pMenu->MenuItems->Add(m_pWndMenu);

Menu = m_pMenu;
}

void OnFileNew(Object *sender, EventArgs *e)
{
CreateChildWnd();
}

void OnFileOpen(Object *sender, EventArgs *e)
{
OpenFileDialog *dlg = new OpenFileDialog();
dlg->Filter = S"所有文件|*.*";
dlg->ShowDialog();
}

void OnFileExit(Object *sender, EventArgs *e)
{
Close();
}

void OnWndMenu(Object *sender, EventArgs *e)
{
if(sender->Equals(m_pWndMenuIcons))
{
LayoutMdi(MdiLayout::ArrangeIcons);
}
else if(sender->Equals(m_pWndMenuCascade))
{
LayoutMdi(MdiLayout::Cascade);
}
else if(sender->Equals(m_pWndMenuTileHori))
{
LayoutMdi(MdiLayout::TileHorizontal);
}
else if(sender->Equals(m_pWndMenuTileVert))
{
LayoutMdi(MdiLayout::TileVertical);
}
}

void CreateChildWnd(void)
{
ChildWnd *pWnd = new ChildWnd();
pWnd->MdiParent = this;
pWnd->Show();
}

};
#ifdef _UNICODE
int wmain(void)
#else
int main(void)
#endif
{
Application::Run(new MainFrame()); // 启用应用程序,运行该类
return 0;
}


            图一

  从以上可以看出,一般的MDI应用程序是非常简单的。但是若需要子文档窗口之间的数据传送以及增加视图的概念,那么就变得复杂许多,不过我们仍然可以用托管C++来设计这样的机制,下一篇,我们就来讨论这个问题。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章