【问题标题】:Winapi - Removing EDIT window border c++Winapi - 删除编辑窗口边框c ++
【发布时间】:2021-06-05 10:29:22
【问题描述】:

我有一个按钮和一个编辑窗口,我最初命名为“文本框”。我想要实现的是:当我按下按钮时,编辑窗口的边框将被删除,它的文本也被更改。这是我初始化它们的方式:

HWND textbox; //global variable

//in WM_CREATE:
    CreateWindowEx(NULL, L"BUTTON", L"Remove border",
        WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 10, 150, 40, hwnd,
        (HMENU)IDC_TEXTBOX, NULL, NULL);

    textbox = CreateWindowEx(
        NULL, L"EDIT", NULL,
        WS_CHILD | WS_BORDER | WS_VISIBLE | ES_MULTILINE,
        100, 100, 200, 100, hwnd, (HMENU) 0, NULL, NULL
    );

    SetWindowText(textbox, L"the initial text");

由于一开始的样式中有WS_BORDER,我认为从窗口样式中删除它会删除边框,所以这是我的第一次尝试:

//In WM_COMMAND
    case IDC_TEXTBOX: //if button is pressed
        lStyle = GetWindowLongPtr(textbox, GWL_STYLE);
        lStyle &= ~(WS_CHILD | WS_VISIBLE | ES_MULTILINE);
        SetWindowLongPtr(textbox, GWL_STYLE, lStyle);

        SetWindowPos(textbox, NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE |
            SWP_NOZORDER | SWP_NOOWNERZORDER);

        SetWindowText(textbox, L"how to remove the border around this text???");
        break;

上面的代码不起作用。按下按钮后,窗口消失了。在第二次尝试中,我关注了the answer in this question

case IDC_TEXTBOX:
        lStyle = GetWindowLongPtr(textbox, GWL_STYLE);
        lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU);
        SetWindowLongPtr(textbox, GWL_STYLE, lStyle);

        lExStyle = GetWindowLongPtr(textbox, GWL_EXSTYLE);
        lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
        SetWindowLongPtr(textbox, GWL_EXSTYLE, lExStyle);

        SetWindowPos(textbox, NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE |
            SWP_NOZORDER | SWP_NOOWNERZORDER);

        SetWindowText(textbox, L"how to remove the border around this text???");
        break;

这一次,文字发生了变化,但按下按钮后边框仍然存在:

所以问题是:我在第一次和第二次尝试中做错了什么? 我应该怎么做才能删除 EDIT 窗口边框?

【问题讨论】:

  • lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU) 删除所有列出的样式,而不是保留它们。这是因为在您的链接问题中,他们想删除整个非客户区。你想要lStyle &= ~WS_BORDER
  • 查看Enabling Visual Styles 并重新审视,您提出的问题是否真的与您需要解决的问题有关。
  • 您必须在删除样式后重新绘制窗口/对话框。使用InvalidateRect
  • @IInspectable 我读过Enabling Visual StylesVisual Styles。我没有看到它与我的问题之间的联系,我需要你的指导。视觉样式是关于常见控件的外观,那么它与 EDIT 控件的边框有什么关系?
  • 许多系统控件缓存它们的初始样式并且从不更新它们。看起来边界标志就是其中之一。可能你最好的选择是创建它没有边框,然后如果你想要的话,你自己在它周围画一个边框。

标签: c++ winapi


【解决方案1】:

我会在你的回答下发表评论,但我没有足够的声誉。

cmets 中的其他人说“许多系统控件会缓存其初始样式并且从不更新它们”但奇怪的是您可以在创建后添加边框但不能删除它。所以看起来边框样式其实是没有缓存的。

我目前的解决方案是重新创建控件。尽管我可以接受这个解决方案(目前),但我不喜欢它。

-编辑-

别管上面的了。我发现添加 WS_BORDERafter 实际上与创建时添加 WS_BORDER 的边框不同。当您使用 WS_BORDER 创建编辑控件并使用 SetWindowLong() 再次向其中添加 WS_BORDER 时,编辑控件现在有 2 个可见边框,显示为单个 2 像素边框。创建后添加的 WS_BORDER可以在创建后删除,但创建时添加的初始 WS_BORDER不能删除。所以看起来最初的编辑边框实际上确实被缓存了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    相关资源
    最近更新 更多