1

C# で Windows フォーム アプリケーションを作成しています。これにより、いくつかの Windows ユーティリティ (CMD プロンプト、レジストリ エディター、イベント ビューアーなど) を起動して、メイン フォームの MdiClient コントロールに配置できます。

子ウィンドウが MdiClient の境界を超えたときに MdiClient コントロールのスクロール バーが自動的に表示されないことを除いて、すべてがうまく機能しています。子ウィンドウがウィンドウ フォームである場合、MdiClient のスクロール バーが期待どおりに自動的に表示されることがわかります。いくつかの複雑な回避策を含め、多くのことを試しました..そして、私が完全に見落としている何かがあるに違いないと考え始めています.

以下にいくつかのサンプルコードを添付しました。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;

namespace MdiClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            System.Windows.Forms.MdiClient mdiClient = new System.Windows.Forms.MdiClient();
            mdiClient.Dock = DockStyle.Fill;
            mdiClient.BackColor = Color.WhiteSmoke;
            this.Controls.Add(mdiClient);

            int processID = StartCMD();
            AddToMDIClient(processID, mdiClient.Handle);
        }

        private int StartCMD()
        {
            int processID = -1;

            using (Process process = new Process())
            {
                ProcessStartInfo startInfo = process.StartInfo;
                startInfo.FileName = "cmd.exe";

                try
                {
                    process.Start();
                    processID = process.Id;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }

            return processID;
        }
        private void AddToMDIClient(int processID, IntPtr mdiClientHandle)
        {
            try
            {
                Process process = Process.GetProcessById(processID);

                int numberOfAttempts = 0;
                while (string.IsNullOrEmpty(process.MainWindowTitle) && numberOfAttempts < 30)//max of 3 seconds
                {
                    Thread.Sleep(100);
                    process.Refresh();

                    numberOfAttempts++;
                }

                if (!string.IsNullOrEmpty(process.MainWindowTitle))
                {
                    SetWindowPos(process.MainWindowHandle, HWND_TOPMOST, 1, 1, 0, 0, TOPMOST_FLAGS);

                    SetParent(process.MainWindowHandle, mdiClientHandle);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X,
            int Y, int cx, int cy, uint uFlags);

        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
        public const UInt32 TOPMOST_FLAGS = /*SWP_NOMOVE | */SWP_NOSIZE;

        public const UInt32 SWP_NOSIZE = 0x0001;
    }
}

以下のスクリーンショットは、CMD ウィンドウが移動され、その境界が MdiClient の境界の外側にある場合、スクロール バーがないことを示しています。

画像については、次のリンクを参照してください: http://picasaweb.google.com/lh/photo/75rMVJMCWRg_s_DFF6LmNg?authkey=Gv1sRgCIKRlsu8xuDh8AE&feat=directlink

どんな助けでも大歓迎です!

ありがとう、シェイディ

4

2 に答える 2

1

スクリーンショットがないとなんとも言えませんが、MDIParanet の作成方法が複雑すぎると思います。

private void Form1_Load(object sender, EventArgs e)
    {
       // System.Windows.Forms.MdiClient mdiClient = new System.Windows.Forms.MdiClient();
       //  mdiClient.Dock = DockStyle.Fill;
       // mdiClient.BackColor = Color.WhiteSmoke;
       // this.Controls.Add(mdiClient);

       this.IsMdiContainer = true;

        int processID = StartCMD();
        AddToMDIClient(processID, mdiClient.Handle);
    }

クライアントが必要な場合は、コントロールからフィルタリングできます。

もう 1 つの問題は、MDIChild を TOP_MOST として設定することかもしれませんが、それは良い組み合わせではないと思います。

于 2009-09-19T11:30:13.290 に答える
0

私はいくつかのテストを行ってきましたが、フォームのプロパティで Autoscroll = true を持っている限り、問題なく動作します。

また、フォームを拡大してコマンド ウィンドウを右下に移動すると、スクロール バーが表示されないことに気付きました。コマンド ウィンドウを超えてフォームを最小化した場合にのみ表示されます (以下のスクリーンショットを参照)。

スクリーンショット 1 http://picasaweb.google.com/lh/photo/rfwm-S8y06Fl3HFNshgj3g?feat=directlink

スクリーンショット 2 http://picasaweb.google.com/lh/photo/y6qkN9Jj19vDGFNkTuL4FQ?feat=directlink

また、フォームのプロパティで AutoScrollMinSize を設定して、常にフォームのスクロール バーが設定されたサイズよりも小さくなるようにすることはできますか

それが役立つことを願っています

ジョシュ

于 2009-10-07T15:15:17.373 に答える