我怎样才能简化使用SetWindowLong&GetWindowLong修改窗口样式的代码?

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

以下是我根据参数ALIGNMENT枚举调整TextBox的文本alignment的一些示例代码。 经过多次testing,似乎我必须删除2个可选的alignment样式,否则会发生冲突。 然后,SetWindowPos(.. SWP_FRAMECHANGED)也不能工作,所以我用InvalidateRect()和UpdateWindow()replace它来强制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); };