TOpenPictureDialogが開かれた時の表示メニューの初期状態を
「縮小版」にしたいのですがやり方がわかりません。
プロパティー等に何か設定を行えばできるものなのでしょうか?
表示メニューってなんですか?
まず最初に。
TtPIPICHさんへ。
わからないなら書くべきではないです。
ここの質問者は、「知っている方に」聞いているんだと思います。
知らない人が集まったところで、解決できることはほとんどありません。
本題です。
縮小表示って、OSに依存しませんでしたっけ?
WinXP SP1 + Delphi7では、以下の記述で出来ました。
フォルダを変更するたびに、縮小表示に変わるので、最初だけにしたいのであればフラグを用意するなどしてください。
procedure TForm1.OpenPictureDialog1FolderChange(Sender: TObject);
var
ViewHandle: THandle;
begin
ViewHandle := FindWindowEx(GetParent(OpenPictureDialog1.Handle), 0, 'SHELLDLL_DefView', nil);
PostMessage(ViewHandle, WM_COMMAND, MAKEWPARAM($702d, 0), 0);
Application.ProcessMessages;
PostMessage(ViewHandle, WM_COMMAND, MAKEWPARAM($a006, 1), 0);
end;
解決しました。上記ソースをそのままつかわせていただきました。にしのさんありがとうございます。ちなみに私の環境はWIN XP + Delphi6です。
蛇足です。
にしのさん
> わからないなら書くべきではないです。
わたしも TtPIPICH さんと同じことを書き込もうとしていました。
「表示メニュー」じゃ分かる方が変なんじゃないですか?
リストビューの表示形式なんですね。メニューなんかどこにもないですし、
しいてそれらしいのはツールバーです。
> 縮小表示って、OSに依存しませんでしたっけ?
MSDN では XP だけで使えるメッセージがありますね。
にしのさんのコードでは、リストビューの親に WM_COMMAND を送って
ツールバーのコマンドを偽装していますね。Win2000 ではうまくいきません
でした。
すみませんでした
ツールバーのバルーンヘルプに、「表示メニュー」って出ますよ。
上でやっていることは、VCLのダイアログの親(これが実際のダイアログ)に属する、リストビューを取得して、リストビューに対してメッセージを送っています。
2000では駄目でしたか。
# 手元に2000がないので、模索できません
他には思いつきません。Webでさがすと、jokさんの言うように、ツールボタンの押下エミュレートが書いてあったのですが、IDが解らず断念。
> ツールバーのバルーンヘルプに、「表示メニュー」って出ますよ。
あっそうですね、Win2k でもツールチップで出ます。Win98 ではそもそも[詳細]と[一覧]しか
ありませんでした。失礼しました。それで、元質問の
> 表示メニューの初期状態を「縮小版」にしたいのですが
が、「表示メニュー」そのものの初期化についてのことかと思い、 ListView の表示形式の変更
のことを言ってるのは推測できませんでした。
> リストビューを取得して、リストビューに対してメッセージを送っています。
これは違います。コモンコントロール自身に WM_COMMAND を送るのは変です。
> ViewHandle := FindWindowEx(GetParent(OpenPictureDialog1.Handle), 0, 'SHELLDLL_DefView', nil);
このコードでは、 SHELLDLL_DefView クラスのウィンドウですから、spy++ などで見ると分かり
ますように、このウィンドウの子ウィンドウとして SysListView32 クラスのウィンドウがあり
ます。すくなくても Win2k と Win98 ではそうなっています。ですから、SHELLDLL_DefView は
目的のリストビューの親ウィンドウです。にしのさんのコードの PostMessage() 部分は具体的に
解読することはできませんが、WM_COMMAND はやはりツールバーのメニューから飛んでくるもの
を偽装しているんじゃないのですか?
> 他には思いつきません。
ちょっと調べてみました。
デスクトップの表示形式についてはここの
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200405/04050031.txt
でシャノンさんが LVM_SETVIEW メッセージを使うことを示唆していますが、
OpenDialog 系では XP でもうまくいかないようです。さらに調べてみると
まさにぴったりの解説をみつけました。
http://msdn.microsoft.com/msdnmag/issues/04/03/cqa/
The dialog sends a WM_COMMAND message to the SHELLDLL_DefView, with command ID = 0x702c.
So to change the view to details, all you have to do is send a WM_COMMAND to the shell
window, not the list control:
まさににしのさんがやったとおりのコードが紹介されています。
ツイート | ![]() |