• ベストアンサー

色描画

以下は、ウインドウプロシージャ内でのプログラムです。 RGB( )ですが、0xFFは、255の事ですよね? x*0xFF/rect.rightこの計算式は、何を求めているんですか? 教えてください。 HDC         hdc; PAINTSTRUCT  ps; COLORREF    color; LONG        x,y; RECT        rect; switch(umsg){   case  WM_PAINT:       hdc =BeginPaint(hwnd,&ps);       GetClientRect(hwnd,&rect);       for(y=0;y<rect.bottom;y++){          for(x=0;x<rect.right;x++){            color=RGB(x*0xFF/rect.right,0,0);            SetPixel(hdc,x,y,color);          }       }

質問者が選んだベストアンサー

  • ベストアンサー
  • koedame
  • ベストアンサー率33% (10/30)
回答No.2

最初の方のとおりです。 %で考えるとわかりやすいかもしれません。 >color=RGB(x*0xFF/rect.right,0,0); のように記述してありますが、 color=RGB(0xFF*(x/rect.right),0,0); と見た方がいいでしょう。 for 文では x は rect.right よりは大きくはなりません。 つまり   x ---------- × 100 = 0~99.・・・% rect.right となります。 x が大きいほど(右の方ほど)%が100に 近いので 0xFF に近くなり白色になる x が小さいほど(左の方ほど)%が0に 近いので0x00 に近くなり黒色になる 0xFF(白(255)) × 0 ~ 1(だいたい) = ~~~ みたいな感じですね。 色が間違っていたらすみません。 まあ、考えとしてはそんな感じです。

noname#168725
質問者

お礼

すばやい回答ありがとうございます! どうもありがとうございました!

その他の回答 (1)

  • yosi_yosi
  • ベストアンサー率35% (165/468)
回答No.1

x * 0xFF / rect.right は式を置き換えれば、 0xFF * (x / rect.right) となります。 画面の左端(X=0)では式の値は0となり黒で、右端(rect.right)では0xFF(=255)となり輝度が最大(赤)となります。 つまり横方向に変化する赤色のグラデーションを描いているわけです。 それで最初の順番に並んでいるのにも深い理由があります。 それは全ての値が整数値であることです。 0xFF * (x / rect.right) をそのまま記述すると、x!=rect.rightでは 0xFF * 0 となってしまいます。 それを防ぐために計算の順番を置き換えています。

noname#168725
質問者

お礼

すばやい回答ありがとうございます! 参考になりました!

関連するQ&A