2

Windows API のラッパー関数とクラスを作成しています。私が遭遇し始めている一般的な出来事は、Windows スタイルの変更です。

以下は、パラメータ ALIGNMENT 列挙に基づいて TextBox のテキスト配置を調整するサンプル コードです。多くのテストの後、2 つの代替の配置スタイルを削除する必要があるようです。そうしないと競合します。次に SetWindowPos(..SWP_FRAMECHANGED) も機能しないので、スタイルが更新された後に TextBox を強制的に再描画するために InvalidateRect() と UpdateWindow() に置き換えました。

これを行う簡単な方法があれば、フィードバックをお願いします。何かを見落としているような気がします。ありがとう!:)

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);
};
4

1 に答える 1

2

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);
};
于 2013-08-26T11:06:35.477 に答える