MDI笔记



1、如何阻止建立新文件       类:C**APPIniInstance()    

               if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew )

               {

                               cmdInfo.m_nShellCommand= CCommandLineInfo::FileNothing;

               }

2、如何设置框架窗口的大小范围(类CMainFram

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)

{

               //设置窗口的最大尺寸

               lpMMI->ptMaxTrackSize.x= 800;

               lpMMI->ptMaxTrackSize.y= 600;

 

               //设置窗口的最小尺寸

               lpMMI->ptMinTrackSize.x= 400;

               lpMMI->ptMinTrackSize.y= 300;

 

               CFrameWnd::OnGetMinMaxInfo(lpMMI);

}

3、如何删除MDISDI框架窗口中的菜单(类CMainFram

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

               if(!CFrameWnd::PreCreateWindow(cs) )

                               returnFALSE;

 

               if(cs.hMenu != NULL)

               {

                               //删除菜单

                               DestroyMenu(cs.hMenu);

 

                               //设置菜单句柄值为NULL

                               cs.hMenu= NULL;

               }

 

               returnTRUE;

}

4、如何禁止框架窗口在标题中显示文档名   SDI

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

               if(!CFrameWnd::PreCreateWindow(cs) )

                               returnFALSE;

 

               //删除FWS_ADDTOTITLE风格

               cs.style&= ~FWS_ADDTOTITLE;

 

               returnTRUE;

}

5、如何设置文档的标题 MDI

BOOL CDemoDoc::OnNewDocument()

{

               if(!CDocument::OnNewDocument())

                               returnFALSE;

 

               SetTitle(_T("NewDoc"));

 

               returnTRUE;

}

6、如何设置框架窗口的标题 MDI

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

……

               SetWindowText(_T("MainFrame"));

}

7、如何使主框架窗口初始时最大化或最小化 MDI

BOOL CDemoApp::InitInstance()

{

               //最大化

               m_nCmdShow= SW_SHOWMAXIMIZED;

//            //最小化

//            m_nCmdShow= SW_SHOWMINIMIZED;  

               pMainFrame->ShowWindow(m_nCmdShow);

               pMainFrame->UpdateWindow();

return TRUE;

}

8、如何使MDI子框架窗口初始时最大化或最小化(类CChildFrame

void CChildFrame::ActivateFrame(int nCmdShow)

{

               //最大化

               nCmdShow= SW_SHOWMAXIMIZED;

//            //最小化

//            nCmdShow= SW_SHOWMINIMIZED;

 

               CMDIChildWnd::ActivateFrame(nCmdShow);

}

9、如何使框架窗口保持最小化 SDI

BOOL CDemoApp::InitInstance()

{

               //最小化

               m_nCmdShow= SW_SHOWMINIMIZED;

               m_pMainWnd->ShowWindow(m_nCmdShow);

               m_pMainWnd->UpdateWindow();

               returnTRUE;

}

10、如何设置框架窗口最大化时的大小和位置 SDI

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)

{

               //设置窗口最大化时的大小

               lpMMI->ptMaxSize.x= 800;

               lpMMI->ptMaxSize.y= 600;

 

               //设置窗口最大化时的位置

               lpMMI->ptMaxPosition.x= 0;

               lpMMI->ptMaxPosition.y= 0;

 

               CFrameWnd::OnGetMinMaxInfo(lpMMI);

}

11、如何设置框架窗口的大小范围  SDI

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)

{

               //设置窗口的最大尺寸

               lpMMI->ptMaxTrackSize.x= 800;

               lpMMI->ptMaxTrackSize.y= 600;

 

               //设置窗口的最小尺寸

               lpMMI->ptMinTrackSize.x= 400;

               lpMMI->ptMinTrackSize.y= 300;

 

               CFrameWnd::OnGetMinMaxInfo(lpMMI);

}

或在intCMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加

{

               MoveWindow(0,0,1024/2,768/2);

}

12、如何保存或恢复框架窗口的状态 SDI

void CMainFrame::ActivateFrame(int nCmdShow)

{

               if(m_bFirst)

               {

                               m_bFirst= FALSE;

 

                               WINDOWPLACEMENT*pWndpl = new WINDOWPLACEMENT;

                               pWndpl->length= sizeof(WINDOWPLACEMENT);

 

                               CWinApp*pApp = AfxGetApp();

 

                               //恢复窗口位置

                               pWndpl->flags= pApp->GetProfileInt(_T("WINDOWPLACEMENT"),

                                               _T("FLAGS"),0);

                               pWndpl->showCmd= pApp->GetProfileInt(_T("WINDOWPLACEMENT"),

                                               _T("SHOWCMD"),0);

                               nCmdShow= pWndpl->showCmd;

                               pWndpl->ptMinPosition.x= pApp->GetProfileInt(_T("WINDOWPLACEMENT"),

                                               _T("MINX"),0);  

                               pWndpl->ptMinPosition.y= pApp->GetProfileInt(_T("WINDOWPLACEMENT"),

                                               _T("MINY"),0);  

                               pWndpl->ptMaxPosition.x= pApp->GetProfileInt(_T("WINDOWPLACEMENT"),

                                               _T("MAXX"),0);

                               pWndpl->ptMaxPosition.y= pApp->GetProfileInt(_T("WINDOWPLACEMENT"),

                                               _T("MAXY"),0);

                               pWndpl->rcNormalPosition.top= pApp->GetProfileInt(_T("WINDOWPLACEMENT"),

                                               _T("TOP"),0);

                               pWndpl->rcNormalPosition.left= pApp->GetProfileInt(_T("WINDOWPLACEMENT"),

                                               _T("LEFT"),0);

                               pWndpl->rcNormalPosition.right= pApp->GetProfileInt(_T("WINDOWPLACEMENT"),

                                               _T("RIGHT"),0);

                               pWndpl->rcNormalPosition.bottom= pApp->GetProfileInt(_T("WINDOWPLACEMENT"),

                                               _T("BOTTOM"),0);

 

                               //设置窗口位置

                               SetWindowPlacement(pWndpl);

 

                               deletepWndpl;

               }

 

               CFrameWnd::ActivateFrame(nCmdShow);

}

 

void CMainFrame::OnClose()

{

               WINDOWPLACEMENT*pWndpl = new WINDOWPLACEMENT;

               pWndpl->length= sizeof(WINDOWPLACEMENT);

 

               //获得窗口位置

               GetWindowPlacement(pWndpl);

 

               CWinApp*pApp = AfxGetApp();

 

               //保存窗口位置

               pApp->WriteProfileInt(_T("WINDOWPLACEMENT"),_T("FLAGS"),

                               pWndpl->flags);

               pApp->WriteProfileInt(_T("WINDOWPLACEMENT"),_T("SHOWCMD"),

                               pWndpl->showCmd);

               pApp->WriteProfileInt(_T("WINDOWPLACEMENT"),_T("MINX"),

                               pWndpl->ptMinPosition.x);

               pApp->WriteProfileInt(_T("WINDOWPLACEMENT"),_T("MINY"),

                               pWndpl->ptMinPosition.y);

               pApp->WriteProfileInt(_T("WINDOWPLACEMENT"),_T("MAXX"),

                               pWndpl->ptMaxPosition.x);

               pApp->WriteProfileInt(_T("WINDOWPLACEMENT"),_T("MAXY"),

                               pWndpl->ptMaxPosition.y);

               pApp->WriteProfileInt(_T("WINDOWPLACEMENT"),_T("TOP"),

                               pWndpl->rcNormalPosition.left);

               pApp->WriteProfileInt(_T("WINDOWPLACEMENT"),_T("LEFT"),

                               pWndpl->rcNormalPosition.top);

               pApp->WriteProfileInt(_T("WINDOWPLACEMENT"),_T("RIGHT"),

                               pWndpl->rcNormalPosition.right);

               pApp->WriteProfileInt(_T("WINDOWPLACEMENT"),_T("BOTTOM"),

                               pWndpl->rcNormalPosition.bottom);

 

               deletepWndpl;

 

               CFrameWnd::OnClose();

}

13、如何改变视图的背景颜色 MDI

               首先定义:        CBrushm_Brush;

               然后在构造函数中创建画刷:

CDemoView::CDemoView()

{

                              //创建画刷

                              m_Brush.CreateSolidBrush(RGB(0x99,0xCC, 0xFF));

}

最后填充背景:

BOOL CDemoView::OnEraseBkgnd(CDC*pDC)

