|
■No79943 (kazu さん) に返信
> はやり表に出ておらず固まってるように見えているというのが濃厚そうです。
背後に表示されている可能性を調査するため、
フォームの Opacity プロパティを半分程度にしておいては如何でしょう。
■No79945 (kazu さん) に返信
> IntPtr.Zero をコメントアウトしたところ、表示はされますが真ん中(デフォルト)で表示されてしまいます。
return 値を変更する事で、表示位置が異なると言うことでしょうか。
その現象も、当方では再現しませんでした。
Windows 7x64 Pro + VS2015 Enterprise Update 1 + .NET 4.6.01055 です。
以下に、今回の検証コードを貼っておきます。
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private Button button1;
private TextBox textBox1;
public Form1()
{
// InitializeComponent();
Controls.Add(button1 = new Button());
Controls.Add(textBox1 = new TextBox());
button1.Location = new Point(16, 16);
button1.Width = 200;
textBox1.Location = new Point(16, button1.Bottom + 16);
textBox1.Anchor = AnchorStyles.Left | AnchorStyles.Right;
button1.Click += delegate
{
using (var dlg = new ColorDialogEx())
{
dlg.AllowFullOpen = true;
Point p = PointToScreen(new Point(textBox1.Left + 20, textBox1.Top + 8));
textBox1.Text = p.ToString();
dlg.Location = p;
if (dlg.ShowDialog(this) == DialogResult.OK)
{
textBox1.BackColor = dlg.Color;
button1.Text = new ColorConverter().ConvertToString(dlg.Color);
}
}
};
}
internal class ColorDialogEx : ColorDialog
{
public Point? Location = null;
public ColorDialogEx() { }
protected override IntPtr HookProc(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam)
{
const int WM_INITDIALOG = 0x110;
if (msg == WM_INITDIALOG && Location != null)
{
base.HookProc(hWnd, msg, wparam, lparam);
RECT r;
GetWindowRect(hWnd, out r);
Point xy = Location.Value;
MoveWindow(hWnd, xy.X, xy.Y, r.right - r.left, r.bottom - r.top, true);
return (IntPtr)1;
}
else
{
return base.HookProc(hWnd, msg, wparam, lparam);
}
}
[DllImport("user32.dll")]
private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[DllImport("user32.dll")]
private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
}
}
}
以下、ColorDialogEx の動作について:
・Location プロパティを null のままにした場合
→ 既定の動作(中央表示)
・Location プロパティをセットした場合
→ 指定した座標に表示(特に固まる様子は無い)
※ただし、MoveWindow を呼んだ後で base.HookProc を呼びだすようにすると中央表示になる。
・base.HookProc を呼ばず、0 を return した場合
→ カラーダイアログのキーボード操作ができない。
※ダイアログをクリックすると、キーボード操作できるようになる。
・1 を return した場合
→ カラーダイアログのキーボード操作ができる。
※base.HookProc を呼び出したかどうかとは無関係。
|