C#父子窗体怎么弄

C#父子窗体怎么弄,第1张

一、实现MDI

1、创建父窗体,设置其Name、Text、IsMdiContainer属性

2、创建子窗体,设置其Name属性

3、为父窗体添加构造函数:

public MdiFather()

{

InitializeComponent()

MdiChild child = new MdiChild(this)

child.Show()

}

4、为子窗体添加构造函数:

public MdiChild(MdiFather parent)

{

InitializeComponent()

this.MdiParent = parent

}

二、添加菜单和RichTextBox控件

5、为父窗体添加主菜单

文件|新建、打开、退出,并修改其Name属性(MunuFile和MenuNew)

6、为子窗体添加RichTextBox控件,并设置其Anchor属性

7、为“新建”菜单添加事件处理函数:

private void MenuNew_Click(object sender, EventArgs e)

{

string caption

caption = "新建文档"

MdiChild child = new MdiChild(this, caption)

child.Show()

}

8、修改子窗体构造函数:

public MdiChild(MdiFather parent,string caption)

{

InitializeComponent()

this.MdiParent = parent

this.Text = caption

}

同时修改父窗体的构造函数:

private int

numberoftext = 2//构造函数

public MdiFather()

{

string caption

caption = "新建文档" + numberoftext++

InitializeComponent()

MdiChild child = new MdiChild(this,caption)

child.Show()

}

9、为了在子窗体的标题栏中显示打开文档的数量,修改父窗体“新建”菜单事件处理函数

public MdiFather()

{

string caption

caption = "新建文档" + numberoftext++

InitializeComponent()

MdiChild child = new MdiChild(this,caption)

child.Show()

}

三、标准窗体和MDI应用程序

模态对话框和非模态对话框

10、添加帮助|关于 菜单项 设置Name属性(MenuAbout)

11、添加Windows窗体,设置Name属性为About

添加RichTextBox控件,Text属性="MDI标准窗体'关于'对话框

设置字体颜色和背景颜色

ReadOnly="true"

12、为“关于”菜单添加代码:

//打开“关于”窗体

private void

MenuAbout_Click(object sender, EventArgs e)

{

About newf = new About()

newf.Text = "关于对话框"

newf.ShowDialog()

}

四、菜单和MDI应用程序

13、依照P244表10-1和表10-2设置父窗体和子窗体的菜单

(1)合并菜单

父窗体菜单设置

菜单

Name

Text MergeOrder

MergeType

文件

MenuFile

文件

1 MergeItems

帮助

MenuHelp

帮助

5

ADD

子窗体菜单设置

菜单

Name

Text

MergeOrderMergeType

文件

MenuFile1

文件

1MergeItems

编辑

MenuEdit

编辑

2ADD

窗口

MenuWindows

窗口

3ADD

缩放

MenuZoom

缩放

4

ADD

说明:MergeOrder属性应用于菜单项,它包含一个整型值。该值由菜单和菜单项用来指示两个菜单或菜单项全新的相对次序。

MergeType属性和MergeOrder属性一起作用,定义一个菜单是否可以替换另一个菜单,一个菜单是否添加到另外一个菜单中,以及两个菜单中的菜单项是否能够合并在一起。

(2)合并菜单项

分别创建父窗体和子窗体的菜单,并更改其属性。

父窗体“文件”菜单及其属性

菜单

Name

Text

MergeOrder MergeType

文件

MenuFile

文件

1 MergeItems

新建

MenuNew

新建

1

MergeItems

打开

MenuOpen

打开

2 MergeItems

退出

MenuExit

退出

5

MergeItems

子窗体“文件”菜单及其属性

菜单

Name

Text

MergeOrder MergeType

文件

MenuFile1

文件

1 MergeItems

保存

MenuSave 保存

3

MergeItems

关闭

MenuClose

关闭

4

MergeItems

14、添加上下文菜单控件,Name=ContextMenuEdit

15、添加子菜单项

上下文菜单:

剪切 Name=ContextMenuCut

复制 Name=ContextMenuCopy

粘贴 Name=ContextMenuPaste

加粗 Name=ContextMenuBold

斜体 Name=ContextMenuItliac

下划线 Name=ContextMenuUnderline

颜色 Name=ContextMenuColor

字体 Name=ContextMenuFont

16、设置RichTextBox控件的ContextMenu属性为ContextMenuEdit。

五、MDI窗体事件

(1)Closing事件

父窗体和子窗体都具有closing事件,但关闭子窗体时,仅触发该子窗体的closing事件,而关闭父窗体时,closing事件将首先触发每个打开的子窗体的closing事件,其中任何一个被取消时,Windows将停止触发后续的closing事件,当closing事件为所有的子窗体触发之后,将为父窗体触发。

(2)TextChanged事件

检测子窗体上的RichTextBox控件文本内容是否被更改。父窗体关闭时,父窗体的closing事件获得用户确认退出的解决方案。子窗体的closing事件处理程序检测子窗体上的文本内容是否被修改,如果是将d出对话框,询问用户是要保存、放弃修改或取消closing事件。

17、添加全局变量 public bool Textchanged=false

添加TextChanged事件处理程序

bool Textchanged=true

18、为子窗体MDIChild添加Closing事件处理程序:

//窗体关闭事件

private void

MDIChild_FormClosing(object sender, FormClosingEventArgs e)

{

if (Textchanged)

{

//创建一个“保存文件对话框”的实例

SaveFileDialog savedlg = new SaveFileDialog()

savedlg.Filter = "格式文档 (*.rtf)|*.rtf|纯文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*"

//用来保存对话框的返回值,枚举类型

DialogResult dlgResult

//关闭窗口时d出对话框,根据用户选择决定“保存”|“放弃修改”|“取消”

if (Textchanged == true)

{

dlgResult = MessageBox.Show("文档已经被修改,保存吗?", "确认", MessageBoxButtons.YesNoCancel,

MessageBoxIcon.Question)

switch (dlgResult)

{

case DialogResult.Yes:

//this._Save()

save()

break

case DialogResult.No:

break

case DialogResult.Cancel:

e.Cancel = true //取消事件

break

}

}

}

}

19、为父窗体MDIFather添加Closing事件:

//父窗体关闭事件

private void

MDIFather_FormClosing(object sender, FormClosingEventArgs e)

{

DialogResult dlgResult

dlgResult = MessageBox.Show("退出程序吗?", "请确认", MessageBoxButtons.YesNo,

MessageBoxIcon.Question)

if (dlgResult == DialogResult.No)

e.Cancel = true

}

20、为父窗体中的“退出”菜单和子窗体中的“关闭”菜单添加事件处理函数:

this.Close()

Application.Exit()

六、管理MDI子窗体

(1)排列子窗体

Layout(MdiLayout)枚举值

21、为“水平排列”和“垂直排列”菜单项添加事件处理函数:

//“编辑”|“垂直排列”菜单事件处理函数

private void

MenuCWinV_Click(object sender, EventArgs e)

{

this.LayoutMdi(MdiLayout.TileVertical)

}

//“编辑”|“水平排列”菜单事件处理函数

private void

MenuCWinH_Click_1(object sender, EventArgs e)

{

this.LayoutMdi(MdiLayout.TileHorizontal)

}

//“编辑”|“层叠排列”菜单事件处理函数

private void

MenuCWinC_Click(object sender, EventArgs e)

{

this.LayoutMdi(MdiLayout.Cascade)

}

(2)使用菜单选择MDI子窗体

让用户方便地在不同的MDI子窗体之间导航。

设置“窗口”菜单项的MdiList属性为true即可。

2005 *** 作方法:将子窗体的“窗口”菜单挪到父窗体中,设置主菜单控件的MdiWindowListItem属性为“窗口”菜单(MenuItemWindows)。

七、RichTextBox控件

URL(统一资源定位符):

协议://路径(IP)/文件名

#include <windows.h> 

const LPSTR szClassName = "sdfkljs"

const LPSTR szWindowName = "sdfk"

const LPSTR szChildClassName = "asdfklajd"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)

LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM)

WNDCLASSEX wc

HWND hwnd1,hwnd2

HINSTANCE hInst

int nCmdShow

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow){

::nCmdShow = nCmdShow 

::hInst = hInstance

wc.cbSize = sizeof(wc)

wc.style = CS_HREDRAW | CS_VREDRAW

wc.lpfnWndProc = WndProc

wc.cbClsExtra = 0

wc.cbWndExtra = 0

wc.hInstance = hInstance

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION)

wc.hCursor = LoadCursor(NULL, IDC_ARROW)

wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH)

wc.lpszMenuName = NULL

wc.lpszClassName = szClassName

wc.hIconSm = NULL

RegisterClassEx(&wc)

hwnd1 = CreateWindowEx(0, szClassName, szWindowName, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL)

ShowWindow(hwnd1, nCmdShow)

UpdateWindow(hwnd1)

wc.lpfnWndProc = ChildProc

wc.hIcon = NULL

wc.hCursor = NULL

wc.lpszClassName = szChildClassName

RegisterClassEx(&wc)

hwnd2 = CreateWindowEx(0, szChildClassName, NULL, WS_CHILDWINDOW|WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, hwnd1, NULL, hInst, NULL)

if (hwnd2==NULL){

MessageBox(NULL, "Wrong!", "adfa", MB_OKCANCEL)

return -1

}

ShowWindow(hwnd2, nCmdShow)

UpdateWindow(hwnd2)

MSG msg

while (GetMessage(&msg, NULL, NULL, NULL)){

TranslateMessage(&msg)

DispatchMessage(&msg)

}

return msg.wParam

}

LRESULT CALLBACK WndProc(HWND h1, UINT msg, WPARAM w1, LPARAM l1){

switch (msg) {

case WM_LBUTTONDOWN:

MessageBox(h1, "Frame Click", "Click!", MB_OK) return 0

default: return DefWindowProc(h1, msg, w1, l1)

}

}

LRESULT CALLBACK ChildProc(HWND h1, UINT msg, WPARAM w1, LPARAM l1){

switch (msg) {

case WM_LBUTTONDOWN:

MessageBox(h1, "View Click", "Click!", MB_OK) return 0

default: return DefWindowProc(h1, msg, w1, l1)

}

}

已改好,主要的问题是:

你在设置好子窗口类后没有调用RegisterClassEx()函数注册窗口类,导致子窗口创建不成功,我把子窗口的创建从WM_CREATE放到WINMAIN里了,你可以看看,然后做进一步修改


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11636170.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存