{

      //获得客户区大小

      CRectrect;

      GetClientRect(rect);

 

      //填充背景

      pDC->FillRect(&rect,&m_Brush);

      returnTRUE;

}

14、如何排列MDI子框架窗口

在菜单栏添加相应菜单项:水平、垂直、层叠显示,然后添加以下消息响应函数。

void CMainFrame::OnTilehWnd()

{

      //水平显示

      MDITile(MDITILE_HORIZONTAL);

}

 

void CMainFrame::OnTilevWnd()

{

      //垂直显示

      MDITile(MDITILE_VERTICAL);

}

 

void CMainFrame::OnCascadeWnd()

{

      //层叠显示

      MDICascade();

}

15、如何在SDI中切换多视图

首先添加两个视图类,在菜单中添加两个菜单项:视图一、视图二

然后分别在两个视图类中的OnDraw函数中添加:

void CDemoView1::OnDraw(CDC* pDC)

{

      pDC->TextOut(100,100, _T("DemoView1"));

}

void CDemoView2::OnDraw(CDC* pDC)

{

      pDC->TextOut(100,100, _T("DemoView2"));

}

16、如何在SDI中动态切分窗口

首先在菜单项中添加菜单项:视图à动态切分视图

然后添加消息响应函数:

void CDemoView::OnSplitView()

{

               CSplitterWnd*pSplitter = GetParentSplitter(this, FALSE);

               if(pSplitter == NULL)

               {

                               return;

               }

               ASSERT(!pSplitter->IsTracking());

               pSplitter->DoKeyboardSplit();

}

源码下载 该源码是VS2005创建的工程的一个测试子项目打包的,要打开的话就随便创建一个空的工程,然后添加新项目,选择解压出来的test.vcproj就OK了。

17、如何在SDI中静态切分窗口

首先在MainFrame.h中定义保护型的分割对象:CSplitterWndm_wndSplitter;

然后新建两个视图类,继承CView

其次在MainFrame类中添加系统消息函数:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext* pContext)

{

               //创建静态窗口

               m_wndSplitter.CreateStatic(this,2, 1);//只有两个视图,所以21

 

               //创建视图

               m_wndSplitter.CreateView(0,0, RUNTIME_CLASS(CDemoView1),

                               CSize(100,150), pContext);

               m_wndSplitter.CreateView(1,0, RUNTIME_CLASS(CDemoView2),

                               CSize(100,150), pContext);

 

               returnTRUE;

}

18、如何实现滚动视图

在视图类C**View中添加系统消息函数:并将本视图类的基类改为CScrollView

 

void CDemoView::OnInitialUpdate()

{

               CScrollView::OnInitialUpdate();

 

               //滚动视图的尺寸

               CSizesizeTotal;

               sizeTotal.cx= 800;

               sizeTotal.cy= 600;            

               //滚动条的页尺寸

               CSizesizePage;

               sizePage.cx= 50;

               sizePage.cy= 50;

               //滚动条的行尺寸

               CSizesizeLine;

               sizeLine.cx= 10;

               sizeLine.cy= 10;

 

               //设置滚动视图尺寸

               SetScrollSizes(MM_TEXT,sizeTotal, sizePage, sizeLine);

}

19、如何使用列表视图 SDI

首先添加系统消息函数:并将本视图类的基类改为CListView

void CDemoView::OnInitialUpdate()

{

               CListView::OnInitialUpdate();

 

               //初始化列表视图

               InitList();

}

void CDemoView::InitList()

{

               //获得列表控件的指针

               CListCtrl*pList = &GetListCtrl();

 

               //设置列表视图的报表显示方式

               pList->ModifyStyle(LVS_ICON| LVS_SMALLICON | LVS_LIST, LVS_REPORT);

 

               //设置列表视图显示网格线和整行选中

               pList->SetExtendedStyle(LVS_EX_GRIDLINES| LVS_EX_FULLROWSELECT);

 

               //在列表视图中插入列

               for(int n = 0; n < 4; n++)

               {

                               CStringstrColumnHeading = _T("");

                               strColumnHeading.Format(_T("Column%d"), n);

                               pList->InsertColumn(n,strColumnHeading, LVCFMT_LEFT, 100);

               }

 

               //在列表视图中插入行

               for(int m = 0; m < 10; m++)

               {

                               CStringstrItem = _T("");

                               strItem.Format("Item%d", m);

                               pList->InsertItem(m,strItem);

 

                               for(int n = 1; n < 4; n++)

                               {

                                               CStringstrText = _T("");

                                               strText.Format(_T("SubItem%d %d"), m, n);

                                               pList->SetItemText(m,n, strText);

                               }

               }

}

20、如何使用树视图

首先添加系统消息函数:并将本视图类的基类改为CTreeView

void CDemoView::OnInitialUpdate()

{

               CTreeView::OnInitialUpdate();

 

               //初始化树

               InitTree();

}

void CDemoView::InitTree()

{

               //获得数控件

               CTreeCtrl*pTree = &GetTreeCtrl();

 

               //为树添加连线和按钮

               pTree->ModifyStyle(0,TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS);

 

               CStringstrText = _T("");

 

               //在树中插入项

               HTREEITEMhRoot = pTree->InsertItem(_T("Root"));

 

               for(int i = 0; i < 4; i++)

               {

                               strText.Format(_T("Item%d"), i);

 

                               //在树中插入项

                               HTREEITEMhParent = pTree->InsertItem(strText, hRoot);

 

                               for(intj = 0; j < 5; j++)

                               {

                                               strText.Format(_T("SubItem%d %d"), i, j);

 

                                               //在树中插入项

                                               pTree->InsertItem(strText,hParent);

                               }

 

                               //展开树项

                               pTree->Expand(hParent,TVE_EXPAND);     

               }

 

               //展开树项

               pTree->Expand(hRoot,TVE_EXPAND);

 

               //选择树项

               pTree->Select(hRoot,TVGN_CARET);

}

21、如何实现HTML视图MDI

首先使本视图类继承于CHtmlView类,则在

void CDemoView::OnInitialUpdate()

{

               CHtmlView::OnInitialUpdate();

               //TODO: This code navigates to a popular spot on the web.

               // change the code to go where you'd like.

               Navigate2(_T("www.baidu.cn"),NULL,NULL);

}

扩展:添加一个自定义的对话框IDD_DIALOG1,对话框中添加控件,editbox可以输入网址,按钮确定该网址进入网址。对话框属性设置为childnone适当调整类似工具栏的大小宽度。

MainFrame类中增加CDialogBar m_wndDlgBar;

然后在OnCreate()函数中增加:

               if(!m_wndDlgBar.Create(this, IDD_DIALOG1,

                               CBRS_ALIGN_TOP,AFX_IDW_DIALOGBAR))

               {

                               TRACE0("Failedto create dialogbar\n");

                               return-1;                             // failto create

               }

另外:使该类似工具栏的对话框栏可以停靠,设置如下

               m_wndDlgBar.EnableDocking(CBRS_ALIGN_ANY);

               EnableDocking(CBRS_ALIGN_ANY);

               DockControlBar(&m_wndDlgBar);

22、如何在视图中获得文档指针

               //获得文档指针

               CDemoDoc*pDoc = GetDocument();

               if(pDoc == NULL)

               {

                               return;

               }

               //并在相应窗口位置处显示该指针值

               CRectrect;

               GetClientRect(rect);

               CStringstrText = _T("");

               strText.Format(_T("在视图中获得文档指针:0x%08X"), pDoc);

               CDC*pDC = GetDC();

               pDC->SetTextAlign(TA_CENTER);

               pDC->TextOut(rect.Width()/ 2, rect.Height() / 2, strText);

23、如何在框架中获得当前视图指针

               //获得当前子框架

               CMDIChildWnd*pChildFrame = (CMDIChildWnd*)GetActiveFrame();

               if(pChildFrame == NULL)

               {

                               return;

               }

 

               //获得当前视图

               CDemoView*pView = (CDemoView*)pChildFrame->GetActiveView();

               if(pView == NULL)

               {

                               return;

               }

//并在相应窗口位置处显示该指针值

               CRect rect;

               pView->GetClientRect(rect);

               CStringstrText = _T("");

               strText.Format(_T("在框架中获得当前视图指针:0x%08X"), pView);

               CDC*pDC = pView->GetDC();

               pDC->SetTextAlign(TA_CENTER);

               pDC->TextOut(rect.Width()/ 2, rect.Height() / 2, strText);

 

 

 

24、如何在框架中获得当前文档指针

               //获得当前子框架

               CMDIChildWnd*pChildFrame = (CMDIChildWnd*)GetActiveFrame();

               if(pChildFrame == NULL)

               {

                               return;

               }

 

               //获得当前视图

               CDemoView*pView = (CDemoView*)pChildFrame->GetActiveView();

               if(pView == NULL)

               {

                               return;

               }

 

               //获得当前文档

               CDemoDoc*pDoc = (CDemoDoc*)pChildFrame->GetActiveDocument();

               if(pDoc == NULL)

               {

                               return;

               }

//并在相应窗口位置处显示该指针值

 

               CRectrect;

               pView->GetClientRect(rect);

               CStringstrText = _T("");

               strText.Format(_T("在框架中获得当前文档指针:0x%08X"), pDoc);

               CDC*pDC = pView->GetDC();

               pDC->SetTextAlign(TA_CENTER);

               pDC->TextOut(rect.Width()/ 2, rect.Height() / 2, strText);

25、如何新建或打开文档

C**APP类中添加文档模板对象定义CMultiDocTemplate*m_pDocTemplate;

void CDemoApp::OnTest1()

{

               //新建文档

               m_pDocTemplate->OpenDocumentFile(NULL);        

}

 

void CDemoApp::OnTest2()

{

               CStringstrPathName = _T("");

 

               //文件对话框

               CStringstrFilter = _T("所有文件(*.*)|*.*||");

               CFileDialogdlg(TRUE, NULL, NULL, OFN_HIDEREADONLY |

                               OFN_OVERWRITEPROMPT,strFilter);

               dlg.m_ofn.lpstrTitle= _T("浏览文件");

               if(dlg.DoModal()== IDOK)

               {

                               strPathName= dlg.GetPathName();

               }

 

               //打开文档

               m_pDocTemplate->OpenDocumentFile(strPathName);

}

26、如何创建新的框架窗口

               CDemoApp*pApp = (CDemoApp*)AfxGetApp();

               if(pApp == NULL)

               {

                               return;

               }

               CMultiDocTemplate*pDocTemplate = pApp->m_pDocTemplate;

               CDocument*pDoc = pApp->m_pDoc;

               

               //创建新框架窗口

               CFrameWnd*pFrame = pDocTemplate->CreateNewFrame(pDoc, NULL);

               if(pFrame == NULL)

               {

                               return;

               }

               //初始化框架窗口

               pDocTemplate->InitialUpdateFrame(pFrame,pDoc);

27、如何实现单文档-多视图结构

 

               //创建文档模板1

               CMultiDocTemplate*pDocTemplate1;

               pDocTemplate1= new CMultiDocTemplate(

                               IDR_DEMOTYPE,

                               RUNTIME_CLASS(CDemoDoc),

                               RUNTIME_CLASS(CChildFrame),

                               RUNTIME_CLASS(CDemoView1));

               AddDocTemplate(pDocTemplate1);

 

               //创建文档模板2

               CMultiDocTemplate*pDocTemplate2;

               pDocTemplate2= new CMultiDocTemplate(

                               IDR_DEMOTYPE,

                               RUNTIME_CLASS(CDemoDoc),

                               RUNTIME_CLASS(CChildFrame),

                               RUNTIME_CLASS(CDemoView2));

               AddDocTemplate(pDocTemplate2);

 

               CMainFrame*pMainFrame = new CMainFrame;

               if(!pMainFrame->LoadFrame(IDR_MAINFRAME))

                               returnFALSE;

               m_pMainWnd= pMainFrame;

 

               //文档模板1新建一个文档

               CDemoDoc*pDoc = (CDemoDoc*)pDocTemplate1->OpenDocumentFile(NULL);

               if(pDoc == NULL)

               {

                               returnFALSE;

               }

 

               //文档模板2创建与文档相关联的框架窗口

               CFrameWnd*pFrame = pDocTemplate2->CreateNewFrame(pDoc, NULL);

               if(pFrame == NULL)

               {

                               returnFALSE;

               }

               //文档模板2初始化框架窗口

               pDocTemplate2->InitialUpdateFrame(pFrame,pDoc);

 

               pMainFrame->ShowWindow(m_nCmdShow);

               pMainFrame->UpdateWindow();

 

               //水平排列窗口

               pMainFrame->MDITile(MDITILE_HORIZONTAL);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值