【发布时间】: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 Styles 和Visual Styles。我没有看到它与我的问题之间的联系,我需要你的指导。视觉样式是关于常见控件的外观,那么它与 EDIT 控件的边框有什么关系?
-
许多系统控件缓存它们的初始样式并且从不更新它们。看起来边界标志就是其中之一。可能你最好的选择是创建它没有边框,然后如果你想要的话,你自己在它周围画一个边框。