怎么用delphi编写支持多显示器的程序。要实现的功能主要是能够把某个窗口拖到另一个显示器中,并且能够在各个显示器间互相拖动,窗口完整的在一个显示器,不要两个显示器一个一半的那种。

解决方案 »

  1.   

    要搞清楚screencenter和destopcenter的概念.看一看forms单元的TScreen类.看看它有哪些方法,属性之类的.forms单元定义了一个全局的对象:Screen: TScreen;直接拿来用.其实多显示器编程,很简单,比如你第一个显示器的分辨率是1024*768.你只要把要放到第二个显示器上的窗体的left设置成1024,就相当于把窗体放在第二个显示器left=0的位置了.
      

  2.   

    Screen(TScreen,全局变量)有一个MonitorCount,表示当前可用显示器的个数.
    其中Monitors[Index],即为第Index个显示器,对于显示墙模式,各显示器都有自己的坐标(Left,Top,Width,Heigth)等信息.只需要把窗体的Left和Top修改,即可被移到相应的Monitor当中.
      

  3.   

    这段代码是从网上搜到的 不知道对楼主有没有用
    type   disr=record   
            w,h,c:integer;   
          end;   
      var   
          Form1:   TForm1;   
          dis:_devicemodea;   
          disr_a:array[0..120]   of   disr;   
      implementation   
        
      {$R   *.dfm}   
        
      procedure   TForm1.Button1Click(Sender:   TObject);   
      begin   
      dis.dmSize:=sizeof(dis);   
      dis.dmPelsWidth:=disr_a[listbox1.ItemIndex].w;   
      dis.dmPelsHeight:=disr_a[listbox1.ItemIndex].h;   
      dis.dmBitsPerPel:=disr_a[listbox1.ItemIndex].c;   
      dis.dmFields:=DM_PELSWIDTH   or   DM_PELSHEIGHT   or   DM_BITSPERPEL;   
      ChangeDisplaySettingsa(dis,CDS_UPDATEREGISTRY);//设置当前的分辨率   
        
      end;   
        
      procedure   TForm1.Button2Click(Sender:   TObject);   
      var   pdis:_display_device;   
              i:integer;   
      begin   
      combobox1.Clear;   
      for   i:=0   to   10   do   
        begin   
        pdis.cb:=sizeof(pdis);   
        if   enumdisplaydevices(nil,i,pdis,0)=false   then   break   
        combobox1.Items.Add(pdis.DeviceName);;//在这里列举出来的好象是显     卡的名称。而不是我想要的显示器的名称   
      end;   
      combobox1.Text:=combobox1.Items[0];   
      form1.ComboBox1Change(sender);   
      end;   
      procedure   TForm1.ComboBox1Change(Sender:   TObject);   
      var   i:integer;   
      begin   
      for   i:=1   to   120   do   
        begin   
          disr_a[i].w:=0;   
          disr_a[i].h:=0;   
          disr_a[i].c:=0;   
        end;   
      listbox1.Items.Clear;   
      i:=0;   
      dis.dmSize:=sizeof(dis);   
      while   EnumDisplaySettings(pchar(combobox1.Text),i,dis)<>false   do   
      if   ChangeDisplaySettingsa(dis,CDS_test)<>DISP_CHANGE_BADMODE//检测是否可用   then   
        begin   
          inc(i);   
          disr_a[i].w:=dis.dmPelsWidth;   
          disr_a[i].h:=dis.dmPelsHeight;   
          disr_a[i].c:=dis.dmBitsPerPel;   
          listbox1.Items.Add('宽:='+inttostr(dis.dmPelsWidth)+'高='+inttostr(dis.dmPelsHeight)+'色彩:='+inttostr(dis.dmBitsPerPel)+‘刷新率='+inttostr(dis.dmDisplayFrequency));   
          if   i>120   then   break;   
        end;   
      end;
      

  4.   

    你仅仅要你描述找功能吗?Windows 本身就可满足你的需要,桌面空白处点右键-> 图形选项->输出至->扩展的桌面->你要选择的显示器即可.
      

  5.   

    var
      MonitorCount,iloop:Integer;
    begin
     MonitorCount:=Screen.MonitorCount;//显示器的数量
      for i:=1 to MonitorCount do
      begin
        MonitorForm[iloop]:= TBase_F.Create(Self);
        MonitorForm[iloop].Left:=MonitorForm[iloop].Left-Monitor.Left;
        MonitorForm[iloop].Top:=MonitorForm[iloop].Top-Monitor.Top;
        MonitorForm[iloop].Left:=MonitorForm[iloop].Left + Screen.Monitors[iLoop-1].Left;
        MonitorForm[iloop].Top:=MonitorForm[iloop].Top + Screen.Monitors[iLoop-1].Top;
        MonitorForm[iloop].Show;
        MonitorForm[iloop].MakeFullyVisible(screen.Monitors[iLoop-1]);//一定要加上这句
      end;
    end;