#c# #winforms
#c# #winforms
Вопрос:
С помощью следующего кода из моего класса, отделенного от моей основной формы, я создаю панель, в которую загружаю либо другую форму из своего решения, либо внешний exe-файл.
Когда я загружаю форму и изменяю размер основной формы, размер загруженной формы изменяется, но если я загружаю внешний исполняемый файл, он не изменяется.
В моем внешнем исполняемом файле я помещаю кнопку, которая позволяет переключить его на свернутый / развернутый, и он принимает размер родительской панели.
Я хотел бы, чтобы мой импортированный exe-файл автоматически изменял размер при изменении размера основной формы.
Я начинаю, и я представил, что мне нужно открыть дескриптор моего exe-файла на своей панели и что при изменении размера моей основной формы я минимизирую / максимизирую exe-файл с помощью дескриптора, но я не знаю, что делать или даже как и или объявить переменную типа дескриптора (я думаю, лонгинит).
Может быть, есть более простое решение, которое вы можете мне подсказать. Если мой код не самый лучший, можете ли вы сказать мне об этом тоже, потому что я учусь и хочу использовать лучшие практики.
Спасибо вам за вашу помощь.
Мой основной код формы :
namespace mtx2 { public partial class MainForm : Form { private static MainForm form1 = null; public MainForm() { InitializeComponent(); form1 = this; } private void iMportToolStripMenuItem_Click(object sender, EventArgs e) { _UI.ShowPanel(form1, "formtest"); } private void testImportExterForm2ToolStripMenuItem_Click(object sender, EventArgs e) { _UI.ShowPanel(form1, "test.exe"); }
Мой Код Класса :
namespace mtx2 { public static class _UI { public static void CachePanels(MainForm frm) { foreach (Control ctrl in frm.Controls) { if (ctrl is Panel) { if (ctrl.Name == "viewer") { ctrl.Dispose(); return; } } } } [System.Runtime.InteropServices.DllImport("user32.dll")] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [System.Runtime.InteropServices.DllImport("user32.dll")] static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); [System.Runtime.InteropServices.DllImport("user32.dll")] static extern bool MoveWindow(IntPtr Handle, int x, int y, int w, int h, bool repaint); static readonly int GWL_STYLE = -16; static readonly int WS_VISIBLE = 0x10000000; public static void ShowPanel(MainForm frm, string nom) { CachePanels(frm); Panel pnl = new Panel(); pnl.Name = "viewer"; pnl.Dock = DockStyle.Fill; pnl.Visible = true; frm.Controls.Add(pnl); if (nom.Contains(".exe")) { Process p = Process.Start(nom); Thread.Sleep(50); p.WaitForInputIdle(); SetWindowLong(p.MainWindowHandle, GWL_STYLE, WS_VISIBLE); MoveWindow(p.MainWindowHandle, 0, 0, 0, 0, true); try { foreach (Control ctrl in frm.Controls) { if (ctrl.Name == "viewer") { SetParent(p.MainWindowHandle, ctrl.Handle); MoveWindow(p.MainWindowHandle, 0, 0, ctrl.Width, ctrl.Height, true); break; } } } finally { // } } else { formtest myForm = new formtest(); myForm.FormBorderStyle = FormBorderStyle.None; myForm.TopLevel = false; myForm.AutoScroll = true; myForm.Dock = DockStyle.Fill; foreach (Control ctrl in frm.Controls) { if (ctrl.Name == "viewer") { ctrl.Controls.Add(myForm); break; } } myForm.Show(); } } } }
Комментарии:
1. У меня проблема с формированием кода, извините, но я не знаю, как это изменить
2. Ваша основная форма должна иметь изменение размера, а также событие изменения размера. Если вы добавите обработчик для любого из этих событий, вы сможете в обработчике событий захватить ссылку, сохраненную для внешнего exe-файла, и переместить ее / изменить ее размер.
3. Спасибо за ваш ответ, но я не знаю, как это сделать. Я думаю, что мне нужно объявить глобальную переменную, чтобы сохранить в ней дескриптор открытого exe-файла, но я не знаю, как его объявить или как его получить, а затем я не знаю, как с помощью дескриптора мы можем взаимодействовать с exe-файлом. У вас есть учебник или пример, пожалуйста