現在、VC++でボタンが押された際に、フォルダの参照ダイアログが
出現するプログラムになっています。
しかし、PCディスプレイの画面を小さなTVディスプレイに映す必要があるため、
小さなディスプレイではフォルダの参照ダイアログが画面から途切れてしまいます。
そこで、フォルダの参照ダイアログの出現位置を変更する必要があるのですが。
どなたか、方法を知っている方、ご教授願います。
VC++の質問でしょうか?
ここは、C#もしくはVBの掲示板です。
VC++の掲示板はこちら
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi
VC++の質問の場合、OS、VCのバージョン、プロジェクトの種類
によって多種多様のコードが記述できますので、必ず明記してください。
例)WindowsXP Pro SP2/VC++6.0/MFC Application
質問に対してですが、システムフックの予感がしますけど。。。
ごめんなさい。書き間違えました。C#です。
システムフックとは何でしょうか?
もう少し詳しく教えていただけたら幸いです。
FolderBrowserDialogは継承不可能なクラスなので、
Win32APIのSHBrowseForFolderを使うことになるのかな?
SHBrowseForFolder関数の引数の構造体のメンバのフックプロシージャに独自の
処理をさせる関数をのせればできそうなんだけど、、、、結構難しい気がします。
(コールバック関数を作るのが面倒だと思う。)
表示させてから、移動させるのならば少しは簡単かも。(ただ、ダイアログが動くのがみ
える)
(フックは表示前に指定の位置に表示させる方法。)
> 表示させてから、移動させるのならば少しは簡単かも。(ただ、ダイアログが動くのが
みえる)
試しに,やってみました。
自分の環境では、動いているようには見えないです。(十分使えそう)
Form1にボタンとFolderBrowserDialogを配置します。
// WindowsXP SP2/VS2005 C#2.0
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
namespace FDTest
{
public class Win32API
{
[DllImport(User32.dll, CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow
(string lpszClass, string lpszWindow);
[DllImport(User32.dll)]
public static extern UInt32 SetWindowPos
(IntPtr hWnd, IntPtr hWndInsertAfter,
int x, int y, int cx, int cy, int wFlags);
public const int SWP_NOSIZE = 1;
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(func));
t.Start();
this.folderBrowserDialog1.ShowDialog();
}
private static void func()
{
IntPtr hWnd;
// フォルダ参照ダイアログを探す
do
{
hWnd = Win32API.FindWindow(null, フォルダの参照);
} while (hWnd == IntPtr.Zero);
// フォルダ参照ダイアログの位置を(10,10)にする
Win32API.SetWindowPos(hWnd, IntPtr.Zero,
10, 10, 0, 0, Win32API.SWP_NOSIZE);
}
}
}
ありがとうございました。無事にできました。
APIに関してはわからないことだらけなので…
ちなみに、フォルダの参照ダイアログの大きさも変更できるのでしょうか?
もしよろしかったら教えていただけないでしょうか。
SetWindowPos を調べてもらえばわかりますが、5、6番目の引数は
大きさを指定するものです。
public class Win32API
{
[DllImport(User32.dll, CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow
(string lpszClass, string lpszWindow);
[DllImport(User32.dll)]
public static extern UInt32 SetWindowPos
(IntPtr hWnd, IntPtr hWndInsertAfter,
int x, int y, int cx, int cy, int wFlags);
public const int SWP_NOSIZE = 1;
public const int SWP_SHOWWINDOW = 0x0040; // 追加
}
Win32API.SetWindowPos(hWnd, IntPtr.Zero,
10, 10, 100, 100, Win32API.SWP_SHOWWINDOW);
とすれば、大きさを変えれます。
ただし、ウィンドウの大きさですので、中のコントロールの大きさは相対的に変わるわ
けではありません。
もし、そうしたいのであれば、FindWindowExで子コントロールを取得して、大きさを変
えることになるでしょう。
(もっといろんなことやるのであれば、やっぱりSHBrowseForFolderを使うのかな。)
出来上がっているものに対して変更を加えようとすると、カナリの労力を使います。
Windowsの仕組みがあまり理解していないのであれば、あまりいじらないほうが無難で
す。
>とすれば、大きさを変えれます。
あ~ダメでした。ウィンドウを動かしたりすると元に戻っちゃいますね。
>中のコントロールの大きさは相対的に変わるわけではありません。
コモンダイアログは相対的にかわるっぽい。
>>とすれば、大きさを変えれます。
>あ~ダメでした。ウィンドウを動かしたりすると元に戻っちゃいますね。
小さめに設定してしまうとこうなるようです。
元の大きさよりも大きめに設定すれば、うまくいくようです。
そうですか。いろいろと教えていただきありがとうございました。
APIなどもう少し勉強してみたいと思います。
GetWindowRectでもともとのウィンドウの大きさを取得してから、
それより大きめに設定すればよさげ。
public class Win32API
{
[DllImport(User32.dll, CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow
(string lpszClass, string lpszWindow);
[DllImport(User32.dll)]
public static extern uint SetWindowPos
(IntPtr hWnd, IntPtr hWndInsertAfter,
int x, int y, int cx, int cy, int wFlags);
public const int SWP_NOSIZE = 1;
public const int SWP_SHOWWINDOW = 0x0040;
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[DllImport(User32.dll)]
public static extern uint GetWindowRect
(IntPtr hWnd, ref RECT lpRect);
}
Win32API.RECT rc = new Win32API.RECT();
Win32API.GetWindowRect(hWnd, ref rc);
// フォルダ参照ダイアログの位置を(10,10)に,大きさを元の大きさ+100にする
Win32API.SetWindowPos(hWnd, IntPtr.Zero,
10, 10,
rc.right - rc.left + 100,
rc.bottom - rc.top + 100,
Win32API.SWP_SHOWWINDOW);
すいません。もう1度質問させてください。
フォルダを参照ダイアログと同じようにファイルを開くダイアログの
大きさを変更しようと思ったのですが、できません。
これは仕様なんでしょうか?
上の質問は大きくはできるけど、小さくはできないという意味です。
質問内容不足していてすいません。
>これは仕様なんでしょうか?
おそらく、そうです。
コモンダイアログと呼ばれるものは、C#からでは全部カスタマイズしにくくなっていま
す。
(OpenFileDialog,FolderBrowserDialog,ColorDialog,FontDialog,,,etc.)
そうですか、ありがとうございました。