コントロール一覧の補足 – プログラミング – Home

コントロール一覧の補足
 
通知
すべてクリア

[解決済] コントロール一覧の補足


ドルドル
 ドルドル
(@ドルドル)
ゲスト
結合: 19年前
投稿: 96
Topic starter  

 お世話になります。先日「コントロール一覧」ついてのスレを立てさせて頂いたもの
です。以前のスレで yukihiroさんから以下のアドバイスを頂きましたので、補足説明と
して新たにスレを立てさせて頂きました。

>「仕様を明確に」ってのはそういった要求を明文化することです。
>あるいは、なぜ座標一覧が必要なのかという説明があれば簡単な別解が見つかる可能性
>もあります。

 今、ウィンドウ関連について開発および勉強をしておりまして気になることがありま
した。よく キャプチャーソフトで、あるウィンドウ内のボタンとか エディットボッ
クスを枠で囲み、そこだけをキャプチャする機能を見受けられます。そこで 各コント
ロールの座標をどのように取得しているのかを考えました。
 そこで アクティブなウィンドウのコントロールの座標一覧をリストビューに表示で
きないかなぁと考え投稿させて頂きました。
 ところが 実際に EnumChirdWindow()などを使って一覧を表示させてみるといろん
なコントロールの座標を取得してきました。ある程度はIsVisibleWindow() を利用して
判別できたのですが、MDI方式のアプリで見受けられると思われる
『非表示』ではないが、他の子の陰で見えない子ウィンドウ。
をどうやって判別すればいいのかがわからず苦戦している次第であります。

長々と補足説明になりましたが、以上の説明で何かアドバイス頂けたら光栄です。

 


引用未解決
トピックタグ
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

指定範囲内に限定できるのであれば(全画面選択とかすると遅いかも…),
全座標に対して、WindowFromPoint を呼び、重複ウィンドウを排除するとか。

<MSDN>
WindowFromPoint
指定された座標を含むウィンドウのハンドルを取得します。
-- snip --
この関数は、非表示のウィンドウや無効化されているウィンドウのハンドルは取り出しません。この
ような制限のない検索を行いたい場合は、
-- snip --
</MSDN>


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

# yukihiro さんの想定されている API はおそらくこれじゃないかと思います。(違うかも。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

重なり判定の一例です。

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();
}
}

以下も考慮する必要があるかもしれません。
・矩形でないウィンドウ
・スタティックテキストのように、他のコントロールの上にあるのに
 下にあるように振る舞うウィンドウ
・兄弟ではなく、別のウィンドウに隠されている場合
・半透明ウィンドウ


返信引用
yukihiro
 yukihiro
(@yukihiro)
ゲスト
結合: 22年前
投稿: 24
 

>Banさん
それです^^


返信引用
ドルドル
 ドルドル
(@ドルドル)
ゲスト
結合: 19年前
投稿: 96
Topic starter  

 Banさん。dairygoodsさん。yukihiroさんありがとうございます。
WindowFromPoint について調べてみます。またdairygoodsさんにアドバイスして頂いた
コードを用いて一度ためしてみます。あとはどうにかして自己解決したいと思います。
ありがとうございました。また何かあればよろしくお願いします


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました