在MFC中借助向导的帮助很容易就能创建一个带有分隔条(Splitter)的窗口,但是在Win32中一切都没有那么容易,在这篇文章里我带领大家用Win32实现一个带这种Splitter的窗口。
一个Splitter分隔条,能够将一个窗口分成两部分,在我们实际的编码项目中,这分开的两个窗口能实现各自的功能。但是这个Splitter又是什么呢? 告诉大家,这个Splitter其实仅仅是两个分开的窗口的sunken edge。
首先我们在当前窗口下建立两个子窗口,分别是Edit和Static,这都是Win32内置的子窗口控件。这里要说明一下的是,下面的代码中我使用了自己写就的一个窗口类,一些消息响应我用这个窗口类的虚函数实现了,为了完整起见,我在这里将整个函数体都列了出来。我的函数命名和参数列表都是参考MFC的,如果对Windows消息到虚函数的映射不是特别明白,可以参考一下MSDN。
{
m_hEdit = CreateWindowEx ( WS_EX_CLIENTEDGE,
_T ( "Edit" ), NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | ES_MULTILINE,
0, 0, 0, 0,
hwnd, NULL,
pCST - >hInstance, NULL ) ;
chlASSERT (m_hEdit ) ;
m_hLabel = CreateWindowEx ( WS_EX_CLIENTEDGE,
_T ( "Static" ), NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS,
0, 0, 0, 0,
hwnd, NULL,
pCST - >hInstance, NULL ) ;
chlASSERT (m_hLabel ) ;
RECT rc ;
GetClientRect (hwnd, &rc ) ;
m_splitterPos = rc. right / 2 ;
m_hCursor = LoadCursor ( NULL,MAKEINTRESOURCE (IDC_SIZEWE ) ) ;
}
要说明的是:m_splitterPos是分隔条在水平方向的位置。Edit和Static窗口创建时的大小都是0,因此我们需要在WM_SIZE消息中让他们调整到合适的大小。
{
MoveWindow (m_hEdit, 0, 0,m_splitterPos,cy, true ) ;
MoveWindow (m_hLabel,m_splitterPos, 0,cx - m_splitterPos,cy, true ) ;
}
此外我们还需要让Edit和Static各自显示一些文字。
{
SetWindowText (m_hLabel,_T ( "这是一个Static控件" ) ) ;
SetWindowText (m_hEdit,_T ( "这是一个Edit控件" ) ) ;
}
现在运行一下,分隔条是能看见了:
下面要做的是当鼠标移到分隔条周围时,能够调整分隔条的位置,两个子窗口的大小也随之更改。首先我们在WM_LBUTTONDOWN消息内设置一个标记,表示现在可以调整大小,并设置鼠标的形状。在WM_LBUTTONUP消息内,调整Splitter位置的工作已经结束,因此将标记设置为不允许调整大小,并将鼠标形状设置为正常情况。而在WM_MOUSEMOVE消息内,我们可以设置Splitter的位置。
{
if (nFlags == MK_LBUTTON && m_IsSplit )
{
RECT rc ;
GetClientRect (m_hwnd, &rc ) ;
m_splitterPos = pos. x ;
SendMessage (m_hwnd,WM_SIZE, NULL,MAKELPARAM (rc. right,rc. bottom ) ) ;
}
}
void KWindow :: OnLButtonDown (UINT nFlags, POINT pos )
{
if ( (pos. x >= m_splitterPos - 10 ) && ( pos. x <= m_splitterPos + 10 ) )
{
m_IsSplit = true ;
SetCursor (m_hCursor ) ;
SetCapture (this - >m_hwnd ) ;
}
}
void KWindow :: OnLButtonUp (UINT nFlags, POINT pos )
{
if (m_IsSplit )
{
m_IsSplit = false ;
ReleaseCapture ( ) ;
}
}
版权所有,转载请注明:http://www.hailongchang.org