将窗体从属于主窗体

C#--WinForm项目主窗体设计 主窗体基本设置大小、颜色、去边框、出现的位置 Panel控件背景图、颜色、布局:Label标签文本、字体、背景颜色、布局 按钮布局、文本、字体颜色、背景色、 底部panel绑定控件边框、颜色用label标签导入图标 SplitContainer容器拖放时直接放不好操作设置属性: 设置不绑定到容器的边框 设置颜色 拖放调整合适大小:固定左边pane 阅读详情
几乎所有正式一点的C++ Builder程序除了主窗体外都还有从属窗体,有时是对话框,有时是无模式窗口。VCL使得创建和显示从属窗体都易如反掌。但不是所有程序都适于采用无模式窗体,有些程序需要在一个主窗体内显示不同的内容。本文讨论如何将一个从属窗体“寄居”于主窗体中,从属窗体看上去是主窗体的一部分,用户甚至不知道一个从窗体正被显示。图A显示了一个主窗体,其客户区是一个从窗体。

理解子/父联系
  这类程序的基本思路是让所有从属窗体都作主窗体的子窗体,这种设计在其他框架(如OWL或MFC)中很常见,但在VCL程序中却不常见。VCL不允许简单地指定一下属性就使一个窗体从属于另一窗体,要做到这一点还得付出点小小的劳动。你得告诉Microsoft Windows从属窗体是主窗体的子对象,在C++ Builder编程中一般趋于认为窗体是窗口,元件是子对象,实际上从Windows的观点来看,窗体和元件都是窗口。可以将任一窗口
(窗体和元件)指定为另一窗口的子对象,只要你暂时跳出VCL圈子。

更好的“鼠夹”
  将一个窗体附属于一个主窗体的一个好处是你可以象设计任何其他从属窗体一样设计子窗体,就是说你创建一个新的窗体,在其上添加元件并书写这个窗体的代码。这样使得设计你的子窗体变得容易,并将所有操纵子窗体的代码集中在一个地方。

程序设计范例
  先给出一些程序的背景,程序名叫PARENTING,有一个主窗体,主窗体的顶部和底部各有一个工具条(Tool Bar)和状态条(Status bar),除主窗体外,还有两个子窗体,一个叫TTableForm,用栅格显示ANIMAL.DBF数据表,ANIMAL表是C++ Builder带的数据库样本的一个表。另一个子窗体TChartForm用Tchart显示ANIMAL表。(如果你购买的C++ Builder是标准版则没有数据库元件)你可以通过点击菜单项或工具按钮来选择显示表单还是图形窗体,在你作出选择时,活动窗体被摧毁而被选窗体被显示,子窗体在主窗体的工具条下方、状态条上方的客户区显示,而且随主窗体大小变动而随时保持充满客户区。

重载CreateParams()
  如前所述,为让主窗体控制从属窗体,需要将主窗体设为从窗体的“父”,这可以通过重载CreateParams()方法来完成。CreateParams()在VCL创建与窗体联系的窗口时调用,CreateParams()的声明如下:
void __fastcall CreateParams(TCreateParams& Params);
CreateParams()的唯一参数是对一个TCreateParams结构体的引用。在VCL中TCreateParams定义如下:


struct TCreateParams
{
char *Caption;
int Style;
int ExStyle;
int X;
int Y;
int Width;
int Height;
HWND WndParent;
void *Param;
tagWNDCLASSA WindowClass;
char WinClassName[64];
};


  此结构包含了Windows创建一个窗口所需的所有信息(如果你曾用API进行Windows编程,你一定能意识到TCreateParams的成员对Windows CREATESTRUCT结构的映射)。在重载CreateParams()时,首先调用基类的CreateParams()方法,然后修改TCreateParams结构的个别成员变量。一个重载过的CreateParams()方法看起来大致如下:


void __fastcall TChartForm::CreateParams(TCreateParams& Params)
{
Tform::CreateParams(Params);
Params.Style=WS_CHILD|WS_CLIPSIBLINGS;
Params.WndParent=MainForm->Handle;
Params.X=0;
Params.Y=0;
Params.Width=MainForm->ClientRect.Right;
Params.Height=MainForm->ClientRect.Bottom;
}


  程序的关键是设置TCreateParams结构体的Style和WndParent成员,Style设WS_CHILD 和WS_CLIPSIBLINGS窗口式样,WS_CHILD指定窗口为另一窗口的子窗口。根据定义,一个子窗口是没有标题棒的,设计时的标题棒在Windows在运行时创建窗体会被去掉。WS_CLIPSIBLINGS保证主窗口的不同子窗口在窗体绘制时不互相干涉。很明显,一个子窗口必须得有一个父对象,通过将父窗口句柄指定给TCreateParams结构体WndParent 成员就指定了父对象,正如前面代码所示,WndParent成员设置为主窗体的Handle属性。鉴于指定父对象属性相对直接明了,我不在这个主题上深入更多。

设置子窗体的属性
  除了CreateParams()方法中的代码外,还得设置一些子窗体的属性,多数属性可以保留缺省值,但AutoScroll属性应设为false,当然,前提是你的窗体要设计为不必卷动的窗体风格。因为子窗口的大小和位置在CreateParams()中设定,所以Position属性可置为poDefault。Caption和BorderIcon属性将被忽略,故而无需指定。确保BorderStyle置为bsSizeable,还有BorderWidth置为0,如果此二属性设成其它值,子窗体与主窗体会不协调。

窗体的其它元件
  很多时候,除了从属窗体外,主窗体还包含别的元件,比如工具条和状态条,此时设置TCreateParams结构体的X、Y、Width和Height成员时得考虑到工具条和状态条,子窗体应与顶部的工具条和底部队状态条协调。因此设置TCreateParams结构体的成员的代码应该是:


Params.X=0;
Params.Y=MainForm->ToolBar->Height+1;
Params.Width=MainForm->ClientRect.Right;
Params.Height=(MainForm->StatusBar->Top-1)-Params.Y;


  注意Y设为工具条底部加1,子窗体宽度置为主窗体客户区宽度,高度根据子窗体和状态条的顶部计算,基本上为界于工具条底部和状态条底部之间的主窗体客户区。这些就是使从属窗体“寄居”于主窗体的所有要求,你可能还有其它想在子窗体中实现的特征,我将把这些特征的讨论留到后面。

设置主窗体
  主窗体也得进行设置以控制其“收留”的子窗体。首先需要将子窗体从自动创建窗体列表中去掉,需要时再创建它们。如果不从列表中去掉,则当你的应用程序启动时它们会自动显示。你还需要一个变量来跟踪当前的活动子窗体,在主窗体的Public区声明如下变量,Tform * ActiveChild; ActiveChild是公有的,因为子窗体要访问这个变量。我马上会演示如何使用这一变量。现在来书写显示子窗体的代码,先看下面程序行,然后我来解释。


void __fastcall TMainForm::Chart1Click(Tobject *Sender)
{
if(ActiveChild)
delete ActiveChild;

TChartForm * form=new TChartForm(this);
ActiveChild=form;
form->Show();
Chart1->Checked=true;
Table1->Checked=false;
}


  此方法是主窗体的菜单项的OnClick处理句柄,猜的没错,这是在显示TChartForm子窗体。首先检查ActiveChild变量是否非0,如果有激活动子窗体ActiveChild将非0。如果ActiveChild不为0,删除此变量关联的指针以摧毁活动子窗体,否则程序会将子窗体一个接一个地堆叠在一起。接着创建一个TChartForm类的实例,将new操作返回到指针赋予ActiveChild变量,这样ActiveChild总是包含一个指向当前子窗体的指针。最后调用Sow()方法显示子窗体。最后两行代码确保代表表单或图形显示的菜单项显示一个选中标记。为完成ActiveChild变量的讨论,我得带你回到子窗体单元一会儿。每个子窗体都含有一个如下的OnClose事件的事件句柄:


void __fastcall TChartForm::FormClose(Tobject *Sender,
TCloseAction &Action)
{
MainForm->ActiveChild=0;
MainForm->Chart1->Checked=false;
Action=caFree;
}


  注意当窗体被摧毁时,主窗体的ActiveChild被置为0,并将与子窗体关联的菜单项置为未选中。Action参数置为caFree,以通知VCL释放与此窗体关联的内存。你或许会疑惑为何FormClose句柄包含上面最后两行。答案是每个子窗体都有一个Close按钮用来关闭窗体,如果用Close按钮来关闭窗体,就需要释放内存和uncheck菜单项。

额外特征
  例子程序至少还有一个尚未讨论的特征,就是如果子窗体比主窗体大,要重新调整主窗体大小以容纳子窗体。这些语句放在子窗体的CreateParams()方法中。之前我展示过一个简单的CreateParams()例子,但没有放进调整主窗体大小的语句。列表B中有完整的CreateParams()方法,和先前展示唯一不同的是包含以下语句:


if(Width>MainForm->ClientWidth)
MainForm->ClientWidth=Width;
if(Height>(MainForm->StatusBar->Top-MainForm->ToolBar->Height))
MainForm->ClientHeight=Height+
MainForm->ToolBar->Height+
MainForm->StatusBar->Height ;


  这几条语句检查子窗体的宽度是否大于主窗体的ClientWidth属性,如果是,主窗体的ClientWidth置为子窗体的宽度。余下的几行作的是同样的事情,只不过针对的是主窗体的客户区高度而已。这些语句的结果是主窗体总是被调整到能完全容纳被显示的子窗体。范例程序还考虑了主窗体调整大小时的情况。如果主窗口大小有变化,子窗体大小也必须变化以进行充满主窗体的客户区。以下语句演示了主窗体的OnResize事件句柄:


void __fastcall TMainForm::FormResize(Tobject *Sender)
{
if(ActiveChild)


{
ActiveChild->Width=ClientRect.Right;
ActiveChild->Height=(MainForm->StatusBar->Top-1)-
ActiveChild->Top;
}


}


  这些语句相当直接,无需我逐条解释。注意首先检查ActiveChild变量确保非0(即指向某子窗体),很明显如果当前没有激活任何子窗体,在OnResize中就什么都不用干。其余语句是CreateParams()中看到语句的变种,只是简单地计算子窗体的新尺寸并设置相应的Width和Height属性。

结语
  列表A包含了例子程序主窗体的代码。列表B示出了TChartForm单元的源码。头文件都没有给出因为没有什么有意义的语句,也未给出TTableForm单元的语句,因为与ChatForm单元类似。你可以在www.reisdorph.com下载例子程序。将子窗体“寄居”于主窗体提供了一种清晰的替代MDI的方法,对那些只能以无模式窗体形式向用户显示数据的程序也是一种替代,使用子窗体允许你使用窗体设计器设计你的从窗口,并将操纵子窗体的代码放在一个地方。


列表A:MAINU.CPP
#include <vcl.h>
#pragma hdrstop

#include "MainU.h"
#include "ChartU.h"
#include "TableU.h"

#pragma resource "*.dfm"
TMainForm *MainForm;

__fastcall TMainForm::TMainForm(Tcomponent* Owner)
: Tform(Owner)
{
//清0以防包含随机数
ActiveChild=0;
//打开数据表
Table->Active=true;
}

void __fastcall TMainForm::Table1Click(Tobject *Sender)
{
if(Table1->Checked) return;
if(ActiveChild){
delete ActiveChild;
ActiveChild=0;
}

TTableForm *form=new TTableForm(this);
//将DBGrid的DBGrid::DataSource属性赋给数据源
form->DBGrid->DataSource=DataSource;
//跟踪活动子窗体
Active=form;
form->Show();
Table1->Checked=true;
Chart1->Checked=false;
}

void __fastcall TMainForm::Chart1Click(Tobject *Sender)
{
if(Chart1->Checked) return;
if(ActiveChild){
delete ActiveChild;
ActiveChild=0;
}

TChartForm *form=new TChartForm(this);
Active=form;
form->Show();
Chart1->Checked=true;
Table1->Checked=false;
}

void __fastcall TMainForm::FormResize(Tobject *Sender)
{
if(ActiveChild){
ActiveChild->Width=ClientRect.Right;
ActiveChild->Height=(MainForm->StatusBar->Top-1)-
ActiveChild->Top;
}
}

列表B:CHARTU.CPP
#include <vcl.h>
#pragma hdrstop

#include "ChartU.h"
#include "MainU.h"

#pragma resource "*.dfm"
TChartForm *ChartForm;

__fastcall TChartForm::TChartForm(Tcomponent* Owner)
: Tform(Owner)
{
}

void __fastcall TChartForm::CreateParams(TCreateParams& Params)
{
//调用基类CreateParams方法
Tform::CreateParams(Params);
//子窗口类型
Params.Style=WS_CHILD|WS_CLIPSIBLINGS;
//设置父为主窗体
Params.WndParent=MainForm->Handle;

Params.X=0;
if(Width>MainForm->ClientWidth)
MainForm->ClientWidth=Width;
if(Height>(MainForm->StatusBar->Top-MainForm->ToolBar->Height))
MainForm->ClientHeight=Height+
MainForm->ToolBar->Height+
MainForm->StatusBar->Height;
Params.Y=MainForm->ToolBar->Height+1;
Params.Width=MainForm->ClientRect.Right;
Params.Height=(MainForm->StatusBar->Top-1)-Params.Y;
}

void __fastcall TChartForm::FormClose(Tobject *Sender,
TCloseAction &Action)
{
MainForm->ActiveChild=0;
MainForm->Chart1->Checked=false;
Action=caFree;
}

void __fastcall TChartForm::CloseBtnClick(Tobject *Sender)
{
Close();
}
C#登录窗体与主窗体 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace WindowsFormsApplication1 { static class Program { /// /// 应 阅读详情

相关推荐

如何在MDI程序中把子窗体菜单合并到主窗体上

       这里只讲在MDI中,子菜单与父菜单合并的简单方法。 首先在MDI的主窗体中:1.  在主窗体构造函数中,添加如下代码,注意要在InitializeComponent调用之后,如:            //Add File Menu            MenuItem miFile = mnuMain.MenuItems.Add("&File");    

愚翁专栏 1万+

关于CreateParams的参数

procedure CreateParams(var Params: TCreateParams); override;参数定义如下: TCreateParams = record Caption: PChar; Style: DWORD; ExStyle: DWORD; X, Y: Integer; Width, Height: Integer; Wnd...

weixin_30301183的博客 691

C#窗体应用:登录窗体跳转至主窗体+退出登录

1.首先对登录结果作一个判断 登录功能的实现可以参考我上一篇博客:https://blog.youkuaiyun.com/weixin_44916185/article/details/105109391 如果登录成功,则将用户名传进主窗体,并将登录窗体的DialogResult结果设置为OK; if (result == 1) { MessageBox.Show("登录成功。"); _No = ...

weixin_44916185的博客 3510

Delphi 组件渐进开发浅谈(三)——锦上添花

  转载请指明出处来源。       3.锦上添花3.1.对齐属性Alignment  T[x]CustomEdit类没有提供左右对齐属性,这令人很不爽。也许在我们现在的生活中,文字基本都是左对齐的,但数值输入输出如果是右对齐的话就更理想了。  阅读StdCtrls文件,TCustomLabel、TCustomCheckBox、TRadioButton、TCustomMemo、TCustomStaticText均具有Alignment属性。  其中TCustomCheckBox、TRadioButton的A

溪亭淡月 1125

c#-WinFrom子窗体嵌入主窗体

示例添加嵌入按钮事件代码复用OOP原则解决多个按钮快速编写窗体嵌入 符合面向对象编程方法 独立出打开窗体的方法: //打开窗体方法 private void OpenFrom(Form objFrm) { //将当前子窗体设置成非顶级控件 objFrm.TopLevel = false;

Economic_shark的博客 2万+

C#实现子窗体嵌入主窗体

在程序开发中,经常有这样的需求,要将子窗体嵌入到主窗体的一个容器中。

1980x的博客 539

Delphi的Hint入门指导

Delphi中使用提示是如此简单,只需将欲使用Hint的控件作如下设置:   ShowHint := True;   Hint := ‘提示信息’;   不必写一行代码,相当方便。   但有时我们又想自己定制提示的效果,使其看起来更美观更具个人特色,没关系,Delphi完全有办法让你写出自己喜欢的Hint效果。   Delphi的Hint功能实现归类在Applicatio

wozengcong的专栏 3298

倍福 MODBUS TCP/IP通信

(*默认字符串80字节,此处声明为255字节,可以一次性传42个UINT数据.5位整数加一个空格,即每个数据6字节*)(*---------------------------------------- 以下为用户程序 ----------------------------------------*)(*读回并换算后的值*)(*准备写到PLC的值*)(*用于比较两次读回的值相差多少,以估计通讯的速度, Act_CalcDiff*)(*用于切换读和写,Act_Protocal*)

qq_33280096的博客 1367

C#主窗体调用子窗体总结

首先在同一命名空间下添加新建多个窗体,选用一个作为主窗体,其他窗体作为子窗体。 经导师指导,我采用在主窗体加入一个面板,面板中调用三个主窗体的方法,经实践记录如下: 窗体隐藏:窗体隐藏 ...

十早韦的博客 4365

模拟调制系统实战:从AM到FM的5种调制方式对比与选型指南

本文深度解析AM、DSB、SSB、VSB、FM五种经典模拟调制方式,从实现电路、频谱效率、抗噪性能及工程成本等维度进行实战对比。通过MATLAB/Simulink仿真案例,提供清晰的选型决策框架,帮助工程师在无人机图传、短波通信、广播系统等具体项目中,根据带宽、功耗和抗干扰需求选择最优方案。

study的专栏 934

快速了解GPU分布通信技术:PCIe、NVLink与NVSwitch

PCIe(Peripheral Component Interconnect Express)是一种高速串行计算机扩展总线标准,广泛用于连接计算机的各种硬件设备。PCIe4.0是目前较为先进的版本,提供了高达64GB/s的带宽。InfiniBand是一种用于高性能计算的高速互连技术,通过交换机在节点之间直接创建一个专用的受保护通道。InfiniBand适配器通过PCIe接口连接到CPU,另一端通过InfiniBand网络端口连接到InfiniBand子网。

全世界的博客 7544

C# 子窗体关闭主窗体的方法

子窗体关闭主窗体

shigzhu的专栏 1770

深入解析高通8155平台音频数据流:从HAL到DSP的完整链路

本文深入解析了高通8155平台音频数据从安卓HAL层到DSP的完整传输链路。以播放场景为例,详细阐述了音频数据如何通过ASoC DPCM框架进行路由、打包,并经由APR协议与DSP交互,最终驱动硬件发声的核心流程,为车载音频系统开发与调试提供了清晰的框架。

rust6ferris的博客 1176

C#之如何把子窗体嵌入到主窗体中显示

C#之如何把子窗体嵌入到主窗体中显示 今天总结一下把子窗体嵌入到主窗体中显示的方法。当你点击一个Button显示子窗体时,往往子窗体都是单独弹出,而如果想要子窗体直接在主窗体上显示,这就需要将子窗体嵌入到主窗体中,方法如下: //在主窗体中实例化要显示的子窗体 private ChildForm cForm; public MainForm() { InitializeComponent();

Kevin_Sun777的博客 5824

030、自动白平衡AWB实战:灰度世界、完美反射与色温估计的工程实现与局限

本文深入探讨了自动白平衡(AWB)算法在工程实践中的实现与局限性。作者结合实际项目经验,分析了灰度世界算法、完美反射算法和色温估计三种主流方法的优缺点和适用场景,并分享了调试过程中的关键技巧和常见陷阱。文章指出,纯色背景、多光源环境等特殊场景容易导致算法失效,需要通过混合策略和场景检测来优化。作者强调AWB调试需要大量实际场景测试,建议保留手动调节功能,并针对不同硬件配置进行参数标定。最后提出,AWB优化是一个持续迭代的过程,需要工程化的测试方法和数据处理能力。

zzfmlxs的博客 283

Field Characteristics 深入解析,理解 SAP ABAP Analytics 中 Dimension 与 Measure 的真正边界

在SAP ABAP Analytics数据模型中,字段应建模为Dimension还是Measure,关键在于业务语义而非数据类型。Dimension提供分析上下文,构成数据坐标系,支持钻取与切片;Measure则需具备明确聚合语义(如#SUM、#MIN、#MAX),且必须满足Distinct(无重复)与Complete(无缺失)原则,确保聚合结果准确。错误的建模会导致聚合偏差,根源常在事实粒度不清或关联关系不当。因此,正确划分字段角色,本质是让Analytical Engine准确理解业务数据的分析逻辑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 59

WinForm设计之主窗体

 Author:水如烟  参考应用类代码和辅助类代码现在尝试做一个通用的主窗体.所谓通用,按我的理解,是尽可能的把常用功能实现在一个类上,应用时仅考虑实际需求.因为是尝试,所以这部分代码我就不贴上来了,现在只说表现.主窗体一般的表现有两种,一是MDI,一是象IDE那种形式.我就将这两种集合在一起.使用时,简单的代码就可以实现如下的效果.代码:Public Class

水如烟 4254

【OpenClaw从入门到精通】第23篇:OpenClaw办公自动化实战—报表生成+文档批量处理+跨系统同步(2026实操进阶版)

本文聚焦OpenClaw在办公自动化场景的进阶应用,针对职场中高频且重复的报表生成、文档批量处理、跨系统数据同步三大痛点,提供从环境搭建、原理讲解到完整代码实现的全流程实操指南。方案基于Python生态工具链(pandas、Playwright、PyPDF2等)与OpenClaw的低代码编排能力,兼顾新手入门与进阶提升——新手可直接复用代码快速落地,进阶读者可学习流程编排逻辑进行二次开发。所有案例均基于真实办公场景设计,部分虚拟场景已明确标注,代码经本地环境验证可复现。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 968

主窗体和子窗体之间如何相互操作对方的控件

很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件。相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可。 下面重点介绍前一种,目前常见的有两种方法,基本上大同小异:第一种,在主窗体类中定义一个静态成员,来保存当前主窗体对象,例如:        public static yourMainWindow pCurren

愚翁专栏 2万+

【YOLOv11改进- 主干网络】YOLOv11+WTConv(ECCV2024): 基于YOLOv11的主干网络改进,大感受野的小波卷积

论文提出了WTConv,这是一个使用级联小波分解的层,并执行一组小卷积核的卷积,每个卷积专注于输入的不同频率带,并具有越来越大的感受野。这个过程能够在输入中对低频信息给予更多重视,同时仅增加少量可训练参数。实际上,对于一个  的感受野,可训练参数数量只随着  的增长而呈对数增长。而WTConv与常规方法的参数平方增长形成对比,能够获得有效的卷积神经网络(CNN),其有效感受野(ERF)大小前所未有。

qq_41304809的博客 1401

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

子窗体中操作主窗体上的控件

很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件。相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可。 下面重点介绍前一种,目前常见的有两种方法,基本上大同小异:第一种,在主窗体类中定义一个静态成员,来保存当前主窗体对象,例如:        public static yourMainWindow pCurren

eclipsesunjava的专栏 2352

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C#子窗体嵌入主窗体

C#知识|上位机子窗体嵌入主窗体方法(实例) (qq.com)2024年5月27日。

anlog的专栏 1254

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# 关闭登录窗体,打开主窗体

C# 关闭登录窗体,打开主窗体C#桌面应用时,会遇到登录窗体验证后再打开主窗体的要求,但关闭登录个窗体时会将新打开的主窗体关闭,导致整个程序关闭。这里介绍一种在Program.cs 程序里操作多个窗体,以达到上述效果 C#桌面应用时,会遇到登录窗体验证后再打开主窗体的要求,但关闭登录个窗体时会将新打开的主窗体关闭,导致整个程序关闭。这里介绍一种在Program.cs 程序里操作多个窗体,以达到上述效果 step1:在program.cs的staic void main()方法里加入以下语句 //登录页

wangqiwei的专栏 1061

c#Winform主窗体和子窗体之间的传递

一、先将主窗体FrmMain和子窗体FrmUser关联起来。 一、主窗体全部代码 public partial class FrmMain : Form { FrmUser mFrmUser = new FrmUser(); FrmPro mFrmPro = new FrmPro(); private static Fr...

xxx355200的博客 2102
上一篇: 清除病毒代码
下一篇: CBuilder的文件操作
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值