1、如何阻止建立新文件 类:C**APP,IniInstance()
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、如何删除MDI和SDI框架窗口中的菜单(类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);//只有两个视图,所以2、1
//创建视图
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可以输入网址,按钮确定该网址进入网址。对话框属性设置为child、none适当调整类似工具栏的大小宽度。
在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);