現在
非MFCにて、
VisualC++2005
VisualC++6.0
両方に対応しようとプログラムを書いているのですが、
GetAncestorというAPIがVC6だとコンパイルエラーになり、またVC6ヘルプにも見当たりません。
ということで、GetAncestor を使わずに
GetAncestor( hWnd, GA_PARENT );
GetAncestor( hWnd, GA_ROOTOWNER );
を実現したいと考えています。
GA_ROOTOWNER
の方は、親とオーナーを辿って一番下地のウィンドウを取得するものなので、GetParentと呼び続け
れば再現できそうです。
ただし、環境によっては GetParent で親は取得できるけど親がオーナーの場合 NULL が返るという
話も聞いたことがあり、少々不安です。
詳しい方がいれば情報お待ちしています。
GA_PARENT
は、ヘルプ曰く、親ウィンドウは取得できるけど自身がオーナーの場合は取得に失敗するようです。
どちらも取得できるGetParentでは再現できそうにありません。
ちなみにオーナーの定義が調べてもイマイチわからなかったのですが、GA_PARENTを使った私の環境
での(WindowsXP)実験では親がNULLな場合とポップアップウィンドウどうやら、オーナーウィンド
ウらしいです。
これらの、実現方法・一口メモ・ツッコミなどお待ちしています。
よろしくお願いします。
> GetAncestorというAPIがVC6だとコンパイルエラーになり、またVC6ヘルプにも見当たり
ません。
ヘルプの方は判りませんが…
winuser.hにありませんか?
WINVERの設定とかではないでしょうか??
windows.h をインクルードする前に、
#define WINVER 0x0500
と書いたらコンパイル通るようになりました。
Windows98以降でサポートされているようですね。
こういった設定は初めて知りました。
ただこれだとWindows95で動かないんですよね……
フリーソフト制作しているので出来ればWindows95も対応したい……とも思うが、もはや使ってる人
数なんて0にも等しいような過去の遺産だし、別にいいかなーとも思う。
うーん、悩む。
もう少し情報集めます。
ありがとうございました。
> ただこれだとWindows95で動かないんですよね……
> フリーソフト制作しているので出来ればWindows95も対応したい……とも思うが、もはや
使ってる人
> 数なんて0にも等しいような過去の遺産だし、別にいいかなーとも思う。
GetProcAddress()で引っ張ってくる…という方法もアリかと。
ちょっと面倒かも知れませんが。
# 私が公開しているモノは…Windows95だとIE4のシェル統合が必要って感じで出してます。
# 動作確認は出来ていませんけど。(手元にWindows95ないし)
# 使っていなかったけど、HeapCompact()のアドレス、ソレで取ってきているな。(9X系未
対応。)
GetParentとの動作の違いについてはよくわかりませんが
GetWindow関数にGW_OWNERを指定すればオーナーウインドウが取れるので
それと組み合わせるとか。
とりあえずウィンドウスタイルに WS_CHILD が指定されている場合のみ GetParent を使うことで
GetAncestor( hWnd, GA_PARENT ) の代用をすることにしました。(WS_CHILD以外はNULLを返す)
オーナーウィンドウの具体的な定義が調べてもイマイチなので、これで GetAncestor( hWnd,
GA_PARENT ) と同じ動作が保障されるわけではありませんが、とりあえず妥協という形で解決とさ
せていただきたい思います。
いろいろ提案していただいてありがとうございました。