お世話になります。先日「コントロール一覧」ついてのスレを立てさせて頂いたもの
です。以前のスレで yukihiroさんから以下のアドバイスを頂きましたので、補足説明と
して新たにスレを立てさせて頂きました。
>「仕様を明確に」ってのはそういった要求を明文化することです。
>あるいは、なぜ座標一覧が必要なのかという説明があれば簡単な別解が見つかる可能性
>もあります。
今、ウィンドウ関連について開発および勉強をしておりまして気になることがありま
した。よく キャプチャーソフトで、あるウィンドウ内のボタンとか エディットボッ
クスを枠で囲み、そこだけをキャプチャする機能を見受けられます。そこで 各コント
ロールの座標をどのように取得しているのかを考えました。
そこで アクティブなウィンドウのコントロールの座標一覧をリストビューに表示で
きないかなぁと考え投稿させて頂きました。
ところが 実際に EnumChirdWindow()などを使って一覧を表示させてみるといろん
なコントロールの座標を取得してきました。ある程度はIsVisibleWindow() を利用して
判別できたのですが、MDI方式のアプリで見受けられると思われる
『非表示』ではないが、他の子の陰で見えない子ウィンドウ。
をどうやって判別すればいいのかがわからず苦戦している次第であります。
長々と補足説明になりましたが、以上の説明で何かアドバイス頂けたら光栄です。
指定範囲内に限定できるのであれば(全画面選択とかすると遅いかも…),
全座標に対して、WindowFromPoint を呼び、重複ウィンドウを排除するとか。
<MSDN>
WindowFromPoint
指定された座標を含むウィンドウのハンドルを取得します。
-- snip --
この関数は、非表示のウィンドウや無効化されているウィンドウのハンドルは取り出しません。この
ような制限のない検索を行いたい場合は、
-- snip --
</MSDN>
# yukihiro さんの想定されている API はおそらくこれじゃないかと思います。(違うかも。
重なり判定の一例です。
void EnumVisibleChild(CWnd* pwnd)
{
CRect rc;
pwnd->GetClientRect(rc);
pwnd->ClientToScreen(rc);
CRgn rgn;
rgn.CreateRectRgnIndirect(rc);
pwnd = pwnd->GetTopWindow();
while (pwnd) {
pwnd->GetWindowRect(rc);
if (rgn.RectInRegion(rc)) {
// 見えている(一部でも)
CRgn rgn2;
rgn2.CreateRectRgnIndirect(rc);
rgn.CombineRgn(&rgn, &rgn2, RGN_DIFF);
}
pwnd = pwnd->GetNextWindow();
}
}
以下も考慮する必要があるかもしれません。
・矩形でないウィンドウ
・スタティックテキストのように、他のコントロールの上にあるのに
下にあるように振る舞うウィンドウ
・兄弟ではなく、別のウィンドウに隠されている場合
・半透明ウィンドウ
>Banさん
それです^^
Banさん。dairygoodsさん。yukihiroさんありがとうございます。
WindowFromPoint について調べてみます。またdairygoodsさんにアドバイスして頂いた
コードを用いて一度ためしてみます。あとはどうにかして自己解決したいと思います。
ありがとうございました。また何かあればよろしくお願いします