Winapi 奇怪的分裂问题

Winapi 奇怪的分裂问题,winapi,visual-c++,splitter,Winapi,Visual C++,Splitter,我借用了一些代码在两次编辑之间创建一个拆分条,但当我试图在底部编写拆分条或通过移动拆分条来调整拆分条的大小时,我变得很奇怪。通常情况下,底部编辑会完全消失,滚动条会四处跳动 最终,我的目标是将窗口分为5个不同的编辑,以获得类似于以下内容的外观: 我这样做对吗 相关代码: LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HINSTANCE hInst; RECT

我借用了一些代码在两次编辑之间创建一个拆分条,但当我试图在底部编写拆分条或通过移动拆分条来调整拆分条的大小时,我变得很奇怪。通常情况下,底部编辑会完全消失,滚动条会四处跳动

最终,我的目标是将窗口分为5个不同的编辑,以获得类似于以下内容的外观:

我这样做对吗

相关代码:

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HINSTANCE   hInst;
    RECT        rect;
    static HCURSOR  hCursor;
    static BOOL bSplitterMoving;
    static DWORD    dwSplitterPos;
    static HWND hWnd1, hWnd2;

    switch (uMsg)
    {
        case WM_CREATE:
        {
            hInst = ((LPCREATESTRUCT)lParam)->hInstance;

            hWnd1 = CreateWindowEx(WS_EX_CLIENTEDGE,
                L"edit", NULL,
                WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL,
                0, 0, 0, 0,
                hWnd, (HMENU)1,
                hInst, NULL);

            hWnd2 = CreateWindowEx(WS_EX_CLIENTEDGE,
                L"edit", NULL,
                WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL,
                0, 0, 0, 0,
                hWnd, (HMENU)2,
                hInst, NULL);

            hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS));
            bSplitterMoving = FALSE;

            dwSplitterPos = 130;
//

case WM\u大小:
if((wParam!=SIZE_最小化)&&(HIWORD(lParam)10)//不允许超过此标记
{
设置光标(hCursor);
if((wParam==MK_LBUTTON)和&bSplitterMoving)
{
GetClientRect(hWnd和rect);
if(HIWORD(lParam)>rect.bottom)
返回0;
dwSplitterPos=HIWORD(lParam);
SendMessage(hWnd,WM_SIZE,0,MAKELPARAM(rect.right,rect.bottom));
}
}
返回0;
案例WM_LBUTTONDOWN:
设置光标(hCursor);
bsplitermoving=TRUE;
SetCapture(hWnd);
返回0;
案例WM_LBUTTONUP:
释放捕获();
bsplitermoving=FALSE;
返回0;
//

显示正在发生的事情的图像:


一个简单的
WNDCLASSEX wcx
声明有时会起作用,但有时会使程序崩溃

您应该始终使用零来初始化结构:
WNDCLASSEX wcx={0}

另一个问题是,您没有正确处理
WM_命令
,完成后必须返回0或break:

case WM_COMMAND:
{
    switch (LOWORD(wParam))
    {
    case IDM_EXIT:
        PostQuitMessage(0);
        break;
    case IDM_ABOUT:
        break;
    default:
        break;
    }
    return 0;//** THIS WAS MISSING
}

一个简单的
wndclassexwcx
声明有时会起作用,但有时会使程序崩溃

您应该始终使用零来初始化结构:
WNDCLASSEX wcx={0}

另一个问题是,您没有正确处理
WM_命令
,完成后必须返回0或break:

case WM_COMMAND:
{
    switch (LOWORD(wParam))
    {
    case IDM_EXIT:
        PostQuitMessage(0);
        break;
    case IDM_ABOUT:
        break;
    default:
        break;
    }
    return 0;//** THIS WAS MISSING
}

如果滚动条在跳舞,那是因为其他地方的错误。您应该为
WM_LBUTTONDOWN
创建一个最小的工作示例(您已经发布了大部分代码,您还可以添加WinMain等),将
SetCapture
放在
SetCursor
之前,不确定您为什么要观察所看到的效果。但是,您的代码有几个问题。首先,从LPRAM中提取数据时不要使用
HIWORD
。改用
GET_Y_LPARAM
。另外,当同时移动多个窗口时,请查看。我无法重现您在代码中描述的问题(添加了一些内容以使其编译并调用
DefWindowProc
)。拆分器的行为完全符合预期。你试过自己剪吗?这可能是因为它也适用于您,而问题在于您忽略的代码。请提供一个最低限度的例子,并描述您是如何准确再现问题的。谢谢你们三位。我会上传代码并尽快发布到这里。我敢肯定这只是我做的蠢事。这是我的贴纸盒。我真的很感激你们大家都来看看。我很想知道我犯了什么愚蠢的错误!如果滚动条在跳舞,那是因为其他地方的错误。您应该为
WM_LBUTTONDOWN
创建一个最小的工作示例(您已经发布了大部分代码,您还可以添加WinMain等),将
SetCapture
放在
SetCursor
之前,不确定您为什么要观察所看到的效果。但是,您的代码有几个问题。首先,从LPRAM中提取数据时不要使用
HIWORD
。改用
GET_Y_LPARAM
。另外,当同时移动多个窗口时,请查看。我无法重现您在代码中描述的问题(添加了一些内容以使其编译并调用
DefWindowProc
)。拆分器的行为完全符合预期。你试过自己剪吗?这可能是因为它也适用于您,而问题在于您忽略的代码。请提供一个最低限度的例子,并描述您是如何准确再现问题的。谢谢你们三位。我会上传代码并尽快发布到这里。我敢肯定这只是我做的蠢事。这是我的贴纸盒。我真的很感激你们大家都来看看。我很想知道我犯了什么愚蠢的错误!如果滚动条在跳舞,那是因为其他地方的错误。您应该为
WM_LBUTTONDOWN
创建一个最小的工作示例(您已经发布了大部分代码,您还可以添加WinMain等),将
SetCapture
放在
SetCursor
之前,不确定您为什么要观察所看到的效果。但是,您的代码有几个问题。首先,从LPRAM中提取数据时不要使用
HIWORD
。改用
GET_Y_LPARAM
。另外,当同时移动多个窗口时,请查看。我无法重现您在代码中描述的问题(添加了一些内容以使其编译并调用
DefWindowProc
)。拆分器的行为完全符合预期。你试过自己剪吗?这可能是因为它也适用于您,而问题在于您忽略的代码。请提供一个最低限度的例子,并描述您是如何准确再现问题的。谢谢你们三位。我会上传代码并尽快发布到这里。我敢肯定这只是我做的蠢事。这是我的贴纸盒。我真的很感激你们大家都来看看。我很想知道我犯了什么愚蠢的错误!