ユーニックス総合研究所

  • home
  • archives
  • windows-rs-text-color

テキストの前景色と背景色の変更 - Rustで作るWindowsアプリ

  • 作成日: 2023-05-10
  • 更新日: 2023-12-24
  • カテゴリ: windows-rs

テキストの前景色と背景色の変更

Windows API(windows-rs)でテキストの前景色背景色を変更するには以下の2つの関数を使います。

  • SetTextColor関数 ... テキストの前景色の変更
  • SetBkColor関数 ... テキストの背景色の変更

これらの関数はテキストの描画前に呼び出し、あらかじめテキストの色を設定しておきます。テキストの描画が済んだらまた元の色に戻しておきます。つまり

  • 前景色か後景色の変更
  • テキストの描画
  • 前景色と後景色を元に戻す

という手順で行います。

WM_PAINTの修正

WM_PAINT以下の処理を次のように変更します。

    // ウィンドウの変更によりクライアント領域の内容が変わった  
    WM_PAINT => {  
        let hdc: HDC = GetDC(window);  

        // 文字列の描画範囲  
        let mut rect: RECT = RECT {  
            left: 10,  
            top: 10,  
            right: 200,  
            bottom: 200,  
        };  

        // 改行付きの文字列  
        let s = String::from("こんにちは。\nごきげんいかがですか?私は元気です。");  
        let mut v: Vec<u16> = s.encode_utf16().collect();  
        // v.push(0);  // ナル文字をプッシュしない  

        // 文字列の描画前に前景色と背景色の変更  
        let before_text_color: COLORREF = SetTextColor(hdc, COLORREF(0x00ff0000));  
        let before_bk_color: COLORREF = SetBkColor(hdc, COLORREF(0x0000ff00));  

        // 色を変更した文字列の描画  
        DrawTextW(hdc, &mut v, &mut rect, DT_LEFT | DT_WORDBREAK);  

        // 前景色と背景色を元に戻す  
        SetTextColor(hdc, before_text_color);  
        SetBkColor(hdc, before_bk_color);  

        // 前景色と背景色の取得  
        let text_color: COLORREF = GetTextColor(hdc);  
        let bk_color: COLORREF = GetBkColor(hdc);  
        println!("{} {}", text_color.0, bk_color.0);  

        ReleaseDC(window, hdc);  
        LRESULT(0)  
    }  

SetTextColor関数とSetBkColor関数の使い方は同じです。これらの関数は返り値として変更前の色を返してくれますので、この返り値を変数で保存しておくと後で色を元に戻すときにラクできます。
また前景色と背景色の取得には以下の関数が使えます。

  • GetTextColor ... テキストの前景色の取得
  • GetBkColor ... テキストの後景色の取得

これらの関数が色として使っているCOLORREFはタプル構造体でメンバ0に実際の色の値が入ってます。
背景色ですがこれはテキストの描画範囲の背景を変更するだけです。ウィンドウ全体の背景色を変更するわけではありません。

SetTextColor関数

Function windows::Win32::Graphics::Gdi::SetTextColor  

pub unsafe fn SetTextColor<P0, P1>(  
    hdc: P0,  // デバイス コンテキスト  
    color: P1  // 設定する色  
) -> COLORREF  
where  
    P0: IntoParam<HDC>,  
    P1: IntoParam<COLORREF>,  

この関数は引数のデバイス コンテキストのテキストの色を変更します。
返り値は関数が成功した場合は変更前の色、関数が失敗した場合はCLR_INVALIDになります。

SetBkColor関数

Function windows::Win32::Graphics::Gdi::SetBkColor  

pub unsafe fn SetBkColor<P0, P1>(  
    hdc: P0,  // デバイス コンテキスト  
    color: P1  // 設定する色  
) -> COLORREF  
where  
    P0: IntoParam<HDC>,  
    P1: IntoParam<COLORREF>,  

この関数は引数のデバイス コンテキストのテキストの背景色を変更します。設定した色を表現できない時は最も近い色が設定されます。
返り値は関数が成功した場合は変更前の背景色、失敗した場合はCLR_INVALIDになります。

GetTextColor関数

Function windows::Win32::Graphics::Gdi::GetTextColor  

pub unsafe fn GetTextColor<P0>(  
    hdc: P0  // デバイス コンテキスト  
) -> COLORREF  
where  
    P0: IntoParam<HDC>,  

この関数は指定したデバイス コンテキストのテキストの色を取得します。
返り値は成功した場合は色、失敗した場合はCLR_INVALIDになります。

GetBkColor関数

Function windows::Win32::Graphics::Gdi::GetBkColor  

pub unsafe fn GetBkColor<P0>(  
    hdc: P0  // デバイス コンテキスト  
) -> COLORREF  
where  
    P0: IntoParam<HDC>,  

この関数は指定したデバイス コンテキストのテキストの背景色を取得します。
返り値は成功した場合は色、失敗した場合はCLR_INVALIDになります。