今天跟大家伙儿聊聊我昨天折腾的 `modifystyleex`,一开始我听到这个东西也是一脸懵,心想这玩意儿是干啥用的?后来硬着头皮开始搞,才慢慢摸清楚门道。
事情是这样的,我最近在做一个界面,需要改一个控件的样式,比如去掉边框啥的。之前我都是直接在资源编辑器里改,但是这回不行,需要在程序运行时动态修改。然后我就想到 `ModifyStyleEx` 这个函数。
我去网上搜一堆资料,看看 `ModifyStyleEx` 到底是干嘛的。 简单来说,它就是用来修改窗口扩展样式的,那些以 `WS_EX_` 开头的属性,都可以用它来改。
知道原理,接下来就是上手。我先试着把一个编辑框的边框去掉。代码大概是这样写的:
cpp
CWnd pWnd = GetDlgItem(IDC_EDIT1); // 获取编辑框的指针
if (pWnd)
pWnd->ModifyStyleEx(WS_EX_CLIENTEDGE, 0, SWP_FRAMECHANGED);
这段代码的意思是,先获取编辑框的指针,然后调用 `ModifyStyleEx` 函数,把 `WS_EX_CLIENTEDGE` 这个样式去掉。`SWP_FRAMECHANGED` 是一个标志,告诉系统窗口的框架发生改变,需要重新绘制。
但是!运行之后我发现,边框还是在那里,纹丝不动! 我就开始怀疑人生,难道是我的代码写错? 于是我各种调试,各种查资料,折腾好久,才发现问题出在哪里。
原来,`ModifyStyleEx` 修改的是扩展样式,而我想要去掉的边框,实际上是普通样式,不是扩展样式! 我晕,方向都搞错。
既然 `ModifyStyleEx` 不行,那就试试 `ModifyStyle` 。`ModifyStyle` 是用来修改普通样式的。
代码改成这样:
cpp
CWnd pWnd = GetDlgItem(IDC_EDIT1); // 获取编辑框的指针
if (pWnd)
pWnd->ModifyStyle(WS_BORDER, 0, SWP_FRAMECHANGED);
这回总算对,边框终于消失!
但是,新的问题又来。虽然边框没,但是编辑框的背景色也跟着变,变得很难看。 我又开始查资料,发现这是因为我把 `WS_BORDER` 样式去掉之后,编辑框的默认背景色就显示出来。
为解决这个问题,我需要手动设置编辑框的背景色。 可以在 `WM_CTLCOLOREDIT` 消息的处理函数中设置:
cpp
HBRUSH CMyDialog::OnCtlColor(CDC pDC, CWnd pWnd, UINT nCtlColor)
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_EDIT)
if (pWnd->GetDlgCtrlID() == IDC_EDIT1)
pDC->SetBkColor(RGB(255, 255, 255)); // 设置背景色为白色
return (HBRUSH)GetStockObject(WHITE_BRUSH);
return hbr;
这段代码的意思是,当编辑框需要绘制背景时,会触发 `WM_CTLCOLOREDIT` 消息。在这个消息的处理函数中,我们可以设置编辑框的背景色为白色。
搞定! 最终效果还不错,边框没,背景色也正常。
总结一下这回的经验:- `ModifyStyleEx` 是用来修改扩展样式的,`ModifyStyle` 是用来修改普通样式的。
- 修改样式之后,可能会导致其他问题,需要仔细调试。
- 遇到问题不要慌,多查资料,多尝试。
这回折腾 `modifystyleex` 真是让我学到不少东西,也深刻体会到编程的乐趣。 希望我的这回实践记录对大家有所帮助。 如果大家有什么问题,欢迎留言交流。