Как я могу упростить код, который изменяет стили окон, используя SetWindowLong & GetWindowLong?
Я пишу некоторые функции-оболочки и классы для Windows API. Я часто сталкиваюсь с тем, что меняю стили Windows.
Ниже приведен пример кода, в котором my настраивает выравнивание текста TextBox на основе перечисления параметра 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);
};
1 ответ
Решение
В 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);
};