TOpenPictureDialogの表示メニューについて

解決


まきむら  2004-08-10 20:30:21  No: 10316

TOpenPictureDialogが開かれた時の表示メニューの初期状態を
「縮小版」にしたいのですがやり方がわかりません。
プロパティー等に何か設定を行えばできるものなのでしょうか?


TtPIPICH  2004-08-10 23:40:08  No: 10317

表示メニューってなんですか?


にしの  2004-08-11 01:31:36  No: 10318

まず最初に。

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;


まきむら  2004-08-11 04:02:36  No: 10319

解決しました。上記ソースをそのままつかわせていただきました。にしのさんありがとうございます。ちなみに私の環境はWIN XP + Delphi6です。


jok  2004-08-11 04:39:13  No: 10320

蛇足です。

にしのさん

> わからないなら書くべきではないです。

わたしも TtPIPICH さんと同じことを書き込もうとしていました。
「表示メニュー」じゃ分かる方が変なんじゃないですか?
リストビューの表示形式なんですね。メニューなんかどこにもないですし、
しいてそれらしいのはツールバーです。

> 縮小表示って、OSに依存しませんでしたっけ?

MSDN では XP だけで使えるメッセージがありますね。
にしのさんのコードでは、リストビューの親に WM_COMMAND を送って
ツールバーのコマンドを偽装していますね。Win2000 ではうまくいきません
でした。


TtPIPICH  2004-08-11 17:16:02  No: 10321

すみませんでした


にしの  2004-08-11 23:09:26  No: 10322

ツールバーのバルーンヘルプに、「表示メニュー」って出ますよ。

上でやっていることは、VCLのダイアログの親(これが実際のダイアログ)に属する、リストビューを取得して、リストビューに対してメッセージを送っています。
2000では駄目でしたか。
# 手元に2000がないので、模索できません
他には思いつきません。Webでさがすと、jokさんの言うように、ツールボタンの押下エミュレートが書いてあったのですが、IDが解らず断念。


jok  2004-08-12 08:37:41  No: 10323

> ツールバーのバルーンヘルプに、「表示メニュー」って出ますよ。

あっそうですね、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 はやはりツールバーのメニューから飛んでくるもの
を偽装しているんじゃないのですか?


jok  2004-08-12 08:57:04  No: 10324

> 他には思いつきません。

ちょっと調べてみました。

デスクトップの表示形式についてはここの

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: 

まさににしのさんがやったとおりのコードが紹介されています。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加