鉴于CSplitterWnd资料很少(MSDN上也说的很简单,Sample我也就不想吐槽了),同时网上博客又几乎是千篇一律的转载。现将个人的一点经验拿出来和大家分享,希望对他人有所帮助。不足之处还望批评指正。

最终效果如下:

分割窗体就是把一个窗体分割成多个面板,面板就是放各种控件或视图的容器。分割窗体有两种形式,静态和动态。两种形式的区别在于动态的可以收拢和展开,静态的则不能。动态分割只能创建2*2的分割窗口,而静态分割可以创建16*16的分割窗口。

好了,进入正题。在VS或VC++6.0中建立一个多文档或者单文档,按照向导一直下一步即可。本文创建的是多文档,单文档相对简单一些。

创建好之后,在ChildFrm.h中添加两个窗口分割变量:

// Attributes
protected:CSplitterWnd m_wndSplitter1;CSplitterWnd m_wndSplitter;

然后选择工程的类视图,右键ChildFrm属性,添加Overrides中的OnCreateClient方法。如果是单文档的话在MainFrm中添加!

修改OnCreateClient方法如下:

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
{// Create 2*2 nested dynamic splitter// TODO: Add your specialized code here and/or call the base classreturn m_wndSplitter.Create(this,2, 2,          // TODO: adjust the number of rows, columnsCSize(10, 10),   // TODO: adjust the minimum pane sizepContext);//return CMDIChildWnd::OnCreateClient(lpcs, pContext);Create a  static splitter with 1 rows, 3 columns//m_wndSplitter.CreateStatic(this, 1, 3);  // create a splitter with 1 rows, 3 columns//m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CViewLeft), CSize(0, 0), pContext);   // create view with 0 rows, 0 columns//m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CViewMiddle), CSize(0, 0), pContext);   // create view with 0 rows, 1 columns//m_wndSplitter.CreateView(0, 2, RUNTIME_CLASS(CViewRight), CSize(0, 0), pContext);    // create view with 0 rows, 2 columns//m_wndSplitter.SetColumnInfo(0, 400, 10); // set the width of column, 0 column, ideal width is 200dip,min width is 10dip//m_wndSplitter.SetColumnInfo(1, 400, 10);    // set the width of column, 0 column, ideal width is 200dip,min width is 10dip//m_wndSplitter.SetColumnInfo(2, 400, 10);    // set the width of column, 0 column, ideal width is 200dip,min width is 10dipm_wndSplitter.SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE);//Create a static splitter with 2 rows,1 columnsif (!m_wndSplitter.CreateStatic(this, 2, 1, WS_CHILD|WS_VISIBLE)){TRACE("Failed to Create StaticSplitter\n");return NULL;}//set viewpContext->m_pNewViewClass = RUNTIME_CLASS(CViewRight);CRect rect;     this->GetClientRect(&rect);SIZE size;size.cx = rect.Width();size.cy = rect.Height()/3;m_wndSplitter.CreateView(0, 0, pContext->m_pNewViewClass, size, pContext);//m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CViewLeft), CSize(0, 0), pContext);  // create view with 0 rows, 0 columns//m_wndSplitter.SetRowInfo(0, 200, 10);    // set the width of column, 0 column, ideal width is 250dip,min width is 10dippContext->m_pNewViewClass = RUNTIME_CLASS(CViewMiddle);if (!m_wndSplitter1.Create(&m_wndSplitter,     // our parent window is the first splitter2, 2,          // TODO: adjust the number of rows, columnsCSize(10, 10), // TODO: adjust the minimum pane sizepContext,WS_CHILD|WS_VISIBLE|SPLS_DYNAMIC_SPLIT|WS_HSCROLL|WS_VSCROLL,m_wndSplitter.IdFromRowCol(1, 0))){TRACE("Failed to create the nested dynamic splitter\n");}return TRUE;
}

