`
wangangie20
  • 浏览: 45755 次
  • 性别: Icon_minigender_2
  • 来自: 厦门
最近访客 更多访客>>
社区版块
存档分类
最新评论

动态创建组件、用Sender实现代码重用、ActiveX控件的使用

 
阅读更多

  一、动态创建组件
  BCB中提供了大量的VCL组件,有时难免要在程序中动态创建组件,VCL是用Object Pascal写的,她与C++语言还是存在着一些不同点的,要掌握正确的方法,不防我们先来看一下栈(stack)与堆(heap)的关系。
  栈(stack)是存放函数的所有动态局部变量及函数调用和返回的有关信息的一块内存。栈的内存管理严格遵循先进后出的顺序,这一点正是实现函数调用所需要的。从栈中分配内存效率特别高。数据对象使用栈中的内存(如动态局部变量)比使用堆中内存会使程序运行更快。
  堆(heap)是供malloc()、calloc()、realloc()和new等函数获取内存空间的一块内存。从堆中获取内存比从栈中要慢得多,但堆的内存管理却比栈灵活得多,任何时候你都可以从堆中获取(或释放)内存,我们可以按任意顺序进行。用来存放递归数据结构的内存几乎都要从堆中获取。用来存放字符串的内存通常也从堆中获取,尤其是对那些在程序运行时可能出现的很长的字符串。
  从堆中获取的内存要用free()、delete来释放,它本身不会自动释放。
  C编译的程序能产生如此优质的代码、程序运行的快速与对栈的正确运用是有关的,但Object Pascal中所有的对象都只能建构于堆中,无法和C++一样,能够在栈(在函数内创建类的对象)、数据区段(在函数外创建类的对象)、堆(用new等函数来创建类的对象)三种地方建立对象,所以VCL类的对象我们只能在堆中创建。
  如创建一个按钮对象,我们可以这样来创建:
  TButton *btnMy= new Tbutton(From1);
  可以写成如下程式:类名  *对象名=new 类名(…);
  注意:()里面可以是你已创建的该类对象的父类名字、工程的名字、NULL或this。但最好是对象的父类名。
  例:动态生成按钮
  我们先在窗体(Form1)上,放一个按钮Button1,在他的单击事件中写上如下代码:
  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
  TButton *my=new TButton(Form1);
  my->Parent=Form1;//最为关键的一句,否则你将看不到什么,但编译却是正确的
  my->Top=200;
  my->Left=200;
  my->Height=25;
  my->Width=75;
  my->Caption="I'm Button!";
  //my->Visible=true;此语句可有可无,因为他的父类通常默认他可见
  }
  通过这个例子我们应该清楚的看出动态创建组件的几个重要步骤:
  1)要一个空间(内存);// TButton *my=new TButton(Form1);
  2)指定其父组件,说直接了就是我们要创建的这个对象要放在那个容器上;//     my->Parent=Form1;
  3)指定组件要出现在父类的那个位置;//my->Top=200;my->Left=200;my->Height=25; my->Width=75;这里是让我们设置好组件在父组件上的位置;
  4)其它重要属性。// my->Caption="I'm Button!";
  注意上面的步骤不能任意安排,否则你的程序会出笑话的。
  在动态生成非宝兰VCL原有的组件时要加上对应的头文件。如,我们要动态生成报表组件时一定要加入: 
  #include  "Qrctrls.hpp"//若还有问题,你还要加入:
  #include "QuickRpt.hpp"
  另外由于BCB对内存管理或与系统、硬件的冲突,你的动态创建程序也许一点错误都没有,但就是编译不了;有时也许第一次通过了,第二次一样的程序却通过不了,出现这样那样的提示,最简单的办法就是注销一下系统,再试一下,多数就能解决了。
  二、用Sender实现代码重用
  面向对象的编程工具的特点之一就是要提高代码重用性(Reuse),宝兰的BCB当然可以实现这一功能。我们都知道,在BCB中,大部分程序代码都直接或间接的对应着一个事件,此程序称为事件处理句柄,它实际上就是一个过程。从应用程序的工程到窗口、组件和程序,BCB强调的是其开发过程中每一层次的重用性,可以充分利用已编写过的代码来减少工作量,更会使你的程序变得优美。代码段间的共享都跟发生该事件的控件有关有关,需要根据控件类型做出相应的处理,这时就要用到Sender参数。
  每个函数的开头都有形如:
  void _fastcall TForm1::Button1Click(TObject *Sender)
  其中的Sender是一个TObject类型的参数,它告诉BCB哪个控件接收到这个事件并调用相应的处理过程。我们可以编写一个单一的事件处理句柄,通过Sender参数和if语句或者case语句配合,来处理多个组件。在Delphi中可以用IS来测试Sender类型,或者用AS进行类型转换,BCB我们只能用dynamic_cast来进行上面两个工作,下面把dynamic_cast的用法说明一下。
  dynamic_cast 可以把某种对象强制转成另一个类,这里所谓的强制仍有其局限,也就是说,如果类转不过来,那么系统将不会进行转换操作的。若类型转换无法成功则返回一个值是0的指针。若参数T是一个参考类型,而类的转换又失败了,系统将会丢出一个异常处理信息:Bad_cast。但你放心这不会导致系统死机,所以可以放心使用。其程式:
  dynamic_cast  (ptr)
  T参数一定要是一个指针、void* 、或是已经定义过的类,而ptr参数则必须是一个指针(pointer) 或是一个引用(reference)。如果T的类型是void*,那么ptr则是一个可以访问最下面类里的任何成员,当然这样的类将不可以是基础类。
  1.进行判断
  我们用dynamic_case来测试Sender,以便找到调用这个事件的处理句柄或组件的类型。如,我们将窗口中的编辑框和标签的Click事件的处理句柄都指向窗口的xxx函数(其实你只要先把一个控件的Click事件命名为xxx,并在其中写上共享代码,其它控件的Click事件都指向xxx就行了),本例中的编辑框和标签对Click事件将有不同的反应,代码如下:
  void __fastcall TForm1::xxx(TObject *Sender)
  {
  if(dynamic_cast(Sender))
  ShowMessage("This is a editbox");
  if(dynamic_cast(Sender))
  ShowMessage("This is a label");
  }
  当然若是多个同类组件,只是想共用一个事件,那要比这简单多了。举个例子,若你的很多编辑框(Edit),你想在输入某一项的时候先把这一项清空,你只要写一个OnEnter事件就可以了:
  void __fastcall TForm1::Edit1Enter(TObject *Sender)
  {
  TEdit *Edittemp=(TEdit*)(Sender);//把不同的编辑框统一起来
  Edittemp->Text="";
  }
  其它的Edit组件的OnEnter事件都指向Edit1Enter,这样就行了,试一下,是不是鼠标放在编辑框里一点就清空了J其实这里只是把不同的编辑框(Sender清楚是那一个编辑框)统一起来,好用一个共同的事件来处理。你在同一组件共用同一事件时一定要注意这一点。
  2.强制进行类型转换
  将若干继承同一父类的子类强制转换成该父类。如窗口中有一个TEdit类控件和一个TMemo控件,它们实际上都继承于TCustomEdit类,如果你要为二者的某一事件提供同样的处理,可以将二者的事件句柄都指向自定义的函数yyy,我们这里仍然是在OnEnter事件中(当然你完全可以在其它事件中完成):
  void __fastcall TForm1::yyy(TObject *Sender)
  {
  dynamic_cast(*Sender).Text="This is some demo text";
  }
  或以下的格式:
  void __fastcall TForm1::yyy(TObject *Sender)
  {
  dynamic_cast(Sender)->Text="This is some demo text";
  }
  注意二者的区别,这其实这正是"."与"->"的不同之处,仔细品味一下,你会清楚的。
  上面的两个程式均是先把TEdit类和TMemo类均强制转换成TCustomEdit类,再对其父类的属性进行赋值。
  使用Sender参数可以通过单一函数段处理多类组件,真正体现了BCB的面向对象的重用性。
  三、轻松使用ActiveX控件
  在微软的大力扶持下,越来越多的软件公司开始支持ActiveX了,这对于喜欢编程的朋友来说可是件值得高兴的事!因为我们可以在程序中很方便地调用外部的OCX文件来实现复杂的功能(比尔.盖茨这回总算做了件好事),而在BCB中只带有很少几个ActiveX控件,大部分我们需要我们自己安装,下面通过对Replayer与Flash控件的安装与应用,让我们共同来学习ActiveX的组件在BCB中的使用方法:)
  (一)安装、导入ActiveX控件
  C++ Builder在对ActiveX的支持方面可说是做得非常出色,我们可以很方便地导入系统中的ActiveX控件:点击菜单"Component→Import ActiveX Control..."打开"Import ActiveX"对话框,在"Import ActiveX"列表框中,我们可以看到Windows中所有注册的AxctiveX控件。在上面的控件列表中选择你所需要的控件,再点下面的"Install"按钮就行了!如果控件列表中没有它,那么说明你要找的控件还没有在系统中注册,不要紧,我们可以点击"Add"按钮在你的计算机中找到这个OCX文件后再Install,C++ Builder会自动为它注册。
  (二)了解ActiveX控件的所有方法
  一般的ActiveX控件都是没有帮助文件的,在C++ Builder的IDE环境中我们只能看到它的设计期属性和事件,那么怎么才能知道它的运行期属性和方法呢?C++ Builder在导入一个ActiveX控件后会在"E:\Program Files\Borland\CBuilder6\ImportsI"目录中生成相应的头文件(*.h)(当然你的目录可能不是这样),只要把它打开看一下就一目了然了!当然要是在BCB6下,你可以在编程的过种中双击代码编辑器(Code Editor)左半边的代码浏览器(Code Explorer)中的ActiveX控件的名字,在右侧代码区就会查看到她的头文件,慢慢体会吧:)
  另外我们还必须了解各种属性、方法及其参数的含义,那就要编程序来试了,为每个想了解的属性和方法建立一个菜单项,点击时用InputBox输入参数来试验效果,还可以建立一个状态栏来显示与其相关变量的值。
  (三)应用举例
  现在流行的ActiveX控件很多,这里我们拿RealPlayer与flash控件做为例子。
  1.RealPlayer控件的使用
  如今RealPlayer的流式媒体文件以其强大的视频压缩比正逐步悄然兴起。RealPlayer Plus播放器也理所当然地成为大家播放RealPlayer格式文件的首选软件。人家在好的也是别人的,其实我们可以利用C++ Builder打造一个完全符合自己要求的RealPlayer播放器。下面我将向大家介绍如何利用BCB来完成你的RealPlayer。前提你的机器中必须装有RealPlayer Plus播放器,因为我们要用到其自带ActiveX控件。
  首先,我们要在C++ Builder中导入所需的ActiveX控件。点击菜单"Component→Import ActiveX Control..."打开"Import ActiveX"对话框,在"Import ActiveX"列表框中,我们可以看到Windows中所有注册的AxctiveX控件。选择其中的"RealPlayer ActiveX Control Library(Version 1.0)"控件。然后单击"Install"按钮。
  回到C++ Builder主界面,你会发现在VCL面板中的ActiveX标签中增加了一个名为RealAudio的组件。我们先把它放入窗体中。不过在默认情况中RealAudio组件没有视频播放窗口,也就是只能播放声音。我我们只要在RealAudio组件的Controls属性中添加如下代码:
  IMAGEWINDOW,CONTROLPANEL,STATUSBAR
  (其中:IMAGEWINDOW、CONTROLPANEL、STATUSBAR分别表示显示视频播放窗口、控制条状态条)
  添加代码后,我们可以发现控件外观已经改变成了视频播放窗口形状。然后设置Align属性为alClient,使播放窗口可以随窗体的变化而变化,方便大家在观看影视动画时可以随意拉动播放窗口大小。
  然后,在窗体中加入TImage组件、TopenDialog(odgRealplay)、TrealPlayer(radMyPlayer)组件各一个,加入两个Tbutton(btnOpenClick,btnExitClick)。在Image中导入你喜欢的图片,以免窗口过于单一,两个TButton一个设为开始,一个设为结束。括号里的名字是在我的应用程序中给该控件命的名字。
  双击btnOpen添加如下代码:
  void __fastcall TForm1::btnOpenClick(TObject *Sender)
  {
  if(odgRealplay->Execute())
  {
  radMyPlayer->Source=odgRealplay->FileName
  radMyPlayer->DoPlay();打开并启动播放器
  }
  }
  双击btnExit添加如下代码:
  //------------------------------------------------ ---------------------------
  void __fastcall TForm1::btnExitClick(TObject *Sender)
  {
  Close(); //终止程序运行
  }
  为了在打开一个文件时,便于用户选择文件,要将odgRePlayer的Filter属性设置如下:所有媒体文件(*.rm,*.ram,*.ra,*.swf,*.mp3)|*.rm;*.ram;*.ra;*.sw f;*.mp3|*.*|*.*。
  按一下F9,找一首歌曲听一下:)
  2.Flash控件的使用
  首先我们还是要先安装、导入ActiveX控件:选择"Component->Import ActiveX Control",在上面的控件列表中选择"ShockWave Flash(Version 1.0)",再点下面的"Install"按钮就行了!如果控件列表中没有它,那么说明ShockWave Flash控件还没有在系统中注册,不要紧,我们可以点击"Add"按钮在你的计算机中找到这个OCX文件后再Install,C++ Builder会自动为它注册。
  导入成功后,C++ Builder会在ActiveX页中增加一个"ShockWaveFlash"控件,建立一个新工程,在合适的位置放置一个ShockWaveFlash控件,适当调整一下它的大小,然后在它的"Movie"属性中填上一个你的硬盘上已有的Flash动画文件名,然后按F9运行,怎么样,不用写一行代码我们就做出了一个能显示Flash动画的程序:)
  为了更好的应用她,首先我们了解一下ShockWaveFlash控件的属性和方法: 
  【属性】AlignMode(int型)和SAlign(WideString型) 控制动画的显示位置(把这两个属性列在一起说明它们是相互关联的,改变一个另一个也会相应地改变,以下类似)。取值范围及含义如下:
  0 空        当前位置
  1 L         当前位置靠左
  2 R         当前位置靠右
  3 LR       当前位置居中
  4 T         当前位置靠上
  5 LT       左上
  6 TR      右上
  7 LTR    上方居中
  8 B         当前位置靠下
  9 LB       左下
  10 RB    右下
  11 LRB  下方居中
  12 TB      当前位置垂直居中
  13 LTB    靠左垂直居中
  14 TRB 靠右垂直居中
  15 LTRB 中央位置
  【属性】BackgroundColor(int型)和BGColor(WideString型) 设置背景颜色,BackgroundColor为整型值,BGColor为它的HEX字符串。
  【属性】Loop(bool型) 是否循环显示
  【属性】Menu(bool型) 是否显示右键菜单,建议设为true,因为它可以完成对Flash动画的大部分控制工作,而不用我们写代码。
  【属性】Movie(WideString型) Flash动画的文件名,可以在运行状态动态设置,要关闭一个动画只要把它设为空即可。
  【属性】Quality(int型)和Quality2(WideString型) 控制动画的显示质量,一般将Quality设为1以获得高质量的显示效果。
  【属性】ScaleMode(int型)和scale(WideString型) 控制动画的显示比例,取值范围及含义如下:
  0   ShowAll 显示全部
  1   NoBorder 无边框模式
  2   ExactFit 拉伸到整个画面
  3   空 原始大小
  【方法】PercentLoaded 返回动画已经加载的百分比,你可以建立一个进程条(ProgressBar)来显示动画加载的进程。
  【方法】LoadMovie 用于加载网络上的动画,动画文件名为一个BSTR型的URL值,在 C++ Builder 中可以用 AnsiToOLESTR 函数将Char型的字符串转换成BSTR型。
  如果你要把你的程序给别人使用,为了防止他没有安装或是注册swflash.ocx文件而导致程序无法运行,你必须把OCX文件也一起附带上,并在程序中为它在系统中注册,注册方法有两种:
  方法一:调用外部程序 Regsvr32.exe
  注册:   ShellExecute(Handle,NULL,"regsvr32.exe","swflash.o cx",NULL,SW_SHOWNORMAL);
  反注册: ShellExecute(Handle,NULL,"regsvr32.exe","/u swflash.ocx",NULL,SW_SHOWNORMAL);
  方法二:调用控件本身所包含的注册和反注册函数
  每一个OCX控件中都提供了两个输出函数"DllRegisterServer"和"DllUnRegisterServer",可以注册和反注册控件本身,我们可以用LoadLibrary()和GetProcAddress()来调用它们,这和动态调用DLL库的方法是一样的,我在这里就不多说了。
  你会问我为什么会知道这些属性的使用方法及该控件的方法的使用的,先看这个组件的头文件(通常ActiveX控件的相关信息都放在E:\Program Files\Borland\CBuilder6\Imports目录下),然后可以在程序中用InputBox输入参数来试验效果,还可以建立一个状态栏来显示与其相关变量的值。我用的是这种方法,也许你会有更好的方法,好了,利用上面介绍的属性和方法,相信你已经很好地使用它了!当然有些我也没有弄明白,比如我想在RePlayer中实现重复播放,代码如下:
  void __fastcall TFrmMyPlayer::btnReOpenClick(TObject *Sender)
  {
  if(odgRealplay->Execute())
  {
  int n,i;
  n=StrToInt(InputBox("播放次数","你想播放多少次呢?","2"));
  if(nSource=odgRealplay->FileName;
  for(i=1;iDoPlay();
  ShowMessage(IntToStr(i));//用来测试是否循环有问题,测试后应该把这个语句去掉
  }
  }
  无论如何也不能循环,我想问题可能出现在DoPlay()上了,可能她里面有一个跳出程序的语句(return,我觉得应该是她),也许不是,还请大家指教,互相学习吗:)
  没办法ActiveX组件就得靠我们自己学习,有什么办法呢?但到是让我学习到了很多东西,其实从中也能更好的学习BCB的其它组件了,因为还是有一些共性的。
  四、ActiveX组件应用例程--网络电视全编译程序
  ActiveX组件的例子实在太少,这也是我们为什么对她的使用总是感觉有些困难的原因,这里把前不久我编写的一个网络电视全编译程序的源代码提供给大家分享。
  说明:
  1)这个程序用到了ActiveX中的media player与realplayer组件;
  2)原程序的电视节目及广播节目来源,出于对原官方网站的尊敬,这里将不给出;
  3)全编译程序与原程序不一样,主要在从数据库读取信息,而程序的大部分功能来自数据库,包括升级及节目增加,并且窗体设计及组件组合会有很大差距。等我解决BCB6打包问题后会提供可升级的那个网络电视的源代码,但不保证提供全部;
  4)以下前缀请注意:frm(窗体),wmp(media player组件,为ActiveX组件),rad(realplayer组件,为ActiveX组件),rgp(单选分组框);
  5)全编译程序只有700K,需要的可与作者联系。当然你完全可以按照下面的原代码,自选设计一个更好的程序。
  //------------------------------------------------ -------------------
  #include 
  #pragma hdrstop
  #include "CHTV.h"
  //------------------------------------------------ -------------------
  #pragma package(smart_init)
  #pragma link "RealAudioObjects_OCX"
  #pragma link "WMPLib_OCX"
  #pragma resource "*.dfm"
  TfrmCHTV *frmCHTV;
  //------------------------------------------------ -------------------
  __fastcall TfrmCHTV::TfrmCHTV(TComponent* Owner)
  : TForm(Owner)
  {
  }
  //------------------------------------------------ -------------------
  void __fastcall TfrmCHTV::frmCHTVCreate(TObject *Sender)
  {
  wmpCHTV->Show();
  radCHTV->Hide();
  }
  //------------------------------------------------ -------------------
  //单选分组框事件,电视栏
  void __fastcall TfrmCHTV::rgpTVClick(TObject *Sender)
  {
  String  TVtype,TVadress;
  switch(rgpTV->ItemIndex)
  {
  case 0:TVtype="mms";//播放类型
  TVadress="mms……";//网址
  break;
  case 1:TVtype="mms";
  TVadress="mms……";
  break;
  ……
  default:break;
  }
  wmpCHTV->close();//关闭原来的播放内容
  radCHTV->DoStop();//关闭原来的播放内容
  if(TVtype=="rtsp")//用realplayer来播放
  {
  wmpCHTV->Hide();
  radCHTV->Show();
  radCHTV->Source=TVadress;//指定播放文件
  radCHTV->DoPlay();//播放文件
  }
  else//用mediaplayer来播放
  {
  radCHTV->Hide();
  wmpCHTV->Show();
  wmpCHTV->URL=TVadress;//指定并打开播放文件
  }
  }
  //------------------------------------------------ -------------------
  //单选分组框事件,广播栏
  void __fastcall TfrmCHTV::rgpRadioClick(TObject *Sender)
  {
  String  TVtype,TVadress;
  switch(rgpRadio->ItemIndex)
  {
  case 0:TVtype="rtsp";
  TVadress="rtsp……";
  break;
  case 1:TVtype="rtsp";
  TVadress="rtsp……";
  break;
  ……
  default:break;
  }
  wmpCHTV->close();
  radCHTV->DoStop();
  if(TVtype=="rtsp")
  {
  wmpCHTV->Hide();
  radCHTV->Show();
  radCHTV->Source=TVadress;
  radCHTV->DoPlay();
  }
  else
  {
  radCHTV->Hide();
  wmpCHTV->Show();
  wmpCHTV->URL=TVadress;
  }
  }
  //------------------------------------------------ -------------------
分享到:
评论

相关推荐

    Delphi 利用ActiveX控件实现Office助手.rar

    这个助手用过Word大概都见到过,类似墨林小人一样的动画,会眨眼,弹出提示,会做出一些向下看,寻找东西,聆听、警告等小动作,本源码基于ActiveX控件实现,可熟悉下ActiveX控件的用法,在Delphi中可以定义墨林,...

    Delphi 创建Word文档 不使用三方控件.rar

    这个Delphi源码主要实现创建一个Word文档,且不使用任何的第三方控件,运行效果截图所示。  实现创建Word文档的功能原来也是挺简单的,理解下面几行代码即可了,不过只是创建,不包括写入内容:  procedure TForm1...

    DELPHI动态创建删除FRAME---示例源码

    DELPHI动态创建删除FRAME unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,FM; type TForm2 = class(TForm) Panel1: ...

    Delphi 使同类的组件进行同样的操作.rar

    Delphi 使同类的组件进行同样的操作的一个实例,类似于将WEB表单统一清空的功能,点击按钮后,所有文本框组件的内容被清空,作用在相同的组件实例上,代码:  procedure TForm1.Button2Click(Sender: TObject);  ...

    托盘,右键演示,C#源代码private void Form1_Load(object sender, EventArgs e)

    托盘,右键演示,C#源代码private void Form1_Load(object sender, EventArgs e) {//设置托盘控件属性 this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1; this.notifyIcon1.Text = "演示创建托盘"; ...

    C# WinForm窗体及其控件的自适应

    1.把自适应的类整体复制到你的工程命名空间里,这样做,每个窗体均可使用。 2.声明自适应类实例。 3.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,首次记录窗体和其控件初始位置和大小,之后调用类的...

    Sender 的使用方法

    1.QQ:513187410 2.保证无毒 3.简单,方便,实用 4.实例可以自行改用 5.如有非法,本人无法律责任,由改动代码人负责! 6.需要更多本人作品,查找标签“朱建强” 7.请下载,杀毒后再使用!

    动态添加一个控件的事件!

    动态添加一个控件的事件该如何处理 1,在头文件里定义一个响应函数: void __fastcall treeviewOnClick(TObject *Sender); 2,把函数赋给treeview的Click事件 treeview->OnClick = treeviewOnClick; 3,实现...

    Android代码-APDU Sender Contact

    ApduSenderContact - Android software Introduction: Requirements: Android USB on the Go phone License: distributed under GPL version 3 (http://www.gnu.org/licenses/gpl.html)

    C#中WebBrowser控件的简单调用

    4,双击按钮添加代码,调用WebBrowser控件的Navigate方法实现显示不同网页 private void button1_Click(object sender, EventArgs e) { webBrowser1.Navigate("网址"); } 5,实现点链接而不弹窗,右击...

    Public Class 控件代码

    Private Sub 控件代码_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '设置时间控件启用 Timer1.Enabled = True '设置窗体不可改变大小 Me.AutoSizeMode = Windows...

    C#控件picturebox实现画图功能

    本文实例为大家分享了C# picturebox实现画图功能的具体代码,供大家参考,具体内容如下 在Form上添加 一个pictureBox,一个button控件 如图所示: 这样我们的绘画面板就弄好了,把pictureBox的dock属性设置为fill,...

    DataGridView打印控件5.3版

    窗口程序使用演示 包含多个打印控件在窗口程序使用的实例及源代码(有C#的,也有VB的),有源代码 打印控件 实际的打印控件(含.NET4.0的专用打印控件) 网页中使用演示 打印控件在网页中使用的演示程序(有源代码) 1、...

    C# Winform清空界面控件值小技巧

    下面我用这个例子,来探讨下清空界面控件值的小技巧。而且还能复用。不必每个窗体都做这些枯燥、无聊的工作。  一般的做法是在清除控件的事件里面添加下面这样的代码:   private void btnClear_...

    JAVA网上书店系统的设计与实现 代码实现

    一、系统各组件实现 17 用户表示层 17 系统测试与运行 26 一、 系统测试 26 二、测试结果 26 结 论 29 参考文献 30 谢 辞 31 毕业设计(论文)成绩评定表(理科) 32 (1)注册的主要的代码如下 protected void ...

    TreeGridView1控件的使用方法

    但是今天我为大家介绍另外一款开源控件TreeGridView,这款控件的基本使用方法如下进行介绍: 使用这款控件之前需要进行一些准备,引用中添加Krypton.Toolkit.Suite.Extended.TreeGridView。 在using中添加using ...

    浅析C# 中object sender与EventArgs e

    在写代码前我们先来熟悉.net框架中和事件有关的类和委托,了解C#中预定义事件的处理。 EventArgs是包含事件数据的类的基类,用于传递事件的细节。 EventHandler是一个委托声明如下 public delegate void ...

    C#动态代码生成控件后其他事件不能获取该控件值的解决方法

    本文主要给大家介绍了关于C#动态代码生成控件后其他事件不能获取该控件值的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 1.新建web项目,添加两个Button控件,结果如图。   2.Button...

    ASP.NET的网页代码模型及生命周期

    在页面控件中,如果有多个自定义控件使用多个不同的控件来显示不同的数据结构,为了让这些页面控件能够在在页面上协调的工作,则需要使用控件状态来保护控件,同时,控件状态是不能被关闭的。同样,控件状态也有它的...

    用图像平铺形状程序(C#源代码编写)private void Form1_Paint(object sender, PaintEventArgs e)

    用图像平铺形状程序(C#源代码编写)private void Form1_Paint(object sender, PaintEventArgs e) { Image image = new Bitmap("..\\..\\test.bmp"); TextureBrush tBrush = new TextureBrush(image); tBrush.Wrap...

Global site tag (gtag.js) - Google Analytics