用Win32实现带分割条(Splitter)的窗口

在MFC中借助向导的帮助很容易就能创建一个带有分隔条(Splitter)的窗口,但是在Win32中一切都没有那么容易,在这篇文章里我带领大家用Win32实现一个带这种Splitter的窗口。

一个Splitter分隔条,能够将一个窗口分成两部分,在我们实际的编码项目中,这分开的两个窗口能实现各自的功能。但是这个Splitter又是什么呢? 告诉大家,这个Splitter其实仅仅是两个分开的窗口的sunken edge。

首先我们在当前窗口下建立两个子窗口,分别是Edit和Static,这都是Win32内置的子窗口控件。这里要说明一下的是,下面的代码中我使用了自己写就的一个窗口类,一些消息响应我用这个窗口类的虚函数实现了,为了完整起见,我在这里将整个函数体都列了出来。我的函数命名和参数列表都是参考MFC的,如果对Windows消息到虚函数的映射不是特别明白,可以参考一下MSDN。

void KWindow :: OnCreate (CREATESTRUCT * pCST,HWND hwnd )
{
    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消息中让他们调整到合适的大小。

void KWindow :: OnSize (UINT nType, int cx, int cy )
{
    MoveWindow (m_hEdit, 0, 0,m_splitterPos,cy, true ) ;
    MoveWindow (m_hLabel,m_splitterPos, 0,cx - m_splitterPos,cy, true ) ;
}

此外我们还需要让Edit和Static各自显示一些文字。

void KWindow :: OnDraw (HDC hdc )
{
    SetWindowText (m_hLabel,_T ( "这是一个Static控件" ) ) ;
    SetWindowText (m_hEdit,_T ( "这是一个Edit控件" ) ) ;
}

现在运行一下,分隔条是能看见了:

下面要做的是当鼠标移到分隔条周围时,能够调整分隔条的位置,两个子窗口的大小也随之更改。首先我们在WM_LBUTTONDOWN消息内设置一个标记,表示现在可以调整大小,并设置鼠标的形状。在WM_LBUTTONUP消息内,调整Splitter位置的工作已经结束,因此将标记设置为不允许调整大小,并将鼠标形状设置为正常情况。而在WM_MOUSEMOVE消息内,我们可以设置Splitter的位置。

void KWindow :: OnMouseMove (UINT nFlags,POINT pos )
{
    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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值