我正在为Windows API编写一些包装函数和类。我开始遇到的一件常见的事情是修改Windows样式。
以下是我基于参数Alignment枚举调整TextBox的文本对齐方式的一些示例代码。经过大量测试后,我似乎必须删除两种备选对齐样式,否则会发生冲突。然后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);
};