OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

マウス位置の色を得る

  • 暇なときにでも
  • 質問No.189816
  • 閲覧数510
  • ありがとう数6
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 59% (194/328)

マウス位置は lParam にあるらしいから

 typedef struct tagPOINT {
  LONG x_zahyo_long;
  LONG y_zahyo_long;
 }POINT;

 POINT p;

 char x_zahyo[5], y_zahyo[5];

として、

 case WM_RBUTTONDOWN:

  p.x_zahyo_long = LOWORD(lParam);
  p.y_zahyo_long = HIWORD(lParam);

  sprintf(x_zahyo,"%04d", p.x_zahyo_long);
  sprintf(y_zahyo,"%04d", p.y_zahyo_long);

  SetWindowText(hrs, x_zahyo);
  SetWindowText(hrs, y_zahyo);

 break;

でやってたけど、得られた座標は常に 0001,0001 でした。
本題とは別だけど、4桁表示のやり方で、もっといいソースがあったら
教えてください。
bcc32 では lParam からマウス位置取得は無理ですか?


lParam が使えなかったから、

 POINT p = { 0,0 };

として、

 GetCursorPos( &p );

で座標を得ました。

それで、ウインドウ上のマウスの位置の色を取得するにはどうしたら
いいんですか?
getPixel( ) の引数やソースの書式を教えてほしいです。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル8

ベストアンサー率 39% (23/58)

WinAPIに徹するなら、
GetPixel()が妥当かなと。

COLERREF GetPixel(HDC 色を得たい座標のHDC, int X座標, int Y座標);

クリックするなら相手先のウィンドウはアクティブのはずなので、
COLORREF color;
HDC hdc = GetDC(GetActiveWindow());
color = GetPixel( hdc, LOWORD(lParam), HIWORD(lParam));
ReleaseDC(GetActiveWindow(), hdc);
でいけるんじゃないかと思います。

確認してないのでアヤシイですが。
「回答に対する自信」はホントの所「全くなし」です。
お礼コメント
A__

お礼率 59% (194/328)

ありがとうございます。

LRESULT CALLBACK WndProc( ...

 char zahyo[99];
 COLORREF color;

 case WM_RBUTTONDOWN:

  color = GetPixel( HWND_DESKTOP, LOWORD(lParam), HIWORD(lParam));
  sprintf(zahyo, "%d %d", LOWORD(color), color);
  SetWindowText(hrs, zahyo);


右クリした時のマウス位置の画面の色は color に入ると思って
こんなソースにしたけど、結果は、LOWORD(color) も color も 0 でした。
ソースを教えてください。
投稿日時 - 2001-12-25 00:54:35
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル13

ベストアンサー率 37% (331/872)

こんにちは、honiyonです。  lParamから直接取得出来るのかどうかは分からないですが、出来るはずだと思います。  因みに、メッセージを直接操作してマウス位置を取得したい場合、TWMMouse型を使うと便利ですよ。 class TForm1 ... private:  procedure WM_RButtonDown(var MouseMessage: TWMMouse); me ...続きを読む
こんにちは、honiyonです。

 lParamから直接取得出来るのかどうかは分からないですが、出来るはずだと思います。
 因みに、メッセージを直接操作してマウス位置を取得したい場合、TWMMouse型を使うと便利ですよ。

class TForm1 ...
private:
 procedure WM_RButtonDown(var MouseMessage: TWMMouse); message WM_RBUTTONDOWN;

 こんな感じです。


 マウスの位置の色を取得したい場合ですが、用途にわけて二種類のやり方があります。
  1.Form上やButton上、1つのImage上など、1つのオブジェクトの中でのみ色を取得出来れば良い。(ボタンやイメージを含む1つのウインドウ全体ではない)
  2.ウインドウ全体のイメージの、色を取得したい。

 1のケースでは、そのオブジェクトの CanvasのPixelsプロパティを使えば簡単に取得出来ます。 Canvas->Pixcelsは、そのオブジェクトの中での座標なので、マウス位置をそのオブジェクトの中での座標に変換する必要があります。
 2のケースは、上記の方法ですとなかなか難しいです。Form1の(100,100)の位置にあるButton1の色を取得したい場合、Form1->Canvas->Pixels[100,100]とするだけでは、Form1の、100,100の位置の色、つまりボタンの下の色が取得されてしまいます。(確かそうだったと思う...) そのため、マウスポインタがどのオブジェクトの上にのっているか?を判断し、そのオブジェクトのCanvasを調べねばならないので面倒です。
 しかしこれを楽して実現する方法があります。デスクトップ全体の Canvasを取得して、それに対して色を調べれば良いのです。そうすればどのオブジェクトが・・・とか調べる必要がありません。全部一枚の絵として取得出来るので。また、この方法であればマウスが自分のウインドウ外にいるときでも、その位置の色が取得出来ちゃいますね。
 やり方は、TCanvasを自分でCreateして用意し、Canvas->Handleに、デスクトップのデバイスコンテキストを入れてあげれば、デスクトップのCanvasクラスが用意できます。

 参考になれば幸いです(..
お礼コメント
A__

お礼率 59% (194/328)

ありがとうございます。
デスクトップの色を得る方法でやろうと思いました。
でも、ソースが分からなくてうまくいってないんです。
投稿日時 - 2001-12-25 00:46:19


  • 回答No.3
レベル13

ベストアンサー率 37% (331/872)

こんにちは、honiyonです。  どの部分のソースが分からないのか、分かりませんので一通り流れを書きます。 -------------------------------------------------------------- HDC ScreenHDC; TCanvas ScreenCanvas; //デスクトップキャンバス作成 ScreenHDC = G ...続きを読む
こんにちは、honiyonです。

 どの部分のソースが分からないのか、分かりませんので一通り流れを書きます。

--------------------------------------------------------------
HDC ScreenHDC;
TCanvas ScreenCanvas;

//デスクトップキャンバス作成
ScreenHDC = GetDC( 0 );
ScreenCanvas.Handle = ScreenHDC;

~必要な処理~

//後始末
ReleaseDC( 0, ScreenHDC );
--------------------------------------------------------------

 Delphiのソースからそれらしく変換したもので、動作確認はとっていません。
 多分これで合っていると思いますが、間違っていたらゴメンサイ。

 参考になれば幸いです(..
補足コメント
A__

お礼率 59% (194/328)

ありがとうございます。
TCanvas が使えなくて、Tで始まっていからDelphi用の
関数だと思ったからそれを外して書きました。
それから、まだ lParam でマウス位置を得られていないから
GetCursorPos( ) で書き替えて、

LRESULT CALLBACK ...

 char zahyo[9];
 POINT p = { 0,0 };
 HDC ScreenHDC;

 switch(msg){

 case WM_RBUTTONDOWN:

  GetCursorPos( &p ); // ディスプレイに対するマウス位置

  sprintf(zahyo, "%d %d", p.x, p.y); // char型にする
  SetWindowText(hrs_A, zahyo); // マウス位置表示

  ScreenHDC = GetDC( 0 );
  color = GetPixel( ScreenHDC, p.x, p.y);
  ReleaseDC( 0, ScreenHDC );

  sprintf(zahyo, "%d %d", LOWORD(color), color);
  SetWindowText(hrs_B, zahyo);

 break;

実行して、case WM_RBUTTONDOWN が動作すると、
よくあるエラー3回表示になってしまいます。
マウス位置は問題なく表示されます。
ソースの間違いを教えてください。
投稿日時 - 2001-12-25 20:39:14
  • 回答No.4
レベル8

ベストアンサー率 39% (23/58)

#2で答えたものです。 スイマセン、素で嘘かいてました。 > クリックするなら相手先のウィンドウはアクティブのはずなので、 他のウィンドウへのメッセージが飛んでくるはずがない(汗 なに書いてんだろう、自分。 自分のウィンドウ以外の領域も見たかったらマウスフックが要りますね。 自分のウィンドウ内だけなら一番下のソースで動きました。 尚、#3の回答への補足で書かれていたソ ...続きを読む
#2で答えたものです。
スイマセン、素で嘘かいてました。

> クリックするなら相手先のウィンドウはアクティブのはずなので、

他のウィンドウへのメッセージが飛んでくるはずがない(汗
なに書いてんだろう、自分。
自分のウィンドウ以外の領域も見たかったらマウスフックが要りますね。

自分のウィンドウ内だけなら一番下のソースで動きました。

尚、#3の回答への補足で書かれていたソースは、
1.GetDC()の第一引数はHDCを得たいHWNDを指定しなければならない。
2.GetCursorPos()で得られる座標はスクリーン座標である。
 よってScreenToClient()でクライアント座標に変換しなければいけない。
3.sprintf(zahyo, "%d %d", LOWORD(color), color);のcolorが白だと
 "65535 18777215"となって、配列領域外になる。
の三つの理由に動きません。

ま、マウスフックを書くなら全面的に書き直しになるとは思いますが。

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp){
char point[16];
POINT pt;
HDC hdc;
COLORREF color;

switch(msg){
case WM_RBUTTONDOWN:
 GetCursorPos(&pt);
 sprintf(point, "%d %d", pt.x, pt.y);
 SetWindowText(hwnd, point);
 hdc = GetDC( hwnd);
 ScreenToClient(hwnd, &pt);
 color = GetPixel( hdc, pt.x, pt.y);
 ReleaseDC( hwnd, hdc );
 sprintf(point, "%10d", color);
 SetWindowText(hwnd, point);
 break;
以下略。

毎度ながら「回答に対する自信」は「皆無」です。
お礼コメント
A__

お礼率 59% (194/328)

デスクトップのマウス位置なら GetDC( 0 ) でいい
と書いてあるサイトがあったけど、GetDC(HWND_DESKTOP)
でないとだめでした。

ScreenToClient( ) でクライアント座標にすることもできました。

color の出力も直して、色を得ることができました。
ありがとうございます。
投稿日時 - 2001-12-26 23:41:42
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