RUNTIME_CLASS是MFC中的一个宏,用来动态创建一个类。
这里是我做了三种分割方式的测试,第一种是直接创建了一个2*2的动态分割窗口,没有修改视图;第二种是创建的一个一行三列的静态分割窗口,并且分别为之创建了三个视图,然后设置的了每一列的宽度;最后一种是静态分割和动态分割嵌套使用,先使用静态分割,将整个窗口分割成为两行一列,分割完成后为第一行创建视图,设置视图高度为整个窗口的1/3,然后更改视图,使得随后动态分割的窗口绑定不同的视图,再对第二行使用动态分割,将第二行分割成2*2的动态分割窗口。

CViewLeft、CViewRight、CViewMiddle这三个类均继承自CView,只需重写下每个类的OnDraw方法即可

void CViewLeft::OnDraw(CDC* pDC)
{CDocument* pDoc = GetDocument();// TODO: add draw code hereCPaintDC* dc = (CPaintDC*)pDC;CRect rect,fillrect;CBrush brush;brush.CreateSolidBrush(RGB(255, 0, 0));this->GetClientRect(&rect);dc->FillRect(&rect,&brush);brush.DeleteObject();
}
void CViewMiddle::OnDraw(CDC* pDC)
{CDocument* pDoc = GetDocument();// TODO: add draw code hereCPaintDC* dc = (CPaintDC*)pDC;CRect rect,fillrect;CBrush brush;brush.CreateSolidBrush(RGB(0, 255, 0));this->GetClientRect(&rect);dc->FillRect(&rect,&brush);brush.DeleteObject();
}
void CViewRight::OnDraw(CDC* pDC)
{CDocument* pDoc = GetDocument();// TODO: add draw code hereCPaintDC* dc = (CPaintDC*)pDC;CRect rect,fillrect;CBrush brush;brush.CreateSolidBrush(RGB(0, 0, 255));this->GetClientRect(&rect);dc->FillRect(&rect,&brush);brush.DeleteObject();
}

一个CSplitterWnd对象通常被嵌入CFrameWnd或CMDIChildWnd父对象。一般使用Create或者CreateStatic分割窗口完毕,可使用SetColumnInfo和SetRowInfo来调整这些最小值,为使用其设置过的行或列则会自动分配大小。

定制属于自己的SplitterWnd:拖动滚动条时只显示一行或者一列

/*****************************************************************Filename:         Splitter.h
Contents:           Implemetation of CSplitter classAuthors:
Created date:
Last Modified date:
Revision History: Used by:
Uses:
Build Notes:        See Also:           Copyright:      (c) 2015 by All rights reserved.                           *****************************************************************/#pragma once// CSplitterclass CSplitter : public CSplitterWnd
{DECLARE_DYNCREATE(CSplitter)// Attributes
public:// this var saves the size of the pane before floatingint m_iSize;// this var saves the pane orientation before floatingBOOL m_bHorizontal;SIZE m_szMinimumSize;
public:CSplitter();// added funciton for customize the splitter
public:/****************************************Function name:  void CSplitter::SetMinimumSize(const int cx = -1, const int cy = -1)Purpose:        Replaces a view with another in a given pane.Only for static splitters.Arguments:       row, col: pane coordspViewClass: a runtime class of the viewsize: min sizeReturn value: TRUE if successful, FALSE otherwise.**************************************/void SetMinimumSize(const int cx = -1, const int cy = -1);// Operations
public:/****************************************Function name:  void CSplitter::ReplaceView()Purpose:       Replaces a view with another in a given pane.Only for static splitters.Arguments:       row, col: pane coordspViewClass: a runtime class of the viewsize: min sizeReturn value: TRUE if successful, FALSE otherwise.**************************************/BOOL ReplaceView(int row, int col, CRuntimeClass* pViewClass, SIZE size);/****************************************Function name: BOOL CSplitter::EmbedView()Purpose:     Resurrects the former column or rowafter the floating dlg is closedArguments:       noneReturn value:   none**************************************/void EmbedView();// overridables
public:/****************************************Function name:  BOOL CSplitter::SplitRow()Purpose:      Overrides the default function.Arguments:       cyBefore - pos of the splitReturn value:    TRUE if successful, FALSE otherwise.**************************************/virtual BOOL SplitRow(int cyBefore);/****************************************Function name:  BOOL CSplitter::SplitColumn()Purpose:       Overrides the default function.Arguments:       cxBefore - pos of the splitReturn value:    TRUE if successful, FALSE otherwise.**************************************/virtual BOOL SplitColumn(int cxBefore);/****************************************Function name:   BOOL CSplitter::DeleteRow()Purpose:     Overrides the default function.Arguments:       rowDelete - row to deleteReturn value:  none**************************************/virtual void DeleteRow(int rowDelete);/****************************************Function name:    BOOL CSplitter::DeleteColumn()Purpose:      Overrides the default function.Arguments:       colDelete - row to deleteReturn value:  none**************************************/virtual void DeleteColumn(int colDelete);/****************************************Function name: BOOL CSplitter::GetActivePane()Purpose:     Overrides the default function.Arguments:       pRow and pCol - coords of the active paneReturn value:  the active paneComments:        This function may return active panethat is not in this splitter at all,as opposed to the base class' implementation,which always check for it. In this case, thepRow and pCol will be -1**************************************/virtual CWnd* GetActivePane(int* pRow = NULL, int* pCol = NULL);// Implementation
public:virtual ~CSplitter();// Generated message map functions//{{AFX_MSG(CSplitter)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnMouseMove(UINT nFlags, CPoint point);//}}AFX_MSGDECLARE_MESSAGE_MAP()
};/
// Splitter.cpp : implementation file
//#include "stdafx.h"
#include "sample.h"
#include "Splitter.h"/*****************************************************************Filename:            Splitter.cpp
Contents:           Implemetation of CSplitter classAuthors:
Created date:
Last Modified date:
Revision History:Used by:
Uses:
Build Notes:See Also:           Copyright:      (c) 2015 by All rights reserved.                           *****************************************************************/// Embedded Version Control String:
static char *versionstring =    "@(#) Splitter.cpp 8/25/15";#include "stdafx.h"
#include "splitter.h"#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif/
// CSplitterIMPLEMENT_DYNCREATE(CSplitter, CSplitterWnd)CSplitter::CSplitter()
{ m_iSize = 0;// by default, we split verticallym_bHorizontal = FALSE;m_szMinimumSize.cx = -1;// not setm_szMinimumSize.cy = -1;// not set
}CSplitter::~CSplitter()
{
}/****************************************
Function name:  void CSplitter::ReplaceView()
Purpose:        Replaces a view with another in a given pane.
Only for static splitters.
Arguments:      row, col: pane coords
pViewClass: a runtime class of the view
size: min size
Return value:   TRUE if successful, FALSE otherwise.
**************************************/
BOOL CSplitter::ReplaceView(int row, int col, CRuntimeClass* pViewClass, SIZE size)
{CCreateContext context;BOOL bSetActive;if ((GetPane(row,col)->IsKindOf(pViewClass))==TRUE)return FALSE;// Get pointer to CDocument object so that it can be used in the creation // process of the new viewCDocument * pDoc= ((CView *)GetPane(row,col))->GetDocument();CView * pActiveView=GetParentFrame()->GetActiveView();if (pActiveView==NULL || pActiveView==GetPane(row,col))bSetActive=TRUE;elsebSetActive=FALSE;// set flag so that document will not be deleted when view is destroyedpDoc->m_bAutoDelete=FALSE;    // Delete existing view ((CView *) GetPane(row,col))->DestroyWindow();// set flag back to default pDoc->m_bAutoDelete=TRUE;// Create new view                      context.m_pNewViewClass=pViewClass;context.m_pCurrentDoc=pDoc;context.m_pNewDocTemplate=NULL;context.m_pLastView=NULL;context.m_pCurrentFrame=NULL;CreateView(row,col,pViewClass,size, &context);CView* pNewView = (CView*)GetPane(row, col);if (bSetActive==TRUE)GetParentFrame()->SetActiveView(pNewView);RecalcLayout(); GetPane(row,col)->SendMessage(WM_PAINT);return TRUE;
}/****************************************
Function name:  BOOL CSplitter::SplitRow()
Purpose:        Overrides the default function.
Arguments:      cyBefore - pos of the split
Return value:   TRUE if successful, FALSE otherwise.
**************************************/
BOOL CSplitter::SplitRow(int cyBefore)
{// first, leave only one columnwhile (m_nCols > 1)DeleteColumn(m_nCols - 1);BOOL bRet = CSplitterWnd::SplitRow(cyBefore);// Show horizontal scroll bar of the upper view window,//  hide all the others.CWnd    *pUpperWnd = GetPane(0, 0);pUpperWnd->ShowScrollBar(SB_VERT, 0);pUpperWnd->ShowScrollBar(SB_HORZ, 1);if (m_nRows > 1) {CWnd    *pLowerWnd = GetPane(1, 0);pLowerWnd->ShowScrollBar(SB_VERT, 0);pLowerWnd->ShowScrollBar(SB_HORZ, 0);}return bRet;
}/****************************************
Function name:  BOOL CSplitter::SplitColumn()
Purpose:        Overrides the default function.
Arguments:      cxBefore - pos of the split
Return value:   TRUE if successful, FALSE otherwise.
**************************************/
BOOL CSplitter::SplitColumn(int cxBefore)
{// first, leave only one rowwhile (m_nRows > 1)DeleteRow(m_nRows - 1);BOOL bRet = CSplitterWnd::SplitColumn(cxBefore);// Show vertical scroll bar of the left view window,//    hide all the others.CWnd    *pLeftWnd = GetPane(0, 0);pLeftWnd->ShowScrollBar(SB_VERT, 1);pLeftWnd->ShowScrollBar(SB_HORZ, 0);if (m_nCols > 1) {CWnd   *pRightWnd = GetPane(0, 1);pRightWnd->ShowScrollBar(SB_VERT, 0);pRightWnd->ShowScrollBar(SB_HORZ, 0);}return bRet;
}/****************************************
Function name:  BOOL CSplitter::DeleteRow()
Purpose:        Overrides the default function.
Arguments:      rowDelete - row to delete
Return value:   none
**************************************/
void CSplitter::DeleteRow(int rowDelete)
{// save the state of the pane before deleting// note: since we always insert it later as a pane #0,// save the size of the pane #0. Later we can save the pane id too.m_bHorizontal = TRUE;int iDummy;GetRowInfo(0, m_iSize, iDummy);CSplitterWnd::DeleteRow(rowDelete);
}/****************************************
Function name:  BOOL CSplitter::DeleteColumn()
Purpose:        Overrides the default function.
Arguments:      colDelete - row to delete
Return value:   none
**************************************/
void CSplitter::DeleteColumn(int colDelete)
{// save the state of the pane before deleting// note: since we always insert it later as a pane #0,// save the size of the pane #0. Later we can save the pane id too.m_bHorizontal = FALSE;int iDummy;GetColumnInfo(0, m_iSize, iDummy);CSplitterWnd::DeleteColumn(colDelete);
}/****************************************
Function name:  BOOL CSplitter::EmbedView()
Purpose:        Resurrects the former column or row
after the floating dlg is closed
Arguments:      none
Return value:   none
**************************************/
void CSplitter::EmbedView()
{if (m_bHorizontal && (m_nRows < m_nMaxRows))SplitRow(m_iSize + m_cyBorder);else if (m_nCols < m_nMaxCols)SplitColumn(m_iSize + m_cxBorder);
}BEGIN_MESSAGE_MAP(CSplitter, CSplitterWnd)//{{AFX_MSG_MAP(CSplitter)ON_WM_CREATE()ON_WM_MOUSEMOVE()//}}AFX_MSG_MAP
END_MESSAGE_MAP()int CSplitter::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CSplitterWnd::OnCreate(lpCreateStruct) == -1)return -1;RECT ClientRect;if (::GetClientRect(lpCreateStruct->hwndParent, &ClientRect)){m_iSize = (ClientRect.left - ClientRect.right) / 2;}return 0;
}/****************************************
Function name:  BOOL CSplitter::GetActivePane()
Purpose:        Overrides the default function.
Arguments:      pRow and pCol - coords of the active pane
Return value:   the active paneComments:        This function may return active pane
that is not in this splitter at all,
as opposed to the base class' implementation,
which always check for it. In this case, the
pRow and pCol will be -1
**************************************/
CWnd* CSplitter::GetActivePane(int* pRow, int* pCol)
{ASSERT_VALID(this);// attempt to use active view of frame windowCWnd* pView = NULL;CFrameWnd* pFrameWnd = GetParentFrame();ASSERT_VALID(pFrameWnd);pView = pFrameWnd->GetActiveView();// failing that, use the current focusif (pView == NULL)pView = GetFocus();// check if the view is in this splitter (it may not),// but don't return NULL if it is not, like the base class does.// instead, just if (pView != NULL && !IsChildPane(pView, pRow, pCol)){if (pRow)*pRow = -1;if (pCol)*pCol = -1;}return pView;
}void CSplitter::OnMouseMove(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call defaultif(point.y < m_szMinimumSize.cy){point.y = m_szMinimumSize.cy;}if(point.x < m_szMinimumSize.cx){point.x = m_szMinimumSize.cx;}CSplitterWnd::OnMouseMove(nFlags, point);
}/****************************************
Function name:  void CSplitter::SetMinimumSize(const int cx = -1, const int cy = -1)
Purpose:        Replaces a view with another in a given pane.
Only for static splitters.
Arguments:      row, col: pane coords
pViewClass: a runtime class of the view
size: min size
Return value:   TRUE if successful, FALSE otherwise.
**************************************/
void CSplitter::SetMinimumSize(const int cx, const int cy)
{ m_szMinimumSize.cx = cx;m_szMinimumSize.cy = cy;
}

另外还给我们的View类(我们以CViewLeft为例,其他同理)添加右键菜单,添加步骤为:

1.点击资源视图的Menu右键Insert Menu,自动生成IDR_MENU1的菜单(可右键属性修改IDR),点击菜单双击Type Here添加第一个菜单View,然后同样的方法在其下面添加子菜单Horizonal,Vertical,Float,Swap等等,单击菜单即可在VS中看到相应菜单的属性,可以做相应修改;

2.添加菜单完毕,需要显示菜单,在视图类中添加右键响应函数OnRButtonDown,如下:

// CViewLeft message handlersvoid CViewLeft::OnRButtonDown(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call defaultCPoint ptScreen = point;//Current Mouse position int viewClientToScreen(&ptScreen);//to ScreenCMenu Menu;//define menuif (Menu.LoadMenu(IDR_VIEW_MENU)){CMenu *pSubMenu = Menu.GetSubMenu(0);pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, ptScreen.x, ptScreen.y, this);//shown menu at point}CView::OnRButtonDown(nFlags, point);
}

3.完成2之后右键就可以看到我们添加的右键菜单了,最后一步就是响应菜单了,资源视图中单击相应菜单,右键Add Event Handler,如下所示:

然后完成相应的处理函数即可:

void CViewLeft::OnViewHorz()
{// TODO: Add your command handler code hereMessageBox(L"Horz command", L"Horz", 0);
}void CViewLeft::OnViewVert()
{// TODO: Add your command handler code hereMessageBox(L"Vert command", L"Vert", 0);
}void CViewLeft::OnViewFloat()
{// TODO: Add your command handler code hereMessageBox(L"Float command", L"Float", 0);
}void CViewLeft::OnViewSwap()
{// TODO: Add your command handler code hereMessageBox(L"Swap command!", L"Swap", 0);
}

添加Splitter.h到ChildFrm.h,修改CSplitterWnd为CSplitter,运行即可看到效果如下

Base Class Members

CObject Members

CCmdTarget Members

CWnd Members

Construction

Create

Call to create a dynamic splitter window and attach it to the CSplitterWnd object.创建一个动态的分隔器窗口并将它与一个CSplitterWnd对象连接

CreateStatic

Call to create a static splitter window and attach it to the CSplitterWnd object.创建一个静态的分隔器窗口并将它与一个CSplitterWnd对象连接

CreateView

Call to create a pane in a splitter window.在一个分隔器窗口中创建一个窗格

CSplitterWnd

Call to construct a CSplitterWnd object.构造一个CSplitterWnd对象

Operations

GetColumnCount

Returns the current pane column count.返回当前窗格列的计数值

GetColumnInfo

Returns information on the specified column.返回指定列的信息

GetPane

Returns the pane at the specified row and column.返回位于指定行和列处的窗格

GetRowCount

Returns the current pane row count.返回当前窗格行的计数值

GetRowInfo

Returns information on the specified row.返回指定行的信息

GetScrollStyle

Returns the shared scroll-bar style.返回共享滚动条的风格

IdFromRowCol

Returns the child window ID of the pane at the specified row and column.返回位于指定行和列处的窗格的子窗口ID

IsTracking

Determines if splitter bar is currently being moved.判定分隔条是否正在移动

IsChildPane

Call to determine whether the window is currently a child pane of this splitter window.确定窗口是否是此分隔器窗口的当前子窗格

RecalcLayout

Call to redisplay the splitter window after adjusting row or column size.在调整行或列尺寸后调用此函数来重新显示该分隔器窗口

SetColumnInfo

Call to set the specified column information.设置指定列的信息

SetRowInfo

Call to set the specified row information.设置指定行的信息

SetScrollStyle

Specifies the new scroll-bar style for the splitter window's shared scroll-bar support.为分隔器窗口的共享滚动条指定新的滚动条风格

Overridables

ActivateNext

Performs the Next Pane or Previous Pane command.执行Next Pane或Previous Pane命令

CanActivateNext

Checks to see if the Next Pane or Previous Pane command is currently possible.检查Next Pane或Previous Pane命令当前是否有效

CreateScrollBarCtrl

Creates a shared scroll bar control.创建一个共享的滚动条控件

DeleteColumn

Deletes a column from the splitter window.从分隔器窗口中删除一列

DeleteRow

Deletes a row from the splitter window.从分隔器窗口中删除一行

DeleteView

Deletes a view from the splitter window.从分隔器窗口中删除一个视图

DoKeyboardSplit

Performs the keyboard split command, usually "Window Split."执行键盘分隔命令,通常是“Window Split”

DoScroll

Performs synchronized scrolling of split windows.执行分隔窗口的同步滚动

DoScrollBy

Scrolls split windows by a given number of pixels.将分隔窗口滚动给定的像素数

GetActivePane

Determines the active pane from the focus or active view in the frame.根据焦点或框架中的活动视图来判定活动窗格

OnDrawSplitter

Renders an image of a split window.绘制一个分隔器窗口的图像

OnInvertTracker

Renders the image of a split window to be the same size and shape as the frame window.绘制一个分隔器窗口的图像,使它具有与框架窗口相同的大小和形状

SetActivePane

Sets a pane to be the active one in the frame.在框架中设置一个活动窗格

SplitColumn

Indicates where a frame window splits vertically.表明一个框架窗口是否是垂直分隔的

SplitRow

Indicates where a frame window splits horizontally.表明一个框架窗口是否是水平分隔的

需要定制属于自己的分割窗口可以根据情况重写Overridables相应方法。
下一篇将继续介绍静态动态嵌套分割以及动态分割后的窗口如何绑定不同的视图,我们目前看到的是动态分割之后的窗口共用一个视图,如何让(0, 0),(0, 1),(1, 0), (1, 1)分别显示不同的视图呢?预知后事如何且听下回分解。。。







CSplitterWnd窗口分割之——动态静态嵌套分割(二)相关推荐

  1. 据我所知,这是第一个完整实现运动分割、动态目标追踪等的「开源」动态SLAM系统!...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 今天给大家分享一篇最新文章,VDO-SLAM :一种动态目标感知的视觉SLAM系统,原文名称 VDO- ...

  2. php怎么分割页面,将一个页面分成多个html文件(静态html分割页面)

    静态html分割页面,达到类似PHP等动态页面的include引入页面效果. 用html把首页分成三个文件 web.png 在PHP.JSP等动态页面开发中,页面里引入其它页面只需include()进 ...

  3. Dynamic Routing-中科院西交旷视(孙剑团队)提出用于语义分割的动态路由网络,精确感知多尺度目标,代码已开源!...

    关注公众号,发现CV技术之美 ▊ 写在前面 近年来,大量手工设计和基于搜索的网络被用于语义分割.然而,以前的工作(如FCN.U-Net和DeepLab系列)希望在预定义的静态网络结构中处理不同规模的输 ...

  4. SOLOv 2:实例分割(动态、更快、更强)

    SOLOv 2:实例分割(动态.更快.更强) SOLOv2: Dynamic, Faster and Stronger 论文链接: https://arxiv.org/pdf/2003.10152.p ...

  5. 【实用】几个实用的webstorm、IDEA编辑器窗口快捷键设置,Alt+V垂直复制当前窗口,Alt+Shift+V将当前窗口复制到另一边的分割窗口显示,Alt+Shift+M移动当前活动窗口到另一边

    Alt+V垂直复制当前窗口 Alt+Shift+V将当前窗口复制到另一边的分割窗口显示,Alt+Shift+M移动当前活动窗口到另一边

  6. 图像分割之静态背景分割综述

    原文地址:图像分割之静态背景分割综述 作者:pursuiting 静态背景分割方法的比较 摘要: 在静态或运动补偿的照相机中,静态背景分割方法能应用于从背景分割出有意义的前景物体.尽管提出了许多方法, ...

  7. mysql数据库水平分割_数据库的水平分割和垂直分割

    在数据库操作中,我们常常会听说这两个词语:水平分割和垂直分割.那么到底什么是数据库的水平分割,什么是数据库的垂直分割呢?本文我们就来介绍一下这部分内容. 1.水平分割: 按记录进分分割,不同的记录可以 ...

  8. vue动态配置嵌套页面(含iframe嵌套)可实现白天夜间皮肤切换

    引用地址:vue动态配置嵌套页面(含iframe嵌套)可实现白天夜间皮肤切换 - 长空雁叫霜晨月 - 博客园  项目预览地址:https://volodya-01.github.io/vue2.0_t ...

  9. 基于深度学习的点云分割网络及点云分割数据集

    作者丨泡椒味的泡泡糖 来源丨深蓝AI 引言 点云分割是根据空间.几何和纹理等特征对点云进行划分,使得同一划分内的点云拥有相似的特征.点云的有效分割是许多应用的前提,例如在三维重建领域,需要对场景内的物 ...

最新文章

  1. 如何选择就业方向(80后的个人经验,转载)
  2. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
  3. java set 包含_关于Java的Set的集合是否包括问题,如下为什么不包括?
  4. 计算机三级网络技术注意事项,2015计算机三级考试《网络技术》复习要点:压缩技术...
  5. QT制作音乐播放器的相关知识点
  6. linux怎么删除exe文件夹,ubuntu linux 批量删除文件
  7. 【HDU - 2398 】Savings Account (水题模拟)
  8. 阿里云发布第七代云服务器ECS,整机算力提升160%
  9. 三周第三次课(12月27日)
  10. 12306能删候补订单记录_2019最新火车候补购票十大问题
  11. AcWing 866. 试除法判定质数(素数判定)
  12. 为什么java导入有x_ImportError:无法导入名称X
  13. windbg拦截驱动加载
  14. 展讯SC9820E驱动配置之LCD配置
  15. oracle 汉字转五笔码,芈月传的芈字怎么打?用五笔拆解并输入方法图解
  16. 1194: 总成绩排序(结构体专题)
  17. 面试官:内存耗尽后Redis会发生什么 ?
  18. 高德地图获取城市所有小区的POI
  19. 最近遇到使用Zing.DLL生成条码,但是打印出来不清晰的问题,解决代码记录一下,
  20. 用Midjourney画个美女,AI绘画也太强大了!!! - 第8篇

热门文章

  1. rt-thread i2c 使用教程
  2. 京东校招java面试题_京东2018校招编程题解答(Java)
  3. ThreadLocal 源码深析及使用示例
  4. 特斯拉第二季度电动汽车销量下降近 18%
  5. Mermaid classDiagram类图应用举例 汉,蜀汉,刘宋关系图
  6. js var多等式变量的定义
  7. c:一个长方体表面积体积的计算
  8. Adobe CS5简体中文版官方下载地址
  9. 微信小程序销毁某一注册函数_微信小程序注销手册
  10. 创建 ROS 工作区