Win32 拆分窗口

Win32 拆分窗口
前两天学习了MFC的拆分窗口,今天来学习Win32 SDK下如何拆分窗口.

win32是没有像MFC那样直接有函数方法拆分窗口,只能自己处理了.

1.在WM_CREATE消息中创建两个控件,TreeView,ListView

//创建左边树形视图控件TreeView,扩展风格样式为3D风格WS_EX_CLIENTEDGE
//创建左边树形视图控件TreeView,扩展风格样式为3D风格WS_EX_CLIENTEDGE
    HWND m_hTree = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, NULL,
        WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS,
        0, 0, 0, 0, hWnd, NULL, lpCreate->hInstance, NULL);

    //创建右边列表视图控件ListView
    HWND m_hList = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, NULL,
        WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS|LVS_REPORT,
        0, 0, 0, 0, hWnd, NULL, lpCreate->hInstance, NULL);

    //获取窗口客服区大小
    RECT rc;
    GetClientRect(hWnd, &rc);
    m_splitterPos = rc.right /4;    //设定分界线水平位置在窗口水平的1/4

    m_hCursor = LoadCursor(NULL, IDC_SIZEWE);    //设定在分界线上的鼠标样式为东西方向的箭头光标

2.在WM_SIZE消息中调整两个控件的位置

LRESULT OnSize(UINT nType, int cx, int cy)
{
    //根据分界线的位置,重新设置树形控件和列表控件的位置
    //在分界线的位置-1是留下能捕获鼠标消息的位置,不然挤太紧了鼠标移动消息捕获不了.
    MoveWindow(m_treeCtrl.GetHandle(), 0, 0, m_splitterPos-1, cy, true);
    MoveWindow(m_listCtrl.GetHandle(), m_splitterPos+1, 0, cx - m_splitterPos, cy, true);
    //获取列表控件的尺寸
    RECT rc;
    GetClientRect(m_listCtrl.GetHandle(), &rc);

    //根据列表控件新的大小,重新设置每列的宽度
    int nListWidth = rc.right - 20;
    int nListColwidth = nListWidth / 10;
    int nCols[] = {
        nListColwidth*2,
        nListColwidth*2,
        nListColwidth,
        nListColwidth,
        nListColwidth*4
    };
    for (int i=0;i<5;i++)
    {
        ListView_SetColumnWidth(m_listCtrl.GetHandle(), i, nCols[i]);
    }

    return 0;
}

3.捕获鼠标消息WM_LBUTTONDOWN,和WM_LBUTTONUP

LRESULT OnLButtonDown(HWND hWnd,UINT nFlags, POINT pos)
{
    if (pos.x >= m_splitterPos - 10 && pos.x <= m_splitterPos + 10)
    {
        m_IsSplit = TRUE;    //标识可以拖拽
        /*SetCursor(m_hCursor);
        SetCapture(hWnd);*/
    }
    return 0;
}

LRESULT OnLButtonUp(HWND hWnd, UINT nFlags, POINT pos)
{
    if (m_IsSplit)
    {
        m_IsSplit = FALSE;    //标识不可拖拽
        ReleaseCapture();
    }
    return 0;
}

4.在鼠标WM_MOUSEMOVE消息中实现鼠标拖拽

LRESULT OnMouseMove(HWND hWnd, UINT nFlags, POINT pos)
{
    if (pos.x >= m_splitterPos - 10 && pos.x <= m_splitterPos + 10)
    {
        //m_IsSplit = TRUE;
        SetCursor(m_hCursor);//设置鼠标样式为东西方向
        SetCapture(hWnd);    //捕获鼠标
    }
    else
    {
        ReleaseCapture();    //释放鼠标
    }

    if (nFlags == MK_LBUTTON && m_IsSplit)//鼠标拖拽两边控件随着更改位置
    {
        RECT rc;
        GetClientRect(hWnd, &rc);
        m_splitterPos = pos.x;      //根据新的分界位置发送WM_SIZE消息,重新调整左右控件的位置
        SendMessage(hWnd, WM_SIZE, 0, MAKELPARAM(rc.right, rc.bottom));
    }
    return 0;
}

5.效果

在这里插入图片描述

在这里插入图片描述

为啥截屏没有鼠标样式.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值