GradientFill関数の使い方Part1


やあ子供たち。冬のオリンピック見てるかい?高橋選手による日本初のフィギュアスケート男子メダル獲得は素晴らしかったね!
今日はGradientFillを簡単に利用するための関数を作ったよ。もはやこれがGDIなのかGDIplusなのかおじさんにもよくはわからないしそんなことはどちらでもいいのだけどとにかく以下のような関数に、hdc, rect、それと、rectの左上位置と右下位置における色を16ビット値で、そして最後に水平方向のグラデーションなのか、垂直方向なのかということを教えてあげてくれよな。描画結果は冒頭の図のような感じだ。

void lc_GradientFill( const HDC& hdc, const CRect& rect, 
                      COLOR16 r=0, COLOR16 g=0, COLOR16 b=0,
                      COLOR16 r2=0, COLOR16 g2=0, COLOR16 b2=0xffff,
                      bool is_horizontal=0 )
{
  //http://msdn.microsoft.com/en-us/library/dd144957(VS.85).aspx
  // 頂点情報の構築(位置と色)
  // TRIVERTEX:: x, y in DWORD, R,G,B,A in COLOR16 ヘッダを見よ
  TRIVERTEX vt[]={ 
    {0, 0, r, g, b, 0 },
    {rect.Width(), rect.Height(), r2, g2, b2, 0 },
  };
  // メッシュ情報の構築
  // GRADIENT_TRIANGLEか、GRADIENT_RECTの配列を作成する。
  // ようわからんのでこれは以下のようにしとけ。
  GRADIENT_RECT arr_gr[] = { {0, 1} };
  // そしてGradientFillを呼んどけ。
  GradientFill( hdc, vt, 2, &arr_gr, 1, 
    (is_horizontal)? GRADIENT_FILL_RECT_H : GRADIENT_FILL_RECT_V );
  return;
}

使い方は以下のような感じだよ。上記関数さえ見える場所なら、呼び出しは一行だ。

  HDC hdc = ::GetDC( hw );
  {
    CRect rect;
    ::GetClientRect( hw, &rect );
    lc_gradient_fill( hdc, rect, 0,0,0,0,0,0xaaaa );
    ::ReleaseDC( hw, hdc );
  }

めんどくさい人はとりあえずこう書くこともできるよ。これはデスクトップ全体を青いグラデーションで塗りつくしてしまうコードだね。

  {
    RECT rect;
    ::GetWindowRect( ::GetDesktopWindow(), &rect );
    ::lc_gradient_fill( ::GetDC(0), &rect );      
  }