gpt4 book ai didi

windows - 如何使用 SetWindowLong 和 GetWindowLong 简化修改窗口样式的代码?

转载 作者:可可西里 更新时间:2023-11-01 10:25:57 24 4
gpt4 key购买 nike

我正在为 Windows API 编写一些包装函数和类。我开始遇到的一个常见事件是修改 Windows 样式。

以下是一些示例代码,我根据参数 ALIGNMENT 枚举调整文本框的文本对齐方式。经过多次测试,我似乎必须删除 2 种替代对齐方式,否则会发生冲突。然后 SetWindowPos(..SWP_FRAMECHANGED) 也不起作用,所以我将其替换为 InvalidateRect() 和 UpdateWindow() 以强制在样式更新后重新绘制 TextBox。

如果有更简单的方法,我希望得到一些反馈。我觉得我忽略了一些东西。谢谢! :)

enum ALIGNMENT
{
Left,
Right,
Center
};

void TextBox::Alignment(ALIGNMENT Alignment)
{
switch (Alignment)
{
case ALIGNMENT::Left:
SetWindowLongPtr(m_hWnd, GWL_STYLE, (GetWindowLongPtr(m_hWnd, GWL_STYLE) & ~ES_CENTER & ~ES_RIGHT) | ES_LEFT);
break;
case ALIGNMENT::Center:
SetWindowLongPtr(m_hWnd, GWL_STYLE, (GetWindowLongPtr(m_hWnd, GWL_STYLE) & ~ES_LEFT & ~ES_RIGHT) | ES_CENTER);
break;
case ALIGNMENT::Right:
SetWindowLongPtr(m_hWnd, GWL_STYLE, (GetWindowLongPtr(m_hWnd, GWL_STYLE) & ~ES_LEFT & ~ES_CENTER) | ES_RIGHT);
break;
}

InvalidateRect(m_hWnd, NULL, true);
UpdateWindow(m_hWnd);
};

最佳答案

在 WinUser.h 中:

#define ES_LEFT             0x0000L
#define ES_CENTER 0x0001L
#define ES_RIGHT 0x0002L

所以你可以做

void TextBox::Alignment(ALIGNMENT Alignment)
{
int style = ES_LEFT; // default to left alignment
switch (Alignment)
{
case ALIGNMENT::Center:
style = ES_CENTER;
break;
case ALIGNMENT::Right:
style = ES_RIGHT;
break;
}

SetWindowLongPtr(m_hWnd, GWL_STYLE, GetWindowLongPtr(m_hWnd, GWL_STYLE) & ~(ES_CENTER|ES_RIGHT) | style);
InvalidateRect(m_hWnd, NULL, TRUE);
UpdateWindow(m_hWnd);
};

关于windows - 如何使用 SetWindowLong 和 GetWindowLong 简化修改窗口样式的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18442522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com