マウス位置は 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( ) の引数やソースの書式を教えてほしいです。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

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);
でいけるんじゃないかと思います。

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

ありがとうございます。

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

#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;
以下略。

毎度ながら「回答に対する自信」は「皆無」です。
    • good
    • 0
この回答へのお礼

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

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

color の出力も直して、色を得ることができました。
ありがとうございます。

お礼日時:2001/12/26 23:41

こんにちは、honiyonです。



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

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

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

~必要な処理~

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

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

 参考になれば幸いです(..

この回答への補足

ありがとうございます。
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
    • good
    • 0

こんにちは、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クラスが用意できます。

 参考になれば幸いです(..
    • good
    • 0
この回答へのお礼

ありがとうございます。
デスクトップの色を得る方法でやろうと思いました。
でも、ソースが分からなくてうまくいってないんです。

お礼日時:2001/12/25 00:46

このQ&Aに関連する人気のQ&A

Delphi とは」に関するQ&A: 自作ソフトの作り方

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q動詞一覧・目的語一覧・補語一覧みたいな英語の詞・語ごとにずらーと並んだ

動詞一覧・目的語一覧・補語一覧みたいな英語の詞・語ごとにずらーと並んだサイトってないですか?

Aベストアンサー

動詞はともかく「目的語」とは「補語」というのは文における働きなので, そんな一覧を求めることがそもそも全く無意味.

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Q新着順や新着順一覧を英語で書くと??

英語で新着順ってなんて書きますか?
HPに写真を載せていて
写真を新着順一覧に表示するスペースの名前を英語にすると、なんて書けばいいんでしょうか?
新着順や新着順一覧…という感じでお願いします。

Aベストアンサー

Sort by Date (日付順)というリンクが多いですね。

順番の切り替えに latest to earliest (最新から最古へ) とその逆を書いてある場合や、上向き三角▲と下向き三角▼のボタンを使っているところもあります。

到着というのをわざわざ盛り込んでいるところは少ないですが、長くても良いならば、Sort by Date arrived か Sort by Arrival Date とも書けます。

今回に写真という語も入れようとすると、Photos sorted by date (latest to earliest) のようになって見た目は冗長になってしまいます。

QC言語で f1(x,y)-f2(x,y) の式は

C言語で f1(x,y)-f2(x,y) の式ってどうなるか教えて下さい。お願いします。

Aベストアンサー

こーなるんじゃないかな?
机上だけでコンパイルしているわけではないので
ミスがあるかも。m(_"_)m
#XとYが動的に変化するグラフを求めたい訳ではないですよね?

#include <stdio.h>

int f1(int x,int y)
{
int z;
//目的の計算式

z=0

return z;
}
int f2(int x,int y)
{
int z;
//目的の計算式

z=0

return z;
}
main ()
{
int X,Y,Z;

X=0; // 好きな数字
Y=0; // 好きな数字


Z=f1(X,Y)-f2(X,Y);

printf("f1(X,Y)-f2(X,Y)=%d\n",Z)
}

QWindows7でプログラム一覧が英語表示される

Windows7でプログラム一覧が英語表示される

Windows7 Professionalを使っています。
最近気がついたのですが
普通ならプログラム一覧で
「アクセサリ」と表示されるはずの部分が
英語で「Accessories」と表示されるようになっていました。
メニュー自体もすべて英語で
たとえば「電卓」なら「Calculator」といった具合です。

ちなみに「ゲーム」は「Games」
「既定のプログラム」は「Default Programs」となっていますが
「スタートアップ」はそのままです。

ソフト自体に不具合はないのですが
何となく気になります。
かといって
名前を一つ一つ変更するのも面倒です。
簡単に元へ戻す方法がお分かりでしたら
よろしくお願いいたします。

Aベストアンサー

詳しくは分かりませんが、C:\Users\○○\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\AccessoriesにあるはずのDesktop.iniをうまく設定すればよいと思います。ちなみに○○はユーザー名です。

Qfor(s=p; *p; p++)の*p(ポインタ)の意味

for(s=p; *p; p++)の*p(ポインタ)の意味
C言語初心者です。
今ポインタを勉強しているのですが、
for文で上記のようなものが出てきて、意味が分からず困っています。
*pで*p != NULL と同じような意味になるみたいなのですが…。
どうしてそのような意味になるのでしょうか?

ちなみにsとpはポインタで、
sには配列(入力した文字列)の先頭アドレスが入っています。
pは文字列を指していて○○○○○NULL ←になるから上記のような条件で
回るんだろうなぁとはなんとなく考えているのですが。

Aベストアンサー

念のため:
ヌルポインタは「ビットパターンとして」0 じゃないかもしれませんが, ソースプログラムにおいて「ポインタが要求される場面」で「0」とあれば, それは「ヌルポインタ」です.
もうちょっと厳密に書くと「整定数 0」はヌルポインタに変換される.

Qヘンな日本語英語の一覧があるサイト

ヘンな日本語英語の一覧があるサイトなんてご存知ありませんか?
ピアース、ピーマン、ビデオデッキ、シャーペンなど、実際には使われない英語がたくさん日本で使われていたりしますが、こういうリストが載っているサイトを探しています。

ご存知の方いらっしゃいましたら教えて下さいっ!
よろしくお願いしまっす!

Aベストアンサー

洋サイトですが

参考URL:http://www.engrish.com/

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Q色の名前は、日本語と英語のどちらを多く使う?・・・例えば「緑」と「グリーン」

「緑」と「グリーン」、「灰色」と「グレー」・・・

色の名前を言う時、日本語と英語のどちらを多く使いますか?

例えば、
・服の色は?
・車の色は?
・携帯機器(電話・プレイヤーなど)の色は?
どちらの表現を多く使いますか?

又、その他
「このもの(種類)は、日本語(英語)で言う」
「この色は、日本語(英語)で言う」
「殆ど、日本語(英語)で言う」
といったご回答も、歓迎します!

Aベストアンサー

じゃあいきましょか。英語です。私ら。

ピンク、ローズピンク、チェリーレッド、マローピンク、チリアンパープル、コスモス、チェリーピンク、ベビーピンク、ラムプラーローズ、ラズベリー、ローズマダー、カーマイン、パーシアンローズ、プラム、ガーネット、ピアニーレッド、プリムラ、コーラル、サルビア、マゼンダ、バーミリオン、シグナルレッド、ホビーレッド、ロブスター、ケチャップ、ファイヤー、スカーレット、バーミリオンレッド、ルビー、オペラ、ブリック。ベルベット。
以上赤系統。
日本にも古来のゆかしき呼び方はありますが、この点に関しましては英語に軍配をあげます。

グレーといいましても、シルバーホワイトグレー、パールグレー、オレンジグレー、イエローグレー、ブルーグレー、ピンクグレー、フレンチグレー、ミディアムグレー、グレー、ダークグレー、カーボングレー、チャーコールグレー、…あぁしんど。
私は日本男児ですが色名は英語です。

QSendMessage(hW,WM_CREATE,0,0);を

SendMessage(hW,WM_CREATE,0,0);
を実行するとシステムがWM_DOWNやWM_CHARを発行しなくなるみたいです
というのはそれ以降キー入力を無視するようになるのです
いったんアプリをアイコン化してウィンドウ化するとWM_DOWNやWM_CHARを発行するようになります
WM_CREATEを送ってもWM_DOWNやWM_CHARを発行しなくなるのを阻止するために何か方法はないでしょうか?

Aベストアンサー

>プログラムのイニシャライズのために送ったのですが送らないで住むプログラムに変更しました

普通はそんな方法はとりません。
システムが何をするか分からないからです。

自分でメッセージを定義して、初期化処理を行うようするためのメッセージを送るほうが無難です。
WM_CREATEと同じ処理を初期化処理として行わせたいのであれば、初期化処理を関数化して自分で定義したメッセージでも呼び出せばいいのですし。


>作ったプッシュボタンを押してシステムがWM_COMMANDを送ってきた後キー関係のメッセージを送ってくれなくなります

プッシュボタンがキーボードフォーカスを持ってのるでは?

ボタンがキーボードフォーカスを持っていてもキー関連のメッセージを親ウィンドウが受け取りたいのであれば、サブクラス化をするしかないでしょう。


人気Q&Aランキング