COLORREF値をRGB値に変換


neko  2008-11-25 10:56:48  No: 69253  IP: [192.*.*.*]

すいません。ダイアログの背景色を取得してCOLORREF値をRGB値に変換したい
のですが上手くいきません。灰色なのにr=255,g=255,b=255と表示されます。
どうしたらCOLORREF値をRGB値に変換できるのでしょうか?
こんな感じでやってます。
    int xPos,yPos;
    int r,g,b;
    CRect rect;
    COLORREF Color;
//  hdc =(HDC) ::GetDC(NULL);

  
    GetClientRect(rect);
    xPos = rect.right / 2;
    yPos = rect.bottom / 2;
  
    Color = GetPixel(NULL,xPos,yPos);

    r=GetRValue(Color);//赤情報取り出し
    g=GetGValue(Color);//緑情報取り出し
    b=GetBValue(Color);//青情報取り出し
環境はWindowsXP VC6 MFC使用のダイアログベースです。

編集 削除
tetrapod  2008-11-25 11:26:01  No: 69254  IP: [192.*.*.*]

GetPixel で正しく色が取得できていないだけ、と見た。
CLR_INVALID が返却されている→ RGB=FF/FF/FF となるわけで。

で、何がしたいのかこのソースコードからは読み取れない。
この記述はどこにあるの?
色が読み取れる状況なの?
dc は NULL でいいの?
CDC::GetPixel を使うべき状況なの?それとも ::GetPixel が適切なの?
そのへん、いろいろ自分で調べて味噌

編集 削除
neko  2008-11-25 12:39:45  No: 69255  IP: [192.*.*.*]

tetrapodさんレスありがとうございます。
丸いビットマップボタンを作ってダイアログに貼り付けたのですが、
ビットマップのボタンの外側がダイアログの背景色と合わなくて浮いてしまうので、ダイアログのカラーを調べて、その色でビットマップの背景部分を
塗りつぶしたいのです。
ダイアログがひとつとボタンがひとつあるだけのプロジェクトです。
この記述はボタンのBN_CLICKEDイベントの中に書いています。
GetPixelはCDCの方の使い方が分かりません。不正な2つの引数をともなって呼び出されました。とエラーがでてしまいます。

編集 削除
neko  2008-11-25 13:45:42  No: 69256  IP: [192.*.*.*]

すいませんちょっと他力本願過ぎましたね。ちゃんと自分で調べてみます。

編集 削除
tetrapod  2008-11-25 15:05:35  No: 69257  IP: [192.*.*.*]

掲示板はチャットじゃないから、即レスつくことを期待してはだめだよ
そもそもの前提をひっくり返すようだが、
ダイアログの色を GetPixel で調べる、ということ自体が仕様として間違っていると思う。
GetSysColor とかその辺から調べてみるといいかもしれない。

んで「仕様として正しいか」をさておいてウィンドウの色を調べたい、のであれば
その方法の調査方法をちょっとだけ紹介してみよう。

GetPixel までは自力で調べることができた、わけだ。そこで MSDN を見る。
API としての GetPixel と CDC::GetPixel の両者があるとわかる。
MFC を使うということで CDC とは何者か、を検索する。
CDC が何であるか大体理解できたのであれば、これをどう取得すればいいか考える。
そこで CWnd のメンバとして CDC を扱う関数があることが見つけることができれば満点だ。
繰り返すがこれが目的達成のための仕様として正しいかどうかは要検討。

編集 削除