• ベストアンサー

MDIプログラムで子ウィンドウの相対座標を得るには?

VC++6.0でMDIプログラムを作っています。 Viewクラスでマウスの右ダブルクリックのメッセージを受け取って、 その関数の中で毎回、アクティブな子ウィンドウの左上の相対座標、 つまり、クライアント領域での子ウィンドウの左上の座標を知りたいのですが、 どのようにすれば得られるか分かりません。分かる方教えてください。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

GetWindowRect()、ClientToScreen()、ScreenToClient()を使ってくださいな。

mkmarimo
質問者

お礼

回答ありがとうございます。ClientToScreen()とScreenToClient()は知りませんでした。勉強になりました。

関連するQ&A

  • VC++6.0,MDI,子ウィンドウのタイトルが変わる!?

    VC++6.0でMDIプログラムを作成しているものです. 子ウィンドウをダブルクリックすると「ファイルを開く」のコモンダイアログを呼び出し,そこに選択した画像ファイルを表示させるプログラムを作ったのですが,ついでにタイトルバーに開いたファイル名を以下のようにして表示させました. // Viewクラスにて CFileDialog dlg(TRUE, "bmp", "*.bmp",               OFN_HIDEREADONLY|         OFN_OVERWRITEPROMPT,        "BITMAP(*.bmp)|         *.bmp|JPEG(*.jpg)|         *.jpg||"); if (dlg.DoModal() != IDOK) { return; } GetParent()->SetWindowText(dlg.GetFileName()); そして,画像を表示したウィンドウとは別のウィンドウをアクティブにすると,タイトルバーに表示したファイル名がウィンドウを生成したときのタイトルに戻ってしまいます. 子ウィンドウが何個あっても,表示している画像のファイル名をタイトルバーに表示したいのですが,どうすればいいのですか?

  • MDIでのダイアログ生成

    VC++2005でMDIアプリケーションを作成しています。 ダイアログベースでは、DoModal()にてダイアログを生成していましたが、 MDIでのダイアログ生成の方法が分かりません。。 調べた結果、 (1)CreateWindow()にてクライアントウィンドウを作成 (2)CreateMDIWindow()にて子ウィンドウを作成 の順序で処理を行うことは分かりましたが、 関数の一部の引数に何を設定してやれば良いのかが不明です。。 ※下記はネット上にあったサンプルソースです。  「???」の箇所が不明な引数です。 (1) CreateWindow(   TEXT("MDICLIENT"), //MDICLIENT は固定です   NULL,   WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,   0, 0, 0, 0,   hWnd,       //メインウィンドウのハンドル←???   (HMENU)1,    //←???   hInst,       //インスタンスハンドル←???   (LPSTR)&ccs    //CLIENTCREATESTRUCT構造体のポインタ←???  ); (2) HWND CreateMDIWindow(  MDI_CHILD ,   //ウィンドウクラス名  TITLE ,     //ウィンドウのタイトルバーテキスト  0 ,       //ウィンドウスタイル。WS_MAXIMIZE(最大化表示)など  CW_USEDEFAULT , //X座標  CW_USEDEFAULT , //Y座標  CW_USEDEFAULT , //幅  CW_USEDEFAULT , //高さ  hClientWindow , //クライアントウィンドウのハンドル ←???  hIns ,      //インスタンスハンドル       ←???  0        //アプリケーション定義の値 ); なお、行いたい処理の流れとしては、 CTestDialogクラスより、CTest2Dialogクラスのダイアログを、 呼び出したいのです。 うまく説明できず申し訳ありませんが、 お詳しい方おられましたら、具体例など交えてご説明頂けると幸いです。 お手数ですが、どうか宜しくお願い致します。

  • MDI

    VC++ 6.0 を使ってメーラーを作っています。 MDIで アドレス帳とメールボックスの2種類の 子ウインドウを出します。  これらの子ウインドウが 最大それぞれ1つだけ表示される ようにしたいのですが、 どうしたらよいのでしょうか?  ヒントをください。

  • MDI frame_windowのsize変更後にMSGが届かない

    C++のカテゴリでWindowsプログラミングの質問もおかしいと思いましたが、他に質問するカテゴリが無かったので申し訳ありませんが、よろしくお願いします。 久しぶりに時間が空いたため、windows apiを使って自作でクラスライブラリを作成に挑戦し、WINDOWSプログラミングを行っています。 MDIウィンドウのアプリケーションについて質問です。 アプリケーション起動時に、MDIのフレームウィンドウとクライアントウィンドウを生成し、クライアントウィンドウをダブルクリックした時に、MDI子ウィンドウを生成するようにプログラムを作成しました。 アプリケーション起動後、フレームウィンドウのサイズを変更せずにクライアントウィンドウ領域でダブルクリックするとダブルクリックした回数分、MDI子ウィンドウが生成されました。 しかし、一度でもフレームウィンドウのサイズを変更してしまった場合に、ダブルクリックしてもMDI子ウィンドウが生成されなくなってしまいました。 (※「WM_LBUTTONDBLCLK」メッセージ自体が来なくなった。) 何故、ダブルクリックのメッセージが来なくなるのか心当たりが無く困っています。 以下のホームページにクライアントウィンドウのリサイズした時の処理について記載されていますが、内容を追加しても解決しませんでした。 http://www.arcpit.co.jp/winapi/api_02/ap020407.htm 申し訳ありませんが、ダブルクリックのメッセージが来なくなる理由についてお心当たりがあれば、お教えお願い致します。 ※環境 OS:Windows Vista Home Basic 開発環境:Visual C++ Express Edition

  • プログラムでマウスを指定した座標に移動させる方法

    環境 windows xp jdk 1.6 awt.Panelクラス上でマウスイベントを取得しています。 マウスが特定の領域にきた場合、プログラムで強制的に、指定した別の座標(Javaアプリ上の座標)にマウスを移動する事は、可能でしょうか? 可能な場合どのようにコーディングすればよろしいでしょうか? ご教示よろしくお願いいたします。

    • ベストアンサー
    • Java
  • ウィンドウハンドルの座標を調べることはできますか?

    VB6環境です 様々なブラウザに対してフォーカスさせずにクリック操作をさせたいと考えています 現在、一応それは完成しました しかし、ブラウザを画面左上に置いた(top座標=0、left座標=0)場合です ブラウザの位置がどこにあろうとクリックさせたいのですが、クリック座標の指定が ゲットしたウィンドウハンドルをもつオブジェクトの原点座標を原点として指定するため、 ブラウザを一番左上に持ってこないと動作してくれません わかりにくい説明ですが、知りたいことは  「任意のブラウザの中のコンテンツを表示する領域(このウィンドウハンドルはゲットできました)の   原点座標をVB6にて取得したい」 ということです よろしくお願いします

  • VC++で作成したアプリ起動時のウィンドウサイズについて

    VC++初心者の者です。初投稿です。宜しくお願いします。 ※何を言っているのか解らない、情報が足りないって場合は聞いてください。超初心者ですので宜しくお願いします。。。 VC++で作成したMDIアプリを起動させた時、 又は新しくウィンドウを開いた時の デフォルトウィンドウサイズを指定する方法を どなたか教えていただけませんでしょうか? また、開いたウィンドウをリサイズできないように するにはどうしたら良いでしょうか? (ViewクラスはCFormViewを基底としています。) 宜しくお願い致します。

  • DirectInputでの現在のマウス座標は・・?

    DirectInputでマウス座標を取得したいのですが、 lX lY による移動量の取得方法しかわからず、 初回起動時に下のコードで現在座標を取得して扱っているのですが、 ----------------------------------- GetCursorPos(&point); ScreenToClient(hWnd, &point); input_mpos[0] = float(point.x); input_mpos[1] = float(point.y); ----------------------------------- 問題点 1.クライアント領域を抜け、モニターの隅までマウスカーソルが行っても移動量が加算され続け狂ってしまう 2.タイトルバーをダブルクリックして擬似フルスクリーンにすると移動量そのものが通用しない 3.フォーカスが飛んだり、ダイアログボックスが出ると現在座標が狂ってしまう に悩まされています。 常に確実にクライアント内の座標を捕らえ続けられる計算式というか、 定番の手順というものが有ったりするのでしょうか? それとも、マウス座標はDirectXで取得しようとする事そのものが間違いだったりするのでしょうか? 経験者様いらっしゃいましたら、ヒント程度でも構いませんので教えて頂けると幸いです。 orz

  • 座標上のある点が、ある3つの座標点で結んだ三角形の領域内にあるか調べる

    座標上のある点が、ある3つの座標点で結んだ三角形の領域内にあるか調べる方法。 座標上に3つの点(x1,y1)(x2,y2)(x3,y3)で結ばれた三角形があります。 ある点(px,py)が、この三角形の内側の領域に存在するかどうかを知りたいのですが、 数学のなんという分野で、どういう求め方をするのかがわかりません。 どなたかお力添えいただければ幸いです。 関係ないかもしれませんが、左上を0,0とし、右下はn1,n2の、 Windowsペイントのようなマイナスを考慮しない座標になっています。 線上を内側とするか、外側とするかはどちらでもかまいません。 どなたかお詳しい方、お暇なときにでもご回答よろしくお願いします。

  • SDIのクライアント領域に子ウィンドウを生成するには?

    環境 Win98 VC++6.0 MFCにて http://www.kumei.ne.jp/c_lang/sdk/sdk_50.htm ↑のように、SDIにてクライアント領域に子ウィンドウを生成するには、MFCの場合どうすれば良いのでしょうか? いつも質問ばかりで申し訳ありません。 ご存知の方お願いいたします。

専門家に質問してみよう