• ベストアンサー

ダイアログ内コントロールの位置取得について

いつもお世話になっております。 ダイアログ内に配置されているコントロールの位置の取得方法について ご教授頂きたく質問させていただきました。 私が試したところGetWindowRect( コントロールハンドル, &rc ); とするとありえないぐらい大きな座標が帰ってきます。 上記の方法ではうまくいきません。 ご教授よろしくお願いいたします。

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

  • ベストアンサー
回答No.2

>http://msdn.microsoft.com/ja-jp/library/cc364604.aspx より >クライアント座標はクライアント領域の左上端からの相対座標なので、左上端の座標は常に (0,0) となります。 となっているため >GetClientRectでダイアログ内の相対位置を取れます。 は間違っていました。 >もしかしたら便利な関数が存在するのでしょうか? ないのかなぁと。 かわりにこんな関数を作っておくとか。 BOOL GetDlgItemRect(HWND hDlg, int nIDDlgItem, RECT* rct) {   BOOL bRet = FALSE;   HWND hWnd = GetDlgItem(hDlg, nIDDlgItem);   if (hWnd != NULL)   {     bRet = GetWindowRect(hWnd, rct);     {       bRet = ScreenToClient(hDlg, rct);     }   }   return bRet; }

Daisuke-now
質問者

お礼

bluecampus様 丁寧な回答ありがとうございます。 勉強になりました。 私も便利な関数がないかと探したのですが見つからずbluecampus様 の作成されたように関数を作っておく事に決めました。 ご教授ありがとうございました。

その他の回答 (1)

回答No.1

GetClientRectでダイアログ内の相対位置を取れます。 GetWindowRectからならScreenToClientで変換します。

Daisuke-now
質問者

お礼

ご回答ありがとうございます。 1.GetClientRectで取得してみたところ、コントロールの幅と高さは取得 できますが、位置( left, top )は取得できませんでした。 2.GetWindowRectで取得し、left,topの値をPOINT型の変数に入れてから ScreenToClientを行うと正常な値が取得できました。 ありがとうございました。 2.で成功するのですが、ここまで手間がかかると大変ですね。 もしかしたら便利な関数が存在するのでしょうか?

関連するQ&A

  • MFC ダイアログ上のID取得について

    VC++6.0 MFC ダイアログベースで開発しています。 リソースエディタで配置したダイアログ上にある全てのコントロール(ボタン、テキスト等)IDを取得する方法はありませんか? よろしくお願いします。

  • ダイアログ上コントロールの動作について

    MFCでダイアログにて動作するアプリケーションを作成しています。 表示されたダイアログの枠をドラッグすると、ダイアログの大きさが変わりますが、 中にあるコントロールの大きさ・位置は変わりません。 ダイアログの大きさ変更に伴い、コントロールの大きさも変更するには、 どのような実装の仕方をすれば良いのでしょうか? 解決法をご存知の方おられましたら、ご教授お願い致します。 開発環境はVC++2005です。

  • ダイアログのチェックボックスの状態を取得するには、、、

    開発環境:VB6.0 IEで表示されるID,パスワード入力ダイアログに、自動でID,パスワードを入力し、OKボタンを押すというアプリを作成しています。 (ID,パスワードの入力、OKボタンを押すというところまではできています。) このダイアログには、Win2000だと「このパスワードを保存する」、WinXPだと「パスワードを記憶する」というチェックボックスが表示されます。 OKボタンを押す前に、このチェックボックスのチェックをはずす操作を加えたいと考えています。 したがって、チェックされているときは、チェック欄をWM_LBUTTONDOWN、WM_LBUTTONUPを使用して、クリックさせ、はじめからチェックがされていない場合は、そのままOKボタンを押すという動作にしたいのですが、このチェックボックスのオン/オフ状態を取得する方法がわかりません。ハンドルの取得まではできるのですが、どなたか、状態を取得する方法をご存知の方いらっしゃいましたら、ご教授いただけませんでしょうか。 また、チェックボックスの状態を取得できない場合、チェックボックスの座標を指定し、色を取得して、「黒だったらオンの状態」「白であればオフの状態」と判断するのも手かと思うのですが、FindWindowで取得したダイアログのハンドルとGetPixelとを使用して該当個所の色を取得する方法がわかりません。 GetPixel(GetDC(ダイアログのハンドル), x座標, y座標)としているのですが、チェックボックスを指定するためのx,yの値の確認方法がわかりません。そもそもこの記述であっているのかどうか・・・)この点についてもアドバイスいただけたらと思います。 うまく質問が書けなくてすみませんが、どうぞよろしくお願いします。

  • コントロールの絶対位置を取得したい

    フォーム内の複数のコンテナ上にあるコントロールの絶対位置(フォーム左端からの位置)を簡単な方法で取得できないでしょうか(VB.NET)。 すべての親コンテナの相対位置を積算すればわかると思うのですが、もっと簡単な方法で取得できないでしょうか。

  • ファイルダイアログでファイルをダブルクリックするとコントロールの位置が変わる

    WindowsXP、VB.NET2005で開発しています。 フォームにコントロールを配置し、 コントロール(ラベル・ピクチャーボックス)を動的に作成して マウスのドラッグにて移動できるようにしております。 問題となっているのは ContextMenu から実行する処理で ファイルダイアログを起動しているのですが、 そのファイルダイアログのファイルをダブルクリックして選択すると もとのコントロールの位置が変わってしまいます。 ファイルダイアログで行っている処理は選んだファイル名の格納だけなので、移動するのがなぜかわかりません。 OKボタンクリックでは移動しません。 画面上にラベルピクチャーボックスがある状態で 上記操作をすると、ピクチャーボックスが移動してしまいます。 移動しなくなるときもあるのですが、 法則がつかめておりません。 原因としてどういったことが考えられるでしょうか?

  • ダイアログを継承したダイアログの作成について

    お世話になります。 今回お聞きしたいことは、 オリジナルに作成したダイアログを継承したオリジナルのダイアログを作成した際に、オリジナルに作成した基底ダイアログのダイアログ上のコントロールや、そのコントロールの位置を継承することはできますでしょうか? ということです。 何がしたいかといいますと、4つのダイアログをメインダイアログから呼び出すのですが、その4つのダイアログには共通するコントロールがあり、そのコントロールの動作もその位置も全く同じなのです。 そのため、いちいち4つのダイアログにコントロールの貼り付けや、処理を記入せずに、その共通のコントロールをもった基底ダイアログを作成して、その基底ダイアログの継承としてダイアログが作れたらなと思い、質問させて頂きました。 継承をすると、基底クラスの関数等を使うことができるというのはわかるのですが、ダイアログ上のコントロールの位置までは不可能なのかなと疑問に思いました。 ご回答を宜しくお願い致します。 開発環境は Windows CE 6.0 Visual Studio 2005 です。

  • VBでフォームにコントロールを動的に挿入するにはどうすればよいでしょう

    VBでフォームにコントロールを動的に挿入するにはどうすればよいでしょうか。 いつもお世話になります。 動的にコントロールを配置する方法は分かっています。 しかし、新規に配置したいコントロールのサイズ分、すでに配置されているコントロールの位置をずらして、コントロールを配置(要するに挿入)する方法がわかりません。 何かよい方法があれば教えて頂けませんでしょうか。 使用しているVBのバージョンは2010です。 宜しくお願いします。

  • 子ダイアログのコントロールにフォーカス(VC++2005)

    お世話になります。 Visual Studio 2005でVC++の開発をしております。 ダイアログを2つ用意して、一つはstyleを「ポップアップ」に、 もう一つは「子」にしてます。 親ダイアログ内にタブをセットし、その上に子を乗せる処理を行っていて 親のダイアログのボタンイベントから子のダイアログのコントロールにフォーカスを 当てたいのですが、どのようにしたらよろしいのでしょうか? 親ダイアログ内では、 (子ダイアログ).Create(子ダイアログクラス, this); で生成して MoveWindowやShowWindowで位置・表示の設定を行っています。 親から子ダイアログ内のコントロールの入力チェックを行おうと思い、 未入力判定まではできたのですが どうしてもSetFocus()でフォーカスが当たりません。 どなたかご教授していただけますでしょうか?

  • VS2008-Proでラベルコントロールの絶対位置にしたい。

    VS2008-Proでラベルコントロールの絶対位置にしたい。 初心者です。Web勉強中です。 <オプション> ダイアログの左側 [HTML デザイナ]-[CSS 配置] が開いてる状態になりますので、右側の配置オプションで [ツールボックス、貼り付け、またはドラッグ・・・] にチェックを入れてますが、ラベルコントロールが自由な名位置(「絶対配置」)になりません。 ボタンやテキストコントロールはできるのですが。 どうすれば、なるのでしょうか。教えていただけませんか?

  • C# タブのコントロール取得

    お世話になります。 FOAM上のコントロールを取得する場合は foreach (Control ctr1 in Controls){ } で取れますが、FOAM上のTabControlにADDしてあるコントロールを取得することができませんでした。 タブコントロールまでは取得できますが…。 タブ上に配置してあるオブジェクトを取得するには どのようにしたらよいのでしょうか? お知恵を拝借できればと思います。 よろしくお願いします。