VC随笔切分窗口和多视图
- 格式:doc
- 大小:36.50 KB
- 文档页数:6
分割视图//分割(插入->资源->IDD_FORMVIEW,建立类向导基类选择CFormView)//在MainFrm.h中定义CSplitterWnd m_splitter;//通过类向导添加函数OnCreateClient(),添加代码m_splitter.CreateStatic(this,1,2);m_splitter.CreateView(0,0,RUNTIME_CLASS(FormDlg),CSize(400,100),pContext); m_splitter.CreateView(0,1,RUNTIME_CLASS(CFGView),CSize(200,100),pContext); return true;//对话框中计算器功能实现(类向导添加函数Add())void FormDlg::OnAdd(){// TODO: Add your control notification handler code hereUpdateData();m_num3=m_num1+m_num2;UpdateData(false);}//对话框中添加按钮,实现消息左右交互//视图类头文件中CString strtext;int x;bool playflag;void Play();//构造函数中初始化x=0;playflag=false;void FormDlg::OnPlay() //类向导添加按钮消息函数{// TODO: Add your control notification handler code hereCMainFrame *pframe=(CMainFrame *)AfxGetApp()->m_pMainWnd;CFGView *pView=(CFGView *)pframe->m_splitter.GetPane(0,1);CString strt;GetDlgItem(IDC_EDIT3)->GetWindowText(strt);pView->strtext=strt;pView->Play();}void CFGView::Play() //自定义函数{playflag=!playflag;if(playflag)SetTimer(1,100,NULL);elseKillTimer(1);}//视图类中添加类向导WM_TIMER,添加代码Invalidate();//视图类源文件OnDraw()函数中添加代码CRect rect;GetClientRect(&rect);x=x+3;if(x>rect.right){x=0;}CString strs,xs;strs.Format("x=%d,%s",x,strtext);pDC->TextOut(x,200,strs);//右左交互,视图类源文件OnDraw()中添加代码CMainFrame *pframe=(CMainFrame *)AfxGetApp()->m_pMainWnd;CEdit *p1=(CEdit *)pframe->m_splitter.GetPane(0,0)->GetDlgItem(IDC_EDIT4); xs.Format("x=%d",x);p1->SetWindowText (xs);//下右交互(对话条:插入资源->Dialog(展开)->选IDD_DIALOGBAR->新建)//主框架头文件中CDialogBar mydlg;//主框架源文件OnCreate函数中mydlg.Create(this,IDD_DIALOGBAR,CBRS_BOTTOM,IDD_DIALOGBAR);。
VC随笔文档视图结构使用断点调试观察MFC应用程序框架的创建过程:由于一个对象被创建时会自动调用构造函数,而一个窗口被创建时会调用OnCreate函数,因此在下列地方设置断点:1、应用程序类、文档类、框架窗口类、视图类的构造函数开始处(函数开始大括号所在行)2、CMy2DCADApp::InitInstance函数开始处、添加文档模板处、结尾处(函数结束大括号所在行)3、CMainFrame::OnCreate函数开始处、结尾处设置完断点后,按F5键,程序进入调试状态,可见在编辑窗口中,程序首先停止在应用程序类CMy2DCADApp 的构造函数中,说明程序最初构造的是应用程序类对象。
再按一次F5,编辑窗口中的黄色箭头停留在CMy2DCADApp::InitInstance函数的开始处,表明此时MFC框架中的WinMain函数开始执行,并调用了应用程序类的InitInstance函数。
再按一次F5,编辑窗口中的黄色箭头停留在InitInstance函数中添加文档模板对象处。
此时文档模板对象被创建。
再按一次F5,编辑窗口中的黄色箭头停留在文档类CMy2DCADDoc的构造函数开始处,表明开始创建文档对象。
再按一次F5,编辑窗口中的黄色箭头停留在框架窗口类CMainFrame的构造函数开始处,表明开始创建框架窗口类对象。
再按一次F5,编辑窗口中的黄色箭头停留在框架窗口类CMainFrame::OnCreate函数开始处,表明开始创建框架窗口。
再按一次F5,编辑窗口中的黄色箭头停留在视图类CMy2DCADView的构造函数开始处,表明开始创建视图类对象。
再按一次F5,编辑窗口中的黄色箭头停留在CMainFrame::OnCreate函数结尾处,表明视图窗口和框架窗口都已经创建完毕。
再按一次F5,编辑窗口中的黄色箭头停留在CMy2DCADApp::InitInstance函数的结尾处,表明程序初始化完毕。
详解VC++中的窗口与视口作者:郝婕来源:《创新科技》 2013年第5期郝婕(湖北工业大学,湖北武汉430068)在VC++的学习中,窗口(Window)与视口(Viewport)一向是初学者较难理解的难点,也是容易混淆的地方,本文从多个方面讲述VC++中窗口与视口的异同,以方便读者更准确,更全面的掌握窗口与视口的相关知识,为计算机绘图带来便利。
基于VC++的GDI常用坐标系统数据显示和图形绘制都需要在相应的坐标系中才能精确完成。
在计算机绘图中,常用的坐标系分为设备坐标和逻辑坐标两种。
1.设备坐标设备坐标是与设备高度相关的坐标,在VC++中的设备坐标系统中,单位用的是像素点,X值从左到右增大,Y值从上到下增大。
为满足各种不同需要,在VC++中又细分了以下3种设备坐标(1)全窗口坐标。
主要包括Windows程序中的窗口、滚动条、窗口框、标题条、菜单等。
在将逻辑单位转换成窗口坐标的过程中,可以通过GetWindowDC函数获取窗口设备环境。
(2)屏幕坐标。
范围包括整个显示器屏幕,屏幕的左上角为(0,0)。
屏幕坐标和全窗口坐标包括的对象是不一样的,屏幕坐标包含的对象是硬件外部设备,全窗口坐标包含的对象是Windows程序软件。
(3)客户区域坐标。
指Windows 应用程序的客户区域,客户区域的左上角为(0,0)。
屏幕区域坐标和客户区域坐标相互转换的函数为ScreenToClien和ClientToScreen。
2.逻辑坐标逻辑坐标不依赖于于设备,即它与设备的类型无关,也与设备具体的点阵密度大小无关。
在逻辑坐标中使用逻辑单位,计算机绘图中GDI函数LineTo在画出直线的时候,用户是不需要考虑输出设备的相关参数的。
窗口和视口数据显示和图形绘制并不是直接在屏幕上进行的,而是首先将图形绘制到一个具有逻辑坐标系的虚拟窗口中,然后再根据预先设置好的映射模式,将虚拟窗口中的图形或图像映射到屏幕或打印机等设备中。
这个虚拟的窗口被称作窗口(window)。
VC设计分割视图通用创建框架目前基于分割视图的应用开发十分流行,分割视图技术是在同一个框架窗口下同时显示多个视图的一项技术。
运用分割视图,可以在较短时间内给用户更多的信息量,从而使得用户界面更加的友好,增强了软件的可操作性。
本文提出一个分割视图的通用创建框架。
1.分割视图创建框架分割视图的创建大体上分为两个步骤:其一是创建分割窗体;然后就是处理鼠标和键盘等消息。
1)创建分割窗体MFC提供分割窗体类CsplitterWnd,它提供了很多对于分割窗体操作的成员函数,每一个分割窗体都是一个CsplitterWnd的对象。
本文提出的框架由于需要对定制的分割窗体进行扩充处理,所以首先从CsplitterWnd继承一个子类CFixSplitterWnd,然后每个分割窗体是一个CfixSplitterWnd的对象,这样以后只需要对CfixSplitterWnd进行改写后就可以增强分割窗体的功能。
(后面将提出这种改写)创建分割窗体最重要的函数是主框架类的OnCreateClient函数,它将在主框架创建的时候调用,本文将创建一个如下显示的分割窗体:图1则可以如下实现://成员变量声明CFixSplitterWnd m_wndSplitterH;//用于横向切割CFixSplitterWnd m_wndSplitterV;//用于纵向切割BOOL m_bCreateSplitter;//分割窗体的实现BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext*pContext){//对整个主框架进行混合分割视图BOOL bResult=m_wndSplitterV.CreateStatic(this,1,2);ASSERT(bResult);m_wndSplitterH.CreateStatic(&m_wndSplitterV,4,1,WS_CHILD| WS_VISIBLE,m_wndSplitterV.IdFromRowCol(0,1));//创建各自子窗片的对应的视图m_wndSplitterV.CreateView(0,0,RUNTIME_CLASS(CSceneView),CSize(600,600),pContext);m_wndSplitterH.CreateView(0,0,RUNTIME_CLASS(CPitchView),CSize(100,100),pContext);m_wndSplitterH.CreateView(1,0,RUNTIME_CLASS(CYawView),CSize(100,100),pContext);m_wndSplitterH.CreateView(2,0,RUNTIME_CLASS(CRollView),CSize(100,100),pContext);m_wndSplitterH.CreateView(3,0,RUNTIME_CLASS(CControlView),CSize(100,100),pContext);//设置窗格的初始化的大小m_wndSplitterV.SetRowInfo(0,IDEAL_RAWHEIGHT,0);m_bCreateSplitter=TRUE;//激活sceneview使得其可以接受命令消息m_wndSplitterV.SetActivePane(0,0,NULL);return bResult;}//主框架窗体大小发生变化,调节相应的窗体大小void CMainFrame::OnSize(UINT nType,int cx,int cy){CMDIFrameWnd::OnSize(nType,cx,cy);CRect rect;GetClientRect(rect);if(m_bCreateSplitter){m_wndSplitterV.SetColumnInfo(0,rect.Width()*3/4,10);m_wndSplitterV.SetColumnInfo(1,rect.Width()*1/4,10);m_wndSplitterH.SetRowInfo(0,rect.Height()/6,10);m_wndSplitterH.SetRowInfo(1,rect.Height()/6,10);m_wndSplitterH.SetRowInfo(2,rect.Height()/6,10);m_wndSplitterH.SetRowInfo(3,rect.Height()/2,10);}m_wndSplitterV.RecalcLayout();m_wndSplitterH.RecalcLayout();}注意m_wndSplitterH.CreateView中的第二个参数,这个参数将分割窗体和相应的视图类相对应。
VC实现对话框窗⼝任意分割个⼈认为简单问题最好就是直接贴源代码,⼀看就明⽩,说来说去反⽽弄不清楚,那我就少废话了,⾃⼰看吧,注释很清楚。
先来张图⽚1. 新建⼀个MFC对话框程序MySplitterDlg。
再插⼊两个Dialog资源,这⾥⼀定要选择IDD_FORMVIEW类别的对话框,分别新建类CMyFormView0 和CMyFormView1,基类别选CDialog,⼀定要选择CFormView。
2. CMySplitterDlg中增加WM_CREATE的消息响应,编辑OnCreate()int CMySplitterDlg::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CDialog::OnCreate(lpCreateStruct) == -1)return -1;// Because the CFRameWnd needs a window class, we will create a new one. I just copied the sample from MSDN Help.// When using it in your project, you may keep CS_VREDRAW and CS_HREDRAW and then throw the other three parameters.//需要注册窗⼝类CString strMyClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW,::LoadCursor(NULL, IDC_ARROW), (HBRUSH) ::GetStockObject(WHITE_BRUSH),::LoadIcon(NULL, IDI_APPLICATION));// Create the frame window with "this" as the parentm_pMyFrame = new CFrameWnd;m_pMyFrame->Create(strMyClass,"", WS_CHILD, CRect(0,0,300,300), this);m_pMyFrame->ShowWindow(SW_SHOW);// and finally, create the splitter with the frame as the parentm_cSplitter.CreateStatic(m_pMyFrame,1, 2); //在Frame⾥切分视图窗⼝为1×2,就是⼀⾏两列m_cSplitter.CreateView(0,0, RUNTIME_CLASS(CMyFormView0), CSize(100,100), NULL);//第⼀⾏⼀列m_cSplitter.CreateView(0,1, RUNTIME_CLASS(CMyFormView1), CSize(100,100), NULL);//第⼀⾏⼆列return 0;}3. 在CMySplitterDlg::OnInitDialog()中显⽰Frameint CMySplitterDlg::OnInitDialog(){CDialog::OnInitDialog();GetWindowRect(&cRect);ScreenToClient(&cRect);m_pMyFrame->MoveWindow(&cRect);m_pMyFrame->ShowWindow(SW_SHOW);return TRUE;}。
静态分割窗口与多视图实例所谓多视,是指在同一个框架窗口下同时显示多个视图。
通过运用这种技术,可以在框架的有限的空间内同时提供给用户更大的信息量,并且使得用户界面更加的友好,增强了软件的可操作性。
窗口分割的基本概念按照分割的时机的不同,窗口分割可以分为两类:动态分割和静态分割。
动态分割是指用户可以动态的分割和合并窗口。
动态分割最多可以有2行2列个窗口,并且所有的窗格只能使用同一种视图类。
静态分割是指窗口在创建时,分割窗格窗口的窗格已经创建好了,且窗格的数量和顺序不会改变了,窗格为一个分隔条所分割,用户可以拖动分割条调整相应的窗格的大小。
静态分割窗口最多可以有16行16列的窗格,但是各个窗格可以使用不同的视图类。
无论创建那一种分割,都必须在创建时指定最大的行数和列数,这些值是有CSplitterWnd 对象进行管理。
对于静态分割,必须创建指定数目的所有窗格以填满行和列。
而对于动态分割,第一个窗格将在框架创建CSplitterWnd对象时自动创建。
窗口分割支持类CSplitterWndCSplitterWnd类主要为窗口的风格提供了封装,窗口被分厂各个窗格后,又该类的对象负责管理。
对于windows而言,CSplitterWnd是一个真正的窗口,它完全占据了框架窗口的用户区域,而视图则占据了分割窗口的床片区域。
CSplitterWnd窗口不参与命令传递机制。
使用时,CSplitterWnd对象通常为其父框架窗口CFrameWnd或CMDIChildWnd(MID应用中)对象的内嵌成员。
CSplitterWnd对象创建过程如下。
在父框架窗口中嵌入CSplitterWnd类的对象成员;重载父框架窗口的CFrameWnd::OnCreateClient成员函数;从上一步重载的函数内部调用Create创建动态分割窗口或者调用CreateStatic创建静态的分割窗口。
下面介绍CsplitterWnd类的几个常用的函数创建动态分割窗口函数Create该函数用于动态创建分割窗口,同时将该窗口与类CSplitterWnd相关联,其生声明如下:BOOL Create(CWnd* pParentWnd, int nMaxRows, int MaxCol, SIZE sizeMin, CcreateContext* pContext, DOWRD dwStyle = WS_CHILD |WS_VISIBLE | WS_HSCROLL | WSVSCROLL | SPLS_DYNAMIC_SPLIT,UINT nID=AFX_IDW_PANE_FIRST);各主要参数的含义如下:pParentWnd:分割窗口的父框架窗口的指针nMaxRows和你MaxCols:行与列的最大值,二者均不大于二sizeMin:指定窗格被显示时的最小值。
用VC++在单文档界面中创建多视图一个单文档界面中存在多个视图,并且可以根据需要进行视图的动态切换,这是当前比较流行的界面风格,它可以满足许多用户在操作和显示方面的需要。
这种界面风格的主要代表软件是Outlook Express。
而用VC++实现这种风格的界面有一定难度,笔者就这个问题进行了研究,并归纳总结出两种实现方法(这些代码都在VC++ 6.0下调试通过),使用时关键注意步骤和实现思路,不必拘泥于代码的形式。
方法一:静态创建切换法步骤描述:1.在窗口显示之前先将需要切换的所有的视图对象创建好,除首先显示的视图以外,其他在创建时都设置为不可见属性。
CMyWinApp::InitInstance(){ ......m_pViews[0] = pView1;m_pViews[1] = (CView*) new CView2;CDocument* pCurrentDoc = ((CFrameWnd*) m_pMainWnd)->GetActiveDocument();// 初始化创建上下文相关指针CCreateContext newContext;newContext.m_pNewViewClass = NULL;newContext.m_pNewDocTemplate = NULL;newContext.m_pLastView = NULL;newContext.m_pCurrentFrame = NULL;newContext.m_pCurrentDoc = pCurrentDoc;// 最初激活视的ID为AFX_IDW_PANE_FIRST,//对新创建的视图增加这个值,注意对CSplitterWnd不能这样使用UINT viewID[2];viewID[1] = AFX_IDW_PANE_FIRST + 1;CRect rect(0, 0, 0, 0);for ( int nView=1; nView<NUMVIEWS; nView++ ) {// 创建新的视图,创建的视图在应用中永久存在,直到应用程序退出,//应用程序会自动删除新创建的视图m_pViews[nView]->Create(NULL, NULL,(AFX_WS_DEFAULT_VIEW &~WS_VISIBLE),// AFX_WS_DEFAULT_VIEW代表(WS_BORDER | WS_VISIBLE | WS_CHILD)rect, m_pMainWnd, viewID[nView], &newContext);}// 当文档模板创建视图的时候,会自动发送WM_INITIALUPDATE消息,//因此对于我们自己创建的视图,需要人工发送这条消息((CForm2*)m_pViews[1])->OnInitialUpdate();((CVswapView*)m_pViews[2])->OnInitialUpdate();......}2.视图的切换CView* CMyWinApp::SwitchView( UINT nIndex ){ASSERT( nIndex >=0 && nIndex < NUMVIEWS );CView* pNewView = m_pViews[nIndex];CView* pActiveView =((CFrameWnd*) m_pMainWnd)->GetActiveView();if ( !pActiveView ) // 当前没有激活的视图return NULL;if ( pNewView == pActiveView ) // 当前视图和需要切换的视图相同return pActiveView;// 交换视图的窗口ID,使RecalcLayout()可以工作UINT temp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID);::SetWindowLong(pActiveView->m_hWnd, GWL_ID, ::GetWindowLong(pNewView->m_hWnd, GWL_ID)); ::SetWindowLong(pNewView->m_hWnd, GWL_ID, temp);// 显示新的视图,隐藏前一个视图pActiveView->ShowWindow(SW_HIDE);pNewView->ShowWindow(SW_SHOW);((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewView);((CFrameWnd*) m_pMainWnd)->RecalcLayout();pNewView->Invalidate();return pActiveView;}。
VC++框架窗口、文档和视图尽管窗口、文档和视图是MFC的基础,但可能也是最不容易理解的部分,因为其概念比传统编程所需要的Windows函数更强一些,因此,须在本章做进一步详细讨论框架窗口、文档和视图的方法和技巧。
6.1框架窗口分两类:一是应用程序主窗口,另一类是文档窗口。
6.1.1主窗口和文档窗口主窗口(或称主框架窗口)是应用程序直接放在桌面(DeskTop)上的那个窗口,每个应用程序只能有一个窗口,主窗口的标题栏上往往显示应用程序的名称。
主窗口类的源文件名是MainFrm.h和MainFrm.cpp,其类名是CMainFrame。
单文档SDI程序主窗口类是从CFrameWnd派生来的。
多文档MDI程序主窗口类是从CMDIFrame Wnd派生的。
如果应用程序中还有工具栏(CToolBar)状态栏(CStatusBar),那么在CMainFrame 类还含有表示工具栏和状态栏的成员变量m_wndToolBar和m_wndStatusBar,并在CMainFrame的OnCreate函数中进行初始化。
文档窗口对于SDI程序来说,它和主窗口是一致的,即主窗口就是文档窗口;对于MDI程序,文档窗口是主窗口的子窗口。
见书244页图6.1所示。
文档窗口一般都有相应的可见边框,他的客户区(初了窗口标题栏、边框外的区域)是由相应的视图来构成的,可以说视图是文档窗口内的子窗口。
文档窗口时刻跟踪当前处于活动状态的视图的变化,并将用户或系统产生的命令消息传递给当前活动视图。
而主窗口负责管理各个用户交互对象(包括菜单、工具栏、状态栏以及加速键)并根据用户操作相应地创建或更新文档窗口及其视图。
在MDI应用程序中,MFC AppWizard创建的文档子窗口类的源代码文件是ChildFrm.h和ChildFrm.cpp,其类名是CChildFrame,它是从CMDIChildWnd派生的。
6.1.2窗口风格的设置窗口的风格决定了窗口的外观及功能,用户通过风格的设置增加或减少窗口中所包含的功能,这些功能一般都是由系统内部定义的,不需要用户去编程实现。
Visual C++6.0中实现三叉切分窗口与多视图
张中军
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2004(000)004
【摘要】一、引言。
当用户需要同时对文当的不同部分进行编辑时,常常会用到切分窗口;这些窗口可以都是相同的视,或者一个窗口为列表视,而另一个为树型视图。
应用程序框架有多种方式来表示多视图,切分窗口是其中的方式之一。
【总页数】3页(P28-30)
【作者】张中军
【作者单位】无
【正文语种】中文
【中图分类】TP31
【相关文献】
1.在Visual C++6.0中底层编程实现串口通信的方法 [J], 张仁彦;魏凤娟;吕晓龙
2.Visual C++6.0中实现运行程序图标在任务栏中的变换及去掉标题图标 [J], 冯富霞;李森贵
3.Visual C++6.0中使用ADO实现数据库大字段存取 [J], 马乐荣;高兴慧
4.在Visual C++6.0中套表打印的实现 [J], 蔡伟丰;常宝华
5.在Visual C++
6.0中通过ODBC实现SQL [J], 宗恒
因版权原因,仅展示原文概要,查看原文内容请购买。
一、关于CSplitterWnd类我们在使用CuteFtp或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中窗口被分割为若干的区域,真正做到了窗口的任意分割。
那么我们自己如何创建类似的界面,也实现窗口的任意的分割呢?在VC6.0中这就需要使用到CSplitterWnd类。
CSplitterWnd看上去像是一种特殊的框架窗口,每个窗口都被相同的或者不同的视图所填充。
当窗口被切分后用户可以使用鼠标移动切分条来调整窗口的相对尺寸。
虽然VC6.0支持从AppWizard中创建分割窗口,但是自动加入的分割条总是不能让我们满意,因此我们还是通过手工增加代码来熟悉这个类。
CSplitterWnd的构造函数主要包括下面三个。
BOOL Create(CWnd* pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,CCreateContext* pContext,DWORD dwStyle,UINT nID);功能描述:该函数用来创建动态切分窗口。
参数含义:pParentWnd 切分窗口的父框架窗口。
nMaxRows,nMaxCols是创建的最大的列数和行数。
sizeMin是窗格的现实大小。
pContext 大多数情况下传给父窗口。
nID是字窗口的ID号. BOOL CreateStatic(CWnd* pParentWnd,int nRows,int nCols,DWORD dwStyle,UINT nID)功能描述:用来创建切分窗口。
参数含义同上。
BOOL CreateView (int row,int col,CruntimeClass* pViewClass,SIZE sizeinit,CcreateContext* pContext);功能描述:为静态切分的窗口的网格填充视图。
在将视图于切分窗口联系在一起的时候必须先将切分窗口创建好。
VC 拆分窗口VC++的拆分窗口分为两种:一是静态拆分,二是动态拆分一:静态拆分静态拆分用到两个函数:BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );静态拆分窗口的行列数在拆分窗口被创建时就设置好了,用户不能更改。
但是用户可以缩放各行各列。
一个静态拆分窗口最多可以包含16行16列。
在静态拆分窗口中很容易使用两个以上不同种类的视图,因为您可以在每个窗格中指定所用的视图类型。
给框架窗口添加静态拆分视图的过程如下:1. 给框架窗口类添加一个CsplitterWnd数据成员2. 覆盖框架窗口的OnCreateClient函数,并调用CsplitterWnd::CreateStatic来创建静态拆分视图。
3. 使用CsplitterWnd:: CreateView在每个静态拆分窗口的窗格中创建视图。
下面例子就是创建一个静态拆分:BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CcreateContext* pContext){if(!m_wndSplitter.CreateStatic(this,1, 2) || !m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CtextView), Csize(128, 0), pContext) ||!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CpictureView), Csize(0, 0),pContext) )return FALSE;return TRUE;}递给CreateStatic的参数指定了拆分窗口的父亲以及拆分窗口包含的行列数。
VC++6.0主要工作窗口1) Workspace窗口Workspace窗口显示了当前工作区中各个工程的类、资源和文件信息,当新建或打开一个工作区后,Workspace窗口通常就会出现三个树视图:ClassView(类视图)、ResourceView(资源视图)和FileView(文件视图),如果在VC6.0企业版中打开了数据库工程,还会出现第四个视图DataView(数据视图)。
如同前面所述,在Workspace 窗口的各个视图内单击鼠标右键可以得到很多有用的关联菜单。
ClassView显示当前工作区中所有工程定义的C++类、全局函数和全局变量,展开每一个类后,可以看到该类的所有成员函数和成员变量,如果双击类的名字,VC6.0会自动打开定义这个类的文件,并把文档窗口定位到该类的定义处,如果双击类的成员或者全局函数及变量,文档窗口则会定位到相应函数或变量的定义处。
ResourceView显示每个工程中定义的各种资源,包括快捷键、位图、对话框、图标、菜单、字符串资源、工具栏和版本信息,如果双击一个资源项目,VC6.0就会进入资源编辑状态,打开相应的资源,并根据资源的类型自动显示出Graphics、Color、Dialog、Controls 等停靠式窗口。
FileView显示了隶属于每个工程的所有文件。
除了C/C++源文件、头文件和资源文件外,我们还可以向工程中添加其它类型的文件,例如Readme.txt等,这些文件对工程的编译连接不是必需的,但将来制作安装程序时会被一起打包。
同样,在FileView中双击源程序等文本文件时,VC6.0会自动为该文件打开一个文档窗口,双击资源文件时,VC6.0也会自动打开其中包含的资源。
在FileView中对着一个工程单击鼠标右键后,关联菜单中有一个“Clean”命令,在此特地要解释一下它的功能:VC6.0在建立(Build)一个工程时,会自动生成很多中间文件,例如预编译头文件、程序数据库文件等,这些中间文件加起来的大小往往有数兆,很多人在开发一个软件期间会使用办公室或家里的数台机器,如果不把这些中间文件删除,在多台机器之间使用软盘拷贝工程就很麻烦。
VSCode的多窗口管理技巧在日常的编程工作中,一个高效的代码编辑器是必不可少的工具。
VSCode(Visual Studio Code)作为一款强大而且免费的开源编辑器,越来越受到程序员的喜爱。
其中,多窗口管理技巧是提高编程效率的重要方面之一。
本文将介绍一些VSCode的多窗口管理技巧,帮助您更好地利用这款编辑器。
I. 透视图VSCode的透视图(Perspective)功能是一种非常实用的多窗口管理方式。
通过使用透视图,您可以将代码编辑区域划分为多个工作区,从而同时查看和编辑多个文件。
透视图的使用非常简单,只需点击左下角的方框图标,即可弹出透视图。
在透视图中,您可以添加、删除和切换工作区,实现对不同文件的灵活管理。
II. 分屏功能除了透视图,VSCode还提供了分屏功能,允许您同时在一个编辑器窗口中查看和编辑多个文件。
通过使用键盘快捷键“Ctrl+\\”或者右键点击编辑器标签并选择“拆分编辑器”来触发分屏功能。
一旦启用分屏,您可以在不同的编辑器窗口中打开、切换和关闭文件,实现对多个文件的高效浏览和编辑。
此外,您还可以通过调整编辑器窗口的大小和位置,自定义分屏布局,满足自己的编程需求。
III. 驻留窗口VSCode的驻留窗口(Sticky Window)功能可以实现快速访问和编辑指定的文件或文件夹。
通过将文件或文件夹添加到驻留窗口,您可以随时打开并在编辑器中查看和修改。
要使用驻留窗口功能,只需右键点击文件或文件夹,选择“添加到驻留窗口”选项即可。
在下次打开VSCode时,添加到驻留窗口的文件或文件夹将自动显示在侧边栏中,方便您快速访问和编辑。
IV. 自定义布局除了上述提到的透视图、分屏和驻留窗口功能,VSCode还提供了丰富的自定义布局选项。
通过自定义布局,您可以根据自己的工作流程和需求,创建适合自己的窗口和面板排列方式,提高编程效率。
要自定义布局,只需在VSCode的设置中搜索"keybindings.json"文件,然后编辑该文件。
VC++例说Windows窗口、视口以及GDI映射模式2011-04-28 11:31:54| 分类:默认分类| 标签:窗口视口 vc++ |字号大中小订阅在Windows应用程序中,只要进行绘图,就要使用GDI坐标系统。
Windows提供了几种映射方式,每一种映射都对应着一种坐标系。
例如,绘制图形时,必须给出图形各个点在客户区的位置,其位置用x和y 两个坐标表示,x表示横坐标,y表示纵坐标。
在所有的GDI绘制函数中,这些坐标使用的是一种“逻辑单位”。
当GDI函数将结果输出送到某个物理设备上时,Windows将逻辑坐标转换成设备坐标(如屏幕或打印机的像素点)。
本文讨论了图形环境中的各个映射模式,包括它们是什么,怎么工作的,以及它们真正的含义。
一、窗口、视口以及映射模式基本概念强调一个网上和教科书上没有将清楚但是至关重要的概念:窗口和视口其实是同一块矩形区域,两者坐标系的原点是同一个点。
窗口和视口的区别仅仅是单位不同。
窗口和视口都不是指显示屏或打印机上的区域,我们看到显示屏上的物体实际上是显示在“设备环境”上的,由于视口(也就是窗口)区域与设备环境的左手坐标系第一象限xoy平面有交集,我们才能看到视口中的物体。
窗口的变换和视口的变换的目的是一样的,都是为了将物体显示在设备环境中,只不过由于视口中使用像素作为单位也就是显示屏的设备坐标,所以往往在视口中进行调整dc比较直观一些。
(一)逻辑坐标。
逻辑坐标即是世界坐标系下的坐标。
逻辑坐标与设备无关,客观世界中的场景可以由世界窗口或视口中进行描述,在窗口中进行描述时使用世界坐标系中的坐标单位也即逻辑坐标,在视口中进行描述使用的是设备坐标。
(二)设备坐标。
图形输出时,Windows将GDI函数中指定的逻辑坐标映射为设备坐标。
在屏幕显示的设备坐标系统中,单位以像素点为准,水平值从左到右增大(正方向向右),垂直值从上到下增大(正方向向下)。
注意设备坐标系的原点永远不会移动,它们仅仅与物理设备有关。
VS2010窗口拆分StepbyStepVS2010窗口拆分Step by Step本文档以一个实例,介绍VC窗口拆分的具体步骤和方法。
这里,我们将一个单文档窗口拆分为4个窗口。
下面具体介绍编程的步骤。
1、在VS2010下,创建一个单文档工程,取名:WndSeprt注意:清除高级框架选项。
编译、测试,系统显示如下界面。
2、如图,点击类视图标签,打开主框架类(CMainFrame)的头文件(MainFrm.h)。
添加一个保护类型的变量,如下protected:…CSplitterWnd m_wndSplitter; //hwp add3、选择主框架类(CMainFrame),在窗口右边点击“重写”,重载主框架类(CMainFrame)的OnCreateClient成员函数。
打开OnCreateClient成员函数,添加如下代码:BOOL ret=m_wndSplitter.CreateStatic(this,2,2);//将原窗口拆分为2行2列,4个窗口if(!ret){TRACE("SplitCreate Failed...\n");return ret;}//计算窗口尺寸CRect rt;GetClientRect(&rt);CSize czPane(rt.Width()/2, rt.Height()/2);//4个窗口的大小相同,其高、宽为原窗口的一半//创建第一个窗口,窗口位于原窗口的第0行,第0列。
窗口类型为:CListView ——列表窗体pContext->m_pCurrentFrame=this;ret=m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CLanListView),czPane,pContext);if(!ret){TRACE("SplitCreateView Failed(1)...\n");return ret;}//创建第二个窗口,窗口位于原窗口的第0行,第1列。
切分窗口分为两类:动态切分和静态切分。
下面主要是静态切分窗口实现的步骤及相关代码。
(1)首先用MFC创建一个单文档应用程序SDI(名称可自拟)。
(2)打开框架窗口类MainFrame.h头文件,为CMainFrame类添加一个保护型的切分窗口数据成员,定义如下:Proctected:CSplitterWnd m_wndsplitter;(3)用MFC 为静态切分窗口创建一个新视图类CView1用来相互关联,这个类的基类是CView。
(4)用MFC ClassWizard为CMainFrame类添加OnCreateClient函数重载,并添加相关代码:BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lps,CCreateContext*pContext){CRect rc;GetClientRect(rc);CSize paneSize(rc.Width()/2,rc.Height());m_wndsplitter.CreateStatic(this,1,2);m_wndsplitter.CreateView(0,0,RUNTIME_CLASS(CView1),paneSize,pContext);m_wndsplitter.CreateView(0,1,RUNTIME_CLASS(CView1),paneSize,pContext);return TRUE;}(5)在MainFrame.cpp文件中加入视图CView1的包含文件:#include“CView1.h”(6)编译即可。
(7)*************************************************************对以上的部分说明*************************************************************1.以上的代码完成的任务是将一个窗口分割为两个窗口,若想分为n个窗口,可将CSize paneSize(rc.Width()/2,rc.Height());m_wndsplitter.CreateStatic(this,1,2);此程序中的数值进行修改,举例如下:想将一个窗口分割为2*3的窗口形式,可作如下变更:CSize paneSize(rc.Width()/2,rc.Height()/3);m_wndsplitter.CreateStatic(this,2,3);同时也不能忘了在原先程序的基础上添加下面的程序:m_wndsplitter.CreateView(1,0,RUNTIME_CLASS(CView1),paneSize,pContext);m_wndsplitter.CreateView(1,1,RUNTIME_CLASS(CView1),paneSize,pContext);m_wndsplitter.CreateView(2,0,RUNTIME_CLASS(CView1),paneSize,pContext);m_wndsplitter.CreateView(2,1,RUNTIME_CLASS(CView1),paneSize,pContext);2. 添加了这个函数后BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lps,CCreateContext*pContext)函数体内的返回值为系统添加的,因此要将返回值修改为return TRUE;。
VC随笔切分窗口和多视图动态切分窗口:动态切分窗口不能包含多于4个的窗格,要想得到4个以上的窗格,可以使用静态切分窗口。
动态切分窗口中的几个窗格通常使用的是同一个视图类。
创建动态切分窗口的方式共有3种:1、在创建应用程序时,利用应用程序向导AppWizard的选项设置切分窗口2、在创建了应用程序之后,通过添加组件对窗口进行切分3、通过手动添加代码编程的方式使用AppWizard创建动态切分:在MFC AppWizard Step 4 of 6对话框中,单击Advanced按钮,弹出Advanced Options对话框,选择Window Styles 选项卡,选中该页的Use split window检查框。
使用Splitter Bar组件:选择Project|Add To Project|Components and Controls...菜单,弹出Components and Controls Gallery对话框。
双击Visual C++ Components目录,选择Splitter Bar项,插入Splitter Bar组件。
运行程序,打开【查看】菜单或者是【窗口】菜单,找不到前面使用AppWizard添加动态切分时的【分隔】菜单项。
说明Splitter Bar组件的方式并没有添加相应的菜单项,程序员可以自己添加上去。
注意:菜单的Caption(标题)可以随便设定,但注意菜单项的ID必须是ID_WINDOW_SPLIT。
ID_WINDOW_SPLIT 是系统预先指定的,程序员一般不需要对此命令ID添加命令消息处理函数,就可以实现分隔,因为MFC应用程序框架中已经对该命令ID的消息进行了处理。
手动添加代码:1、在框架窗口类(对单文档为主框架窗口,对多文档为子框架窗口)中声明一个CSplitterWnd类的成员变量m_wndSplitter2、使用ClassWizard为框架窗口类添加OnCreateClient函数注意:这里使用ClassWizard是重写父类的虚函数,而不是添加消息处理3、在OnCreateClient函数中调用CSplitterWnd类的成员函数Create产生动态切分4、为应用程序添加一个ID为ID_WINDOW_SPLIT的菜单项CSplitterWnd切分窗口类:CSplitterWnd的成员函数中,有3个使用非常频繁1、Create函数创建一个动态的切分窗口2、CreateStatic函数创建一个静态的切分窗口3、CreateView函数为静态切分窗口创建视图窗口。
在框架显示一个静态切分窗口之前,该窗口的所有视图窗格都必须已被创建好。
当动态切分窗口时,此函数被框架窗口自动调用。
静态切分窗口:静态切分窗口是指在窗口创建时,切分窗口的窗格就已经创建好了,且窗格的数量和顺序不会改变。
最多可以支持16行×16列的窗口(即256个窗格),但是必须在应用程序中创建窗格,而且不同的窗口往往使用不同的视图类。
创建静态切分的步骤:1、在框架窗口类中声明一个CSplitterWnd类的成员变量m_wndSplitter2、使用ClassWizard为框架窗口类添加OnCreateClient函数3、在OnCreateClient函数中调用CSplitterWnd::CreateStatic产生静态切分4、在OnCreateClient函数中调用CSplitterWnd::CreateView产生每个切分的视图窗口为2DCAD应用程序添加静态切分功能:1、声明切分窗口类对象m_wndSplitter为主框架窗口类CMainFrame添加保护成员变量m_wndSplitter,代码如下:CSplitterWnd m_wndSplitter; //用于产生静态切分2、在框架窗口类中添加OnCreateClient函数打开ClassWizard,选中MessageMaps选项卡,在Class name中选择CMainFrame类,在ObjectIDs列表中选择CMainFrame,在Message列表框中双击OnCreateClient项,为框架窗口添加OnCreateClient函数。
3、使用CreateStatic产生静态切分在OnCreateClient函数中添加如下代码,就可以产生1×2的静态切分窗口:m_wndSplitter.CreateStatic(this, 1, 2);4、使用CreateView产生每个视图窗口当用户建立一静态切分窗口时,应当同时建立窗口内的所以区域。
可以在OnCreateClient函数中添加如下代码来为第一行第一列的窗格产生视图:m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMy2DCADView),CSize(450, 250), pContext);其中,第3个参数,视图类的执行期类CRuntimeClass指针,可以用宏RUNTIME_CLASS来获得。
注意:(1)必须为每一个静态切分窗口创建视图窗口,不能漏掉一个(2)由于使用到了视图类,因此,必须包含相应的类的头文件。
在MainFrm.cpp文件的开始部分包括以下两个头文件:#include "2DCADDoc.h"#include "2DCADView.h"(3)产生静态切分后,就不能再调用默认情况下的基类的OnCreateClient函数。
因此,应该将下面的代码删除或者注释掉:// return CFrameWnd::OnCreateClient(lpcs, pContext);最后,完整的CMainFrame::OnCreateClient函数代码如下:BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext){// TODO: Add your specialized code here and/or call the base class//使用CreateStatic函数产生静态切分m_wndSplitter.CreateStatic(this, //父窗口指针1, //行数2); //列数//使用CreateView为第1个窗格产生视图m_wndSplitter.CreateView(0, 0, //窗格的行、列序数RUNTIME_CLASS(CMy2DCADView), //视图类CSize(450, 250), //初始化大小pContext); //父窗口的创建参数//使用CreateView为第2个窗格产生视图m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMy2DCADView),CSize(450, 250), pContext);return 1; //不再调用基类的OnCreateClient函数// return CFrameWnd::OnCreateClient(lpcs, pContext);}这时,用户在一个视图中所作的修改还不能立刻反映到其他视图窗口中,还应添加相应的通知视图重画的代码。
5、通知视图重画文档类有一个名为UpdateAllViews的函数,可以在文档数据发生改变时通知所有的视图窗口重画。
在视图类的OnLButtonDown函数中每个调用SetModifiedFlag函数的后面立即调用UpdateAllViews的函数,代码如下:...pDoc->SetModifiedFlag(); //设置文档“脏”标志pDoc->UpdateAllViews(this); //重画所有视图...向当前工程中插入新类的两种方式:1、使用New Class对话框添加新类(1)MFC ClassWizard中的New Class对话框使用ClassWizard对话框中的Add Class...按钮下的New...菜单项可以打开MFC ClassWizard对话框下的New Class 对话框。
这个对话框用来向当前工程中添加派生自MFC类库的新类。
(2)通用的New Class对话框单击菜单命令Insert|New Class...可以打开一个通用的New Class对话框。
实际上通用的New Class对话框相当于包含了3个对话框,用于产生几乎所有不同的类。
2、使用插入包含类定义的文件到当前工程中(1)将所需类的.h、.cpp文件复制到目标工程目录下(2)打开目标工程,单击Project|Add To Project|Files...菜单项插入所需类的.h、cpp文件到目标工程中(3)在所需类的.cpp文件中,去掉包含原来的工程的头文件语句(比如2DCAD.h),添加包含目标工程的头文件语句(比如Mut.h)添加新的视图类:为2DCAD工程添加一个新的视图类CTextView,单击Insert|New Class...菜单项,在New Class对话框中确保Class type中选择的是MFC Class,在Name编辑框中输入CTextView,在Base class下拉列表中指定基类为CEditView。
添加了新的视图类之后,就可以在框架窗口的OnCreateClient函数中调用CreateView函数时使用这个新视图类了。
接下来使用CTextView作为静态切分窗口中第二个窗格的视图类,在OnCreateClient函数中修改创建第二个窗口视图的代码如下://使用CreateView为第2个窗格产生视图m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CTextView),//使用文本视图类CSize(250, 250), pContext);由于使用到了新的视图类,因此,应该在MainFrm.cpp文件的开始部分添加包含CTextView类头文件的代码:#include "TextView.h"注意:CEditView封装了编辑框的功能,因此,如果要编写文字处理软件,可以使用CEditView作为视图基类。
CEditView最多支持64K的文本,如果需要支持更丰富的文本,可以使用CRichEditView作为视图基类,但要包含头文件afxrich.h。
表单视图类CFormView:CFormView就是可以在其中包含许多控件的视图基类。
这个类也像CDialog对话框类一样,封装了数据交换功能。
甚至可以将CFormView理解为作为视图的对话框。
1、创建对话框模板资源(1)添加对话框模板,ID为IDD_FORMVIEW(2)修改属性在Style选项卡中,设置Style选项为Child,Border选项为None,并去掉对Title Bar复选框的勾选。