ChatingFrm.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:88k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit ChatingFrm;
  2. interface
  3. uses
  4.   SysUtils, Windows, Menus, MMDevice, MMMixer, MMObj, Dialogs,
  5.   ExtCtrls, ImgList, Controls, StdCtrls, RxRichEd, MMSlider, MMMixCtl,
  6.   OleCtrls, SHDocVw, ComCtrls, Graphics, Classes,
  7.   Forms, UrlMon, Gauges,Messages,ShellApi,Color,
  8.   Global,MSHTML,VFW,Registry,StrUtils,Variants,ActiveX,MMSystem,
  9.   MMHook,WNDES, AppEvnts, StdActns, ActnList, Videocap, MMDesign, MMDIBCv, MMLevel,
  10.   MMConect, MMDSPObj, MMWavIn, MMACMCvt, ACMWaveOut,MySocket, ACMWaveIn, bsSkinCtrls,
  11.   BusinessSkinForm, fcButton, fcImgBtn;
  12. const
  13.   CGID_MSHTML: TGUID = '{DE4BA900-59CA-11CF-9592-444553540000}';  
  14. type
  15.   TChatingForm = class(TForm)
  16.     PnlLeftTop: TPanel;
  17.     Image10: TImage;
  18.     Image11: TImage;
  19.     Image12: TImage;
  20.     Image13: TImage;
  21.     Image14: TImage;
  22.     Image15: TImage;
  23.     PnlLeftBottom: TPanel;
  24.     Image16: TImage;
  25.     Image17: TImage;
  26.     Image18: TImage;
  27.     Image19: TImage;
  28.     Image20: TImage;
  29.     Image21: TImage;
  30.     ImgArrow: TImage;
  31.     ImgListSend: TImageList;
  32.     ImgListClose: TImageList;
  33.     ImgListHistory: TImageList;
  34.     ImgListArrow: TImageList;
  35.     ImgFont: TImage;
  36.     ImgSelFace: TImage;
  37.     ImgListMax: TImageList;
  38.     FontDialog1: TFontDialog;
  39.     lblState: TLabel;
  40.     ImgAddNew: TImage;
  41.     ImgSendFile: TImage;
  42.     ImgVoice: TImage;
  43.     ImgVideo: TImage;
  44.     TimerTopBar: TTimer;
  45.     SaveDialog: TSaveDialog;
  46.     ImgListInfo: TImageList;
  47.     MMVolumeControl1: TMMVolumeControl;
  48.     MMAudioLine2: TMMAudioLine;
  49.     MMMixerDevice1: TMMMixerDevice;
  50.     MMAudioLine1: TMMAudioLine;
  51.     MMVolumeControl2: TMMVolumeControl;
  52.     MMAudioLine3: TMMAudioLine;
  53.     Panel1: TPanel;
  54.     MsgContent: TWebBrowser;
  55.     MsgInput: TRxRichEdit;
  56.     TempRxRichEdit: TRxRichEdit;
  57.     ImgSelBack: TImage;
  58.     ImgBottomDraw: TImage;
  59.     TimerBottomBar: TTimer;
  60.     PnlSpplit: TPanel;
  61.     WebPopupMenu: TPopupMenu;
  62.     Copy1: TMenuItem;
  63.     SelectAll1: TMenuItem;
  64.     MMMixerSliderIn: TMMMixerSlider;
  65.     ImgMic: TImage;
  66.     MMMixerSliderOut: TMMMixerSlider;
  67.     ImgSpk: TImage;
  68.     ImgSpkDisabled: TImage;
  69.     ImgMicDisabled: TImage;
  70.     LblQuitAudio: TLabel;
  71.     PnlYourCamera: TPanel;
  72.     Image8: TImage;
  73.     Image9: TImage;
  74.     Image22: TImage;
  75.     Image23: TImage;
  76.     Image25: TImage;
  77.     Image26: TImage;
  78.     Image27: TImage;
  79.     PnlRightBottom: TPanel;
  80.     Image32: TImage;
  81.     Image33: TImage;
  82.     Image34: TImage;
  83.     Image35: TImage;
  84.     Image36: TImage;
  85.     Image37: TImage;
  86.     lblUserListTitle: TLabel;
  87.     TimerShowInputing: TTimer;
  88.     ImgSelColor: TImage;
  89.     ImgListSendType: TImageList;
  90.     SendTypePopupMenu: TPopupMenu;
  91.     TMEnter: TMenuItem;
  92.     TMCtrlEnter: TMenuItem;
  93.     ImgGroupMsg: TImage;
  94.     ApplicationEvents1: TApplicationEvents;
  95.     MainMenu1: TMainMenu;
  96.     ImgCopyScreen: TImage;
  97.     PopupMenu1: TPopupMenu;
  98.     A1: TMenuItem;
  99.     B1: TMenuItem;
  100.     C1: TMenuItem;
  101.     D1: TMenuItem;
  102.     E1: TMenuItem;
  103.     F1: TMenuItem;
  104.     G1: TMenuItem;
  105.     H1: TMenuItem;
  106.     O1: TMenuItem;
  107.     B2: TMenuItem;
  108.     X1: TMenuItem;
  109.     X2: TMenuItem;
  110.     OpenDialog: TOpenDialog;
  111.     ActionList1: TActionList;
  112.     EditCut1: TEditCut;
  113.     EditCopy1: TEditCopy;
  114.     EditPaste1: TEditPaste;
  115.     EditSelectAll1: TEditSelectAll;
  116.     EditUndo1: TEditUndo;
  117.     EditDelete1: TEditDelete;
  118.     PopupMenuEdit: TPopupMenu;
  119.     Undo1: TMenuItem;
  120.     N3: TMenuItem;
  121.     Cut1: TMenuItem;
  122.     Copy2: TMenuItem;
  123.     Paste1: TMenuItem;
  124.     Delete1: TMenuItem;
  125.     N4: TMenuItem;
  126.     SelectAll2: TMenuItem;
  127.     ImgHaveVideoDevice: TImage;
  128.     PnlMyCamera: TPanel;
  129.     Image1: TImage;
  130.     Image3: TImage;
  131.     Image4: TImage;
  132.     Image5: TImage;
  133.     Image2: TImage;
  134.     Image6: TImage;
  135.     Image7: TImage;
  136.     AviPanel: TPanel;
  137.     AviPanelOut: TPanel;
  138.     VideoCap: TVideoCap;
  139.     LblFPS: TLabel;
  140.     MMDesigner1: TMMDesigner;
  141.     ImgOpenVideoForm: TImage;
  142.     MMMixerDevice2: TMMMixerDevice;
  143.     ACMWaveOut: TACMWaveOut;
  144.     ACMWaveIn: TACMWaveIn;
  145.     CopyScreenTypePopupMenu: TPopupMenu;
  146.     MDirectCopyScreen: TMenuItem;
  147.     MCopyScreenAfterMinWindow: TMenuItem;
  148.     CopyScreenTimer: TTimer;
  149.     TVUserList: TbsSkinTreeView;
  150.     bsBusinessSkinForm1: TbsBusinessSkinForm;
  151.     Image24: TImage;
  152.     fcImageBtn1: TfcImageBtn;
  153.     fcImageBtn2: TfcImageBtn;
  154.     fcImageBtn3: TfcImageBtn;
  155.     fcImageBtn4: TfcImageBtn;
  156.     fcImageBtn5: TfcImageBtn;
  157.     Label1: TLabel;
  158.     Label2: TLabel;
  159.     Label3: TLabel;
  160.     Label4: TLabel;
  161.     Label5: TLabel;
  162.     bsSkinPanel1: TbsSkinPanel;
  163.     ImgHistory: TImage;
  164.     ImgClose: TImage;
  165.     ImgSend: TImage;
  166.     ImgSendType: TImage;
  167.     procedure FormCreate(Sender: TObject);
  168.     procedure ImgSendMouseDown(Sender: TObject; Button: TMouseButton;
  169.       Shift: TShiftState; X, Y: Integer);
  170.     procedure ImgSendMouseUp(Sender: TObject; Button: TMouseButton;
  171.       Shift: TShiftState; X, Y: Integer);
  172.     procedure ImgCloseMouseDown(Sender: TObject; Button: TMouseButton;
  173.       Shift: TShiftState; X, Y: Integer);
  174.     procedure ImgCloseMouseUp(Sender: TObject; Button: TMouseButton;
  175.       Shift: TShiftState; X, Y: Integer);
  176.     procedure ImgHistoryMouseDown(Sender: TObject; Button: TMouseButton;
  177.       Shift: TShiftState; X, Y: Integer);
  178.     procedure ImgHistoryMouseUp(Sender: TObject; Button: TMouseButton;
  179.       Shift: TShiftState; X, Y: Integer);
  180.     procedure ImgArrowClick(Sender: TObject);
  181.     procedure ImgCloseClick(Sender: TObject);
  182.     procedure ImgFontMouseDown(Sender: TObject; Button: TMouseButton;
  183.       Shift: TShiftState; X, Y: Integer);
  184.     procedure ImgFontMouseUp(Sender: TObject; Button: TMouseButton;
  185.       Shift: TShiftState; X, Y: Integer);
  186.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  187.     procedure ImgTitleMouseDown(Sender: TObject; Button: TMouseButton;
  188.       Shift: TShiftState; X, Y: Integer);
  189.     procedure ImgClosedClick(Sender: TObject);
  190.     procedure ImgMaxClick(Sender: TObject);
  191.     procedure ImgMinClick(Sender: TObject);
  192.     procedure MsgInputChange(Sender: TObject);
  193.     procedure ImgSendClick(Sender: TObject);
  194.     procedure ImgHistoryClick(Sender: TObject);
  195.     procedure FormResize(Sender: TObject);
  196.     procedure ImgFontClick(Sender: TObject);
  197.     procedure FormShow(Sender: TObject);
  198.     procedure TVUserListCustomDrawItem(Sender: TCustomTreeView;
  199.       Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
  200.     procedure ImgAddNewClick(Sender: TObject);
  201.     procedure ImgSendFileClick(Sender: TObject);
  202.     procedure ImgAddNewMouseMove(Sender: TObject; Shift: TShiftState; X,
  203.       Y: Integer);
  204.     procedure TimerTopBarTimer(Sender: TObject);
  205.     procedure ImgAddNewMouseDown(Sender: TObject; Button: TMouseButton;
  206.       Shift: TShiftState; X, Y: Integer);
  207.     procedure ImgAddNewMouseUp(Sender: TObject; Button: TMouseButton;
  208.       Shift: TShiftState; X, Y: Integer);
  209.     procedure ImgVideoClick(Sender: TObject);
  210.     procedure ImgVoiceClick(Sender: TObject);
  211.     procedure ImgSelFaceClick(Sender: TObject);
  212.     procedure ImgFontMouseMove(Sender: TObject; Shift: TShiftState; X,
  213.       Y: Integer);
  214.     procedure TimerBottomBarTimer(Sender: TObject);
  215.     procedure ImgSelBackMouseDown(Sender: TObject; Button: TMouseButton;
  216.       Shift: TShiftState; X, Y: Integer);
  217.     procedure ImgSelBackMouseUp(Sender: TObject; Button: TMouseButton;
  218.       Shift: TShiftState; X, Y: Integer);
  219.     procedure ImgSelBackClick(Sender: TObject);
  220.     procedure PnlSpplitMouseMove(Sender: TObject; Shift: TShiftState; X,
  221.       Y: Integer);
  222.     procedure PnlSpplitMouseDown(Sender: TObject; Button: TMouseButton;
  223.       Shift: TShiftState; X, Y: Integer);
  224.     procedure PnlSpplitMouseUp(Sender: TObject; Button: TMouseButton;
  225.       Shift: TShiftState; X, Y: Integer);
  226.     procedure Copy1Click(Sender: TObject);
  227.     procedure SelectAll1Click(Sender: TObject);
  228.     procedure MsgContentBeforeNavigate2(Sender: TObject;
  229.       const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  230.       Headers: OleVariant; var Cancel: WordBool);
  231.     procedure WebPopupMenuPopup(Sender: TObject);
  232.     procedure FormActivate(Sender: TObject);
  233.     procedure FormDeactivate(Sender: TObject);
  234.     procedure MMMixerSliderInChange(Sender: TObject);
  235.     procedure ImgMicClick(Sender: TObject);
  236.     procedure ImgSpkClick(Sender: TObject);
  237.     procedure LblQuitAudioClick(Sender: TObject);
  238.     procedure TimerShowInputingTimer(Sender: TObject);
  239.     procedure MsgContentDocumentComplete(Sender: TObject;
  240.       const pDisp: IDispatch; var URL: OleVariant);
  241.     procedure ImgSelColorClick(Sender: TObject);
  242.     procedure ImgSendTypeMouseDown(Sender: TObject; Button: TMouseButton;
  243.       Shift: TShiftState; X, Y: Integer);
  244.     procedure ImgSendTypeMouseUp(Sender: TObject; Button: TMouseButton;
  245.       Shift: TShiftState; X, Y: Integer);
  246.     procedure ImgSendTypeClick(Sender: TObject);
  247.     procedure TMEnterClick(Sender: TObject);
  248.     procedure TMCtrlEnterClick(Sender: TObject);
  249.     procedure ImgGroupMsgClick(Sender: TObject);
  250.     procedure TVUserListGetImageIndex(Sender: TObject; Node: TTreeNode);
  251.     procedure ApplicationEvents1Message(var Msg: tagMSG;
  252.       var Handled: Boolean);
  253.     procedure X1Click(Sender: TObject);
  254.     procedure X2Click(Sender: TObject);
  255.     procedure MsgInputMouseDown(Sender: TObject; Button: TMouseButton;
  256.       Shift: TShiftState; X, Y: Integer);
  257.     procedure VideoCapVideoStream(sender: TObject; lpVhdr: PVIDEOHDR);
  258.     procedure AviPanelOutDblClick(Sender: TObject);
  259.     procedure ACMWaveInData(data: Pointer; size: Integer);
  260.     procedure MDirectCopyScreenClick(Sender: TObject);
  261.     procedure ImgCopyScreenClick(Sender: TObject);
  262.     procedure MCopyScreenAfterMinWindowClick(Sender: TObject);
  263.     procedure CopyScreenTimerTimer(Sender: TObject);
  264.     procedure lblTitleClick(Sender: TObject);
  265.     procedure TVUserListClick(Sender: TObject);
  266.     procedure fcImageBtn3Click(Sender: TObject);
  267.     procedure fcImageBtn2Click(Sender: TObject);
  268.     procedure fcImageBtn4Click(Sender: TObject);
  269.     procedure fcImageBtn1Click(Sender: TObject);
  270.     procedure fcImageBtn5Click(Sender: TObject);
  271.     procedure Label1Click(Sender: TObject);
  272.     procedure Label2Click(Sender: TObject);
  273.     procedure Label3Click(Sender: TObject);
  274.     procedure Label4Click(Sender: TObject);
  275.     procedure Label5Click(Sender: TObject);
  276.   protected
  277.   private
  278.     ShowInputingTimes,LastInputing:Cardinal;
  279.     ImgIndex,LastImgIndex:Integer;
  280.     CanMove: Boolean;
  281.     OX,OY,OldTop:Integer;
  282.     procedure CopyScreen;
  283.   public
  284.     Pushed:Boolean;
  285.     Img:TImage;
  286.     Lbl:TLabel;
  287.     IsSystemMsg,
  288.     InGroupMsg,
  289.     AudioIsOn,
  290.     VideoIsOn:Boolean;
  291.     RoomInfo:ChatRoom;
  292.     procedure CreateParams(var Params:TCreateParams);override;
  293.     procedure ShowTitle(ShowList:Boolean=True);
  294.     procedure SetBrowserStyle();
  295.     procedure SetBrowserBg(Url:String);
  296.     procedure SetDOMStyle(Doc:IHTMLDocument2);
  297.     procedure ShowInputing(Show:Boolean);
  298.     procedure ShowOffline(Name:String);
  299.     procedure ShowInfo(Info:String);
  300.   end;
  301. implementation
  302. uses
  303.   SelUserFrm,SelFaceFrm, SelBackFrm,SelColorFrm,HistoryFrm,RealMessengerUnit,
  304.   RealMessengerImpl,CopyScreenFrm, VideoFrm;
  305. {$R *.DFM}
  306. {------------------------------------------------------------------------------}
  307. procedure TChatingForm.TimerShowInputingTimer(Sender: TObject);
  308. begin
  309.   if GetTickCount-ShowInputingTimes>TimerShowInputing.Interval then
  310.   begin
  311.     ShowInputing(False);
  312.     TimerShowInputing.Enabled:=False;
  313.   end;
  314. end;
  315. {------------------------------------------------------------------------------}
  316. procedure TChatingForm.ShowInfo(Info:String);
  317. begin
  318.     if Img=nil then
  319.     begin
  320.       Img:=TImage.Create(Self);
  321.       Img.Left:=4;
  322.       Img.Top:=4;
  323.       Img.AutoSize:=True;
  324.       Img.Transparent:=True;
  325.       PnlLeftTop.InsertControl(Img);
  326.       Img.Refresh;
  327.     end;
  328.     
  329.     ImgListInfo.GetBitmap(0,Img.Picture.Bitmap);
  330.     if Lbl=nil then
  331.     begin
  332.       Lbl:=TLabel.Create(Self);
  333.       Lbl.Left:=Img.Width + 8;
  334.       Lbl.Top:=6;
  335.       Lbl.Transparent:=True;
  336.       PnlLeftTop.InsertControl(Lbl);
  337.     end;
  338.     Lbl.Caption:=Info;
  339.     Lbl.Refresh;
  340. end;
  341. {------------------------------------------------------------------------------}
  342. procedure TChatingForm.ShowOffline(Name:String);
  343. begin
  344.     if Img=nil then
  345.     begin
  346.       Img:=TImage.Create(Self);
  347.       Img.Left:=4;
  348.       Img.Top:=4;
  349.       Img.AutoSize:=True;
  350.       Img.Transparent:=True;
  351.       PnlLeftTop.InsertControl(Img);
  352.     end;
  353.     
  354.     ImgListInfo.GetBitmap(0,Img.Picture.Bitmap);
  355.     if Lbl=nil then
  356.     begin
  357.       Lbl:=TLabel.Create(Self);
  358.       Lbl.Left:=Img.Width + 8;
  359.       Lbl.Top:=6;
  360.       Lbl.Transparent:=True;
  361.       PnlLeftTop.InsertControl(Lbl);
  362.     end;
  363.     Lbl.Caption:='因为没有联机,'+Name+' 可能无法收到您的消息!';
  364. end;
  365. {------------------------------------------------------------------------------}
  366. procedure TChatingForm.ShowInputing(Show:Boolean);
  367. begin
  368.   ShowInputingTimes:=GetTickCount;
  369.   if Show then
  370.   begin
  371.     if Not TimerShowInputing.Enabled then TimerShowInputing.Enabled:=True;
  372.     if Img=nil then
  373.     begin
  374.       Img:=TImage.Create(Self);
  375.       Img.Left:=4;
  376.       Img.Top:=4;
  377.       Img.AutoSize:=True;
  378.       Img.Transparent:=True;
  379.       PnlLeftTop.InsertControl(Img);
  380.     end;
  381.     ImgListInfo.GetBitmap(0,Img.Picture.Bitmap);
  382.     if Lbl=nil then
  383.     begin
  384.       Lbl:=TLabel.Create(Self);
  385.       Lbl.Left:=Img.Width + 8;
  386.       Lbl.Top:=6;
  387.       Lbl.Transparent:=True;
  388.       PnlLeftTop.InsertControl(Lbl);
  389.     end;
  390.     Lbl.Caption:=PEmployee(TVUserList.Items.GetFirstNode.Data).Name+' 正在输入消息...';
  391.   end
  392.   else
  393.   begin
  394.     if Lbl<>nil then
  395.     begin
  396.       PnlLeftTop.RemoveControl(Lbl);
  397.       Lbl.Free;
  398.       Lbl:=nil;
  399.     end;
  400.     if Img<>nil then
  401.     begin
  402.       PnlLeftTop.RemoveControl(Img);
  403.       Img.Free;
  404.       Img:=nil;
  405.     end;
  406.   end;
  407. end;
  408. {------------------------------------------------------------------------------}
  409. {
  410. 功能:设置窗口样式(无标题栏,有边框)
  411. }
  412. procedure TChatingForm.CreateParams(var Params: TCreateParams);
  413. begin
  414.   inherited;
  415.    Params.Style :=WS_THICKFRAME OR WS_POPUP OR WS_BORDER OR WS_SYSMENU or WS_MINIMIZEBOX;
  416.    Params.wndParent := GetDesktopwindow; end;
  417. {------------------------------------------------------------------------------}
  418. procedure TChatingForm.ShowTitle(ShowList:Boolean=True);
  419. var
  420.   iLoop:Integer;
  421.   HaveOfflineUser:Integer;
  422.   Node:TTreeNode;
  423.   EmployeePointer,PEmployeeData:PEmployee;
  424. begin
  425.   if IsSystemMsg then Exit;
  426.   Caption:='';
  427.   if InGroupMsg then
  428.   begin
  429.     Caption:='群发消息';
  430. //    lblTitle.Caption:=Caption;
  431.     lblUserListTitle.Caption:='当前对话('+IntToStr(TVUserList.Items.Count) + ')';
  432.     exit;
  433.   end;
  434.   if ShowList then
  435.   begin
  436.     for iLoop:=0 to TVUserList.Items.Count-1 do FreeMem(TVUserList.Items[iLoop].Data,SizeOf(Employee));
  437.     TVUserList.Items.Clear;
  438.     ImgHaveVideoDevice.Visible:=False;
  439.   end;
  440.   
  441.   lblUserListTitle.Caption:='当前对话('+IntToStr(RoomInfo.UserCount - 1) + ')';
  442.   HaveOfflineUser:=0;
  443.   for iLoop:=1 to RoomInfo.UserCount do
  444.   begin
  445.     if RoomInfo.Users[iLoop] = Me.ID then continue;
  446.     if RoomInfo.Users[iLoop] = -1 then
  447.     begin
  448.       Caption:='系统消息';
  449. //      lblTitle.Caption:=Caption;
  450.       ImgArrowClick(ImgArrow);
  451.       ImgArrow.Visible:=False;
  452.       IsSystemMsg:=True;
  453.       PnlLeftBottom.Visible:=False;
  454.       ImgClose.Visible:=False;
  455.       ImgSend.Visible:=False;
  456.       Self.ImgSendType.Visible:=False;
  457.       ConvertBitmapToColor(ImgAddNew.Picture.Bitmap,$DEDEDE);
  458.       ConvertBitmapToColor(ImgSendFile.Picture.Bitmap,$DEDEDE);
  459.       ConvertBitmapToColor(ImgVoice.Picture.Bitmap,$DEDEDE);
  460.       ConvertBitmapToColor(ImgVideo.Picture.Bitmap,$DEDEDE);
  461.       ConvertBitmapToColor(ImgGroupMsg.Picture.Bitmap,$DEDEDE);
  462.       ImgAddNew.Enabled:=False;
  463.       ImgSendFile.Enabled:=False;
  464.       ImgVoice.Enabled:=False;
  465.       ImgVideo.Enabled:=False;
  466.       ImgGroupMsg.Enabled:=False;
  467.       PnlSpplit.Visible:=False;
  468.       PnlLeftTop.Height:=PnlLeftTop.Height+PnlLeftBottom.Height+PnlSpplit.Height;
  469.       Exit;
  470.     end;
  471.     PEmployeeData:=FindEmployeeByID(RoomInfo.Users[iLoop]);
  472.     if PEmployeeData=nil then continue;
  473.     Caption:=Caption+PEmployeeData.Name+' ';
  474.     if ShowList then
  475.     begin
  476.       ShowInputing(False);
  477.       GetMem(EmployeePointer,SizeOf(Employee));
  478.       CopyMemory(EmployeePointer,PEmployeeData,SizeOf(Employee));
  479.       Node:=TVUserList.Items.AddChildObject(nil,EmployeePointer.Name,EmployeePointer);
  480.       Node.StateIndex:=2;
  481.       EmployeePointer.Node:=Node;
  482.       RealMessengerX.UpdateListViewStates(TVUserList,Node);
  483.       if AnsiSameText(PEmployeeData.State,'断开') or (AnsiSameText(PEmployeeData.State,'显示为脱机')) then HaveOfflineUser:=HaveOfflineUser+1;
  484.       if (PEmployeeData.State<>'断开') and PEmployeeData.HaveVideoDevice and (RoomInfo.UserCount = 2) then ImgHaveVideoDevice.Visible:=True;
  485.     end;
  486.   end;
  487.   if HaveOfflineUser>0 then
  488.   begin
  489.     if RoomInfo.UserCount = 2 then
  490.       ShowOffline(PEmployee(TVUserList.Items.GetFirstNode.Data).Name)
  491.     else
  492.       if HaveOfflineUser = 1 then
  493.         ShowOffline('某个用户')
  494.       else
  495.         ShowOffline('某些用户');
  496.   end;
  497.   Caption:=Caption+'- 对话';
  498. end;
  499. {------------------------------------------------------------------------------}
  500. {
  501. 功能:对话窗口的OnCreate事件
  502. }
  503. procedure TChatingForm.FormCreate(Sender: TObject);
  504. var
  505.   TempReg:TRegistry;
  506. begin
  507.   try
  508.     ImgArrow.OnClick(ImgArrow);
  509.     DragAcceptFiles(MsgContent.handle,true);
  510.     DoubleBuffered:=True;
  511.     PnlLeftBottom.DoubleBuffered:=True;
  512.     PnlLeftTop.DoubleBuffered:=True;
  513.     PnlRightBottom.DoubleBuffered:=True;
  514.     PnlSpplit.DoubleBuffered:=True;
  515.     AviPanel.DoubleBuffered:=True;
  516.     AviPanelOut.DoubleBuffered:=True;
  517.     PnlYourCamera.DoubleBuffered:=True;
  518.     MsgContent.DoubleBuffered:=False;
  519.     MsgInput.DoubleBuffered:=False;
  520.     MsgContent.Navigate('about:blank');
  521.     TVUserList.Images:=ImgListMain;
  522.     TempReg:=TRegistry.Create;
  523.     try
  524.       TempReg.RootKey:=HKEY_LOCAL_MACHINE;
  525.       if TempReg.OpenKey(AppKey+''+LoginName+'ChatingFormStore', True) then
  526.       begin
  527.         if trim(TempReg.ReadString('Width')) <>''    then Width:=StrToInt(TempReg.ReadString('Width'));
  528.         if trim(TempReg.ReadString('Height'))<>''    then Height:=StrToInt(TempReg.ReadString('Height'));
  529.         if ChatingFormList.Count <= 0 then
  530.         begin
  531.           Left:=(Screen.WorkAreaWidth-Width) div 2;
  532.           Top:=(Screen.WorkAreaHeight-Height) div 2;
  533.         end
  534.         else
  535.         begin
  536.           Left:=TForm(ChatingFormList.Items[ChatingFormList.Count - 1]).Left + 20;
  537.           Top:=TForm(ChatingFormList.Items[ChatingFormList.Count - 1]).Top + 20;
  538.           if (Left > Screen.WorkAreaWidth - Width) or (Top > Screen.WorkAreaHeight - Height) then
  539.           begin
  540.             Left:=0;
  541.             Top:=0;
  542.           end;
  543.         end;
  544.         if trim(TempReg.ReadString('SpplitTop'))<>'' then
  545.         begin
  546.           Self.PnlSpplitMouseDown(nil,mbLeft,[],0,0);
  547.           PnlSpplit.Top:=StrToInt(TempReg.ReadString('SpplitTop'));
  548.           Self.PnlSpplitMouseMove(nil,[],0,OY+1);
  549.           Self.PnlSpplitMouseMove(nil,[],0,OY-1);
  550.           Self.PnlSpplitMouseUp(nil,mbLeft,[],0,0);
  551.         end;
  552.         if trim(TempReg.ReadString('SendType'))='Enter' then
  553.         begin
  554.           TMEnter.Checked:=True;
  555.           TMEnter.Enabled:=False;
  556.         end
  557.         else
  558.         begin
  559.           TMCtrlEnter.Checked:=True;
  560.           TMCtrlEnter.Enabled:=False;
  561.         end;
  562.       end;
  563.       if TempReg.OpenKey(AppKey+''+LoginName+'Font', True) then
  564.       begin
  565.         if trim(TempReg.ReadString('Name'))='' then
  566.             TempReg.WriteString('Name','宋体');
  567.         if trim(TempReg.ReadString('Color'))='' then
  568.             TempReg.WriteString('Color','0');
  569.         if trim(TempReg.ReadString('Size'))='' then
  570.             TempReg.WriteString('Size','9');
  571.         if trim(TempReg.ReadString('fsBold'))='' then
  572.             TempReg.WriteString('fsBold','0');
  573.         if trim(TempReg.ReadString('fsItalic'))='' then
  574.             TempReg.WriteString('fsItalic','0');
  575.         if trim(TempReg.ReadString('fsUnderline'))='' then
  576.             TempReg.WriteString('fsUnderline','0');
  577.         if trim(TempReg.ReadString('fsStrikeOut'))='' then
  578.             TempReg.WriteString('fsStrikeOut','0');
  579.         
  580.         MsgInput.Font.Name  :=TempReg.ReadString('Name');
  581.         MsgInput.Font.Color :=StrToInt(TempReg.ReadString('Color'));
  582.         MsgInput.Font.Size  :=StrToInt(TempReg.ReadString('Size'));
  583.         if trim(TempReg.ReadString('fsBold'))='1' then MsgInput.Font.Style := MsgInput.Font.Style+[fsBold];
  584.         if trim(TempReg.ReadString('fsItalic'))='1' then MsgInput.Font.Style := MsgInput.Font.Style+[fsItalic];
  585.         if trim(TempReg.ReadString('fsUnderline'))='1' then MsgInput.Font.Style := MsgInput.Font.Style+[fsUnderline];
  586.         if trim(TempReg.ReadString('fsStrikeOut'))='1' then MsgInput.Font.Style := MsgInput.Font.Style+[fsStrikeOut];
  587.      end;
  588.     finally
  589.       TempReg.Free;
  590.     end;
  591.   except
  592.   end;
  593. end;
  594. {------------------------------------------------------------------------------}
  595. procedure TChatingForm.ImgSendMouseDown(Sender: TObject;
  596.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  597. begin
  598.   ImgListSend.GetBitmap(1,ImgSend.Picture.Bitmap);
  599.   ConvertBitmapToColor(ImgSend.Picture.Bitmap,EndColor);
  600.   ImgSend.Refresh;
  601. end;
  602. {------------------------------------------------------------------------------}
  603. procedure TChatingForm.ImgSendMouseUp(Sender: TObject;
  604.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  605. begin
  606.   ImgListSend.GetBitmap(0,ImgSend.Picture.Bitmap);
  607.   ConvertBitmapToColor(ImgSend.Picture.Bitmap,EndColor);
  608.   ImgSend.Refresh;
  609. end;
  610. {------------------------------------------------------------------------------}
  611. procedure TChatingForm.ImgCloseMouseDown(Sender: TObject;
  612.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  613. begin
  614.   ImgListClose.GetBitmap(1,ImgClose.Picture.Bitmap);
  615.   ConvertBitmapToColor(ImgClose.Picture.Bitmap,EndColor);
  616.   ImgClose.Refresh;
  617. end;
  618. {------------------------------------------------------------------------------}
  619. procedure TChatingForm.ImgCloseMouseUp(Sender: TObject;
  620.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  621. begin
  622.   ImgListClose.GetBitmap(0,ImgClose.Picture.Bitmap);
  623.   ConvertBitmapToColor(ImgClose.Picture.Bitmap,EndColor);
  624.   ImgClose.Refresh;
  625. end;
  626. {------------------------------------------------------------------------------}
  627. procedure TChatingForm.ImgHistoryMouseUp(Sender: TObject;
  628.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  629. begin
  630.   ImgListHistory.GetBitmap(0,ImgHistory.Picture.Bitmap);
  631.   ConvertBitmapToColor(ImgHistory.Picture.Bitmap,EndColor);
  632.   ImgHistory.Refresh;
  633. end;
  634. {------------------------------------------------------------------------------}
  635. procedure TChatingForm.ImgHistoryMouseDown(Sender: TObject;
  636.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  637. begin
  638.   ImgListHistory.GetBitmap(1,ImgHistory.Picture.Bitmap);
  639.   ConvertBitmapToColor(ImgHistory.Picture.Bitmap,EndColor);
  640.   ImgHistory.Refresh;
  641. end;
  642. {------------------------------------------------------------------------------}
  643. procedure TChatingForm.ImgArrowClick(Sender: TObject);
  644. begin
  645.   PnlRightBottom.Visible := not PnlRightBottom.Visible;
  646.   (Sender As TImage).Picture.Bitmap.Canvas.Pen.Style:=psClear;
  647.   (Sender As TImage).Picture.Bitmap.Canvas.Rectangle(0,0,20,20);
  648.   if (PnlRightBottom.Visible = False) and (Width-PnlLeftBottom.Width>PnlRightBottom.Width)  then
  649.   begin
  650.     PnlLeftBottom.Width    :=PnlLeftBottom.Width + PnlRightBottom.Width + 2;
  651.     ImgSendType.Left       :=ImgSendType.Left + PnlRightBottom.Width + 2;
  652.     ImgSend.Left           :=ImgSend.Left + PnlRightBottom.Width + 2;
  653.     ImgClose.Left          :=ImgClose.Left + PnlRightBottom.Width + 2;
  654.     ImgListArrow.GetBitmap(1,(Sender As TImage).Picture.Bitmap);
  655.     ConvertBitmapToColor((Sender As TImage).Picture.Bitmap,EndColor);
  656.     (Sender As TImage).Refresh;
  657.   end
  658.   else if (Width-PnlLeftBottom.Width<PnlRightBottom.Width) then
  659.   begin
  660.     PnlLeftBottom.Width    :=PnlLeftBottom.Width - PnlRightBottom.Width - 2;
  661.     ImgSendType.Left       :=ImgSendType.Left - PnlRightBottom.Width - 2;
  662.     ImgSend.Left           :=ImgSend.Left - PnlRightBottom.Width - 2;
  663.     ImgClose.Left          :=ImgClose.Left - PnlRightBottom.Width - 2;
  664.     ImgListArrow.GetBitmap(0,(Sender As TImage).Picture.Bitmap);
  665.     ConvertBitmapToColor((Sender As TImage).Picture.Bitmap,EndColor);
  666.     (Sender As TImage).Refresh;
  667.   end;
  668. end;
  669. {------------------------------------------------------------------------------}
  670. procedure TChatingForm.ImgCloseClick(Sender: TObject);
  671. begin
  672.   Close;
  673. end;
  674. {------------------------------------------------------------------------------}
  675. procedure TChatingForm.ImgFontMouseDown(Sender: TObject;
  676.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  677. begin
  678.   (Sender as TImage).Left:=(Sender as TImage).Left+1;
  679.   (Sender as TImage).Top:=(Sender as TImage).Top+1;
  680. end;
  681. {------------------------------------------------------------------------------}
  682. procedure TChatingForm.ImgFontMouseUp(Sender: TObject;
  683.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  684. begin
  685.   (Sender as TImage).Left:=(Sender as TImage).Left-1;
  686.   (Sender as TImage).Top:=(Sender as TImage).Top-1;
  687. end;
  688. {------------------------------------------------------------------------------}
  689. {
  690. 功能:对话窗口的OnClose事件
  691. }
  692. procedure TChatingForm.FormClose(Sender: TObject; var Action: TCloseAction);
  693. var
  694.   iLoop,MissionCount:Integer;
  695.   TransmitFile:TTransmitFile;
  696.   AudioHandShake:TAudioHandShake;
  697.   VideoHandShake:TVideoHandShake;
  698. begin
  699.   try
  700.     MissionCount:=0;
  701.     with TransmitFiles.LockList do
  702.     try
  703.       for iLoop:=0 to Count - 1 do
  704.       begin
  705.         TransmitFile:=Items[iLoop];
  706.         if TransmitFile.ChatingForm = Self then MissionCount:=MissionCount+1;
  707.       end;
  708.     finally
  709.       TransmitFiles.UnlockList;
  710.     end;
  711.     with AudioHandShakes.LockList do
  712.     try
  713.       for iLoop:=0 to Count - 1 do
  714.       begin
  715.         AudioHandShake:=Items[iLoop];
  716.         if AudioHandShake.ChatingForm = Self then MissionCount:=MissionCount+1;
  717.       end;
  718.     finally
  719.       AudioHandShakes.UnlockList;
  720.     end;
  721.     with VideoHandShakes.LockList do
  722.     try
  723.       for iLoop:=0 to Count - 1 do
  724.       begin
  725.         VideoHandShake:=Items[iLoop];
  726.         if VideoHandShake.ChatingForm = Self then MissionCount:=MissionCount+1;
  727.       end;
  728.     finally
  729.       VideoHandShakes.UnlockList;
  730.     end;
  731.     if MissionCount>0 then
  732.     begin
  733.       if MessageBox(Handle,PChar('有 '+IntToStr(MissionCount)+' 个任务在本窗口还未结束,确定要关闭吗!'),'提示',MB_ICONQUESTION or MB_OKCANCEL) <> ID_OK then
  734.       begin
  735.         Action:=caNone;
  736.         exit;
  737.       end
  738.       else
  739.       begin
  740.         with TransmitFiles.LockList do
  741.         try
  742.           for iLoop:=Count - 1 downto 0  do
  743.           begin
  744.             TransmitFile:=Items[iLoop];
  745.             if TransmitFile.ChatingForm = Self then TransmitFile.Close;
  746.           end;
  747.         finally
  748.           TransmitFiles.UnlockList;
  749.         end;
  750.         with AudioHandShakes.LockList do
  751.         try
  752.           for iLoop:=Count - 1 downto 0  do
  753.           begin
  754.             AudioHandShake:=Items[iLoop];
  755.             if AudioHandShake.ChatingForm = Self then AudioHandShake.Close;
  756.           end;
  757.         finally
  758.           AudioHandShakes.UnlockList;
  759.         end;
  760.         with VideoHandShakes.LockList do
  761.         try
  762.           for iLoop:=Count - 1 downto 0  do
  763.           begin
  764.             VideoHandShake:=Items[iLoop];
  765.             if VideoHandShake.ChatingForm = Self then VideoHandShake.Close;
  766.           end;
  767.         finally
  768.           VideoHandShakes.UnlockList;
  769.         end;
  770.       end;
  771.     end;
  772.     ChatingFormList.Remove(Self);
  773.     Action:=caFree;
  774.   except
  775.   end;
  776. end;
  777. {------------------------------------------------------------------------------}
  778. procedure TChatingForm.ImgTitleMouseDown(Sender: TObject; Button: TMouseButton;
  779.       Shift: TShiftState; X, Y: Integer);
  780. begin
  781.   if (Button = mbLeft) then
  782.   begin
  783.     ReleaseCapture;
  784.     self.Perform(WM_SYSCOMMAND, $F012, 0);
  785.     FormResize(nil);
  786.   end;
  787. end;
  788. {------------------------------------------------------------------------------}
  789. {
  790. 功能:关闭窗口
  791. }
  792. procedure TChatingForm.ImgClosedClick(Sender: TObject);
  793. begin
  794. //  Close;
  795. end;
  796. {------------------------------------------------------------------------------}
  797. {
  798. 功能:最大化
  799. }
  800. procedure TChatingForm.ImgMaxClick(Sender: TObject);
  801. begin
  802. {  if WindowState = wsNormal then
  803.   begin
  804.     ImgListMax.GetBitmap(1,ImgMax.Picture.Bitmap);
  805.     WindowState := wsMaximized;
  806.     Left:=0;
  807.     Top:=0;
  808.     Width:=Screen.WorkAreaWidth;
  809.     Height:=Screen.WorkAreaHeight;
  810.   end
  811.   else
  812.   begin
  813.     ImgListMax.GetBitmap(0,ImgMax.Picture.Bitmap);
  814.     WindowState := wsNormal;
  815.   end;
  816.   ConvertBitmapToColor(ImgMax.Picture.Bitmap,EndColor);
  817.   ImgMax.Refresh; }
  818. end;
  819. {------------------------------------------------------------------------------}
  820. {
  821. 功能:最小化
  822. }
  823. procedure TChatingForm.ImgMinClick(Sender: TObject);
  824. begin
  825. //  WindowState := wsMinimized;
  826. end;
  827. {------------------------------------------------------------------------------}
  828. procedure TChatingForm.MsgInputChange(Sender: TObject);
  829. var
  830.   I,L,S:Integer;
  831.   Buffer        :array[1..2048]of char;
  832.   CBInputing    :TCBInputing;
  833.   EmployeeData  :PEmployee;
  834. begin
  835.   L:=Length(TRxRichEdit(Sender).Text);
  836.   for I:=1 to Length(Faces) do
  837.   begin
  838.     S:=TRxRichEdit(Sender).FindText(FacesChar[I],0,L,[]);
  839.     While S>=0 do
  840.     begin
  841.       TRxRichEdit(Sender).SelStart:=S;
  842.       TRxRichEdit(Sender).SelLength:=Length(FacesChar[I]);
  843.       TRxRichEdit(Sender).SelText:=Faces[I];
  844.       TRxRichEdit(Sender).SelStart:=TRxRichEdit(Sender).SelStart+1;
  845.       TRxRichEdit(Sender).SelLength:=0;
  846.       S:=TRxRichEdit(Sender).FindText(FacesChar[I],TRxRichEdit(Sender).SelStart,L,[]);
  847.     end;
  848.   end;
  849.   if (not InGroupMsg) and ((L=0) or ((GetTickCount-LastInputing>5000) and (TVUserList.Items.Count = 1) and (not AudioIsOn) and (not VideoIsOn) and (PEmployee(TVUserList.Items.GetFirstNode.Data).State<>'断开') and (PEmployee(TVUserList.Items.GetFirstNode.Data).State<>'显示为脱机'))) then
  850.   begin
  851.     LastInputing:=GetTickCount;
  852.     CBInputing.Sender:=Me.ID;
  853.     CBInputing.Receiver:=PEmployee(TVUserList.Items.GetFirstNode.Data).ID;
  854.     CBInputing.Inputing:=(L>0);
  855.     CBInputing.Room:=RoomInfo;
  856.     Buffer[1]:=skInputing;
  857.     CopyMemory(@Buffer[2],@CBInputing,SizeOf(CBInputing));
  858.     EmployeeData:=FindEmployeeByID(CBInputing.Receiver);
  859.     if EmployeeData=nil then exit;
  860.     if EmployeeData.MySocket=nil then  EmployeeData.MySocket:=TMySocket.Create(EmployeeData.ID,RealMessengerX.ClientTCP,True);
  861.     EmployeeData.MySocket.SendBuffer(Buffer,SizeOf(CBInputing)+1);  {正在输入消息}
  862.   end;
  863. end;
  864. {------------------------------------------------------------------------------}
  865. procedure TChatingForm.ImgSendClick(Sender: TObject);
  866. var
  867.   StreamContent :array[1..99999] of Char;
  868.   Buffer        :array[1..2048]of char;
  869.   Stream        :TMemoryStream;
  870.   Content       :String;
  871.   CB            :TCBMessage;
  872.   PCB           :PCBMessage;
  873.   i             :Integer;
  874.   EmployeeData  :PEmployee;
  875. begin
  876.   CB.Sender        :=Me.ID;
  877.   CB.SendDateTime  :=Now;
  878.   CB.Room:=RoomInfo;
  879.   Stream:=TMemoryStream.Create;
  880.   MsgInput.Lines.SaveToStream(Stream);
  881.   Stream.Position:=0;
  882.   
  883.   if stream.Size > SizeOf(StreamContent) then
  884.   begin
  885.     messagebox(handle,'图标数量过多!','提示',MB_OK OR MB_ICONINFORMATION);
  886.     exit;
  887.   end;
  888.   stream.Read(StreamContent,stream.Size);
  889.   Content:=Copy(StreamContent,1,stream.Size);
  890.   for i:=1 to Length(Faces) do
  891.       Content:=AnsiReplaceStr(Content,FaceCodes[i],FacesChar[i]);
  892.   for i:=1 to Length(Content) do  StreamContent[i]:=Content[i];
  893.   
  894.   stream.Clear;
  895.   stream.Write(StreamContent,Length(Content));
  896.   stream.Position:=0;
  897.   TempRxRichEdit.Clear;
  898.   TempRxRichEdit.Lines.LoadFromStream(stream);
  899.   if Length(Trim(TempRxRichEdit.Text)) <= 0 then
  900.   begin
  901.     messagebox(handle,'消息内容不能为空!','提示',MB_OK OR MB_ICONINFORMATION);
  902.     exit;
  903.   end;
  904.   Content:=EncryStr(Copy(TempRxRichEdit.Text,1,SizeOf(CB.Content)-10),DESKEY);
  905.   for i:=1 to Length(Content) do
  906.   begin
  907.     if i<SizeOf(CB.Content) then
  908.       CB.Content[i]:=Content[i]
  909.     else
  910.       break;
  911.   end;
  912.   CB.Length :=Length(Content);
  913.   CB.Name   :=MsgInput.Font.Name;
  914.   CB.Color  :=MsgInput.Font.Color;
  915.   CB.Size   :=MsgInput.Font.Size;
  916.   if fsBold in MsgInput.Font.Style then
  917.     CB.fsBold:=True
  918.   else
  919.     CB.fsBold:=False;
  920.   if fsItalic in MsgInput.Font.Style then
  921.     CB.fsItalic:=True
  922.   else
  923.     CB.fsItalic:=False;
  924.     
  925.   if fsUnderline in MsgInput.Font.Style then
  926.     CB.fsUnderline:=True
  927.   else
  928.     CB.fsUnderline:=False;
  929.   if fsStrikeOut in MsgInput.Font.Style then
  930.     CB.fsStrikeOut:=True
  931.   else
  932.     CB.fsStrikeOut:=False;
  933.   MsgInput.Clear;
  934.   Stream.Free;
  935.   ShowMsg(Self,Self.MsgContent,Me.Name,CB,false);
  936.   if InGroupMsg then //群发消息
  937.   begin
  938.     try
  939.       for i:=0 to TVUserList.Items.Count - 1 do
  940.       begin
  941.         CB.Room.UserCount:=2;
  942.         CB.Room.Users[1]:=Me.ID;
  943.         CB.Room.Users[2]:=TVUserList.Items[i].StateIndex;
  944.         CB.Receiver:=TVUserList.Items[i].StateIndex;
  945.         CB.SendTicket:=GetTickCount;
  946.         Buffer[1]:=skMessage;
  947.         CopyMemory(@Buffer[2],@CB,SizeOf(CB));
  948.         EmployeeData:=FindEmployeeByID(CB.Receiver);
  949.         if EmployeeData=nil then continue;        
  950.         if EmployeeData.MySocket=nil then  EmployeeData.MySocket:=TMySocket.Create(EmployeeData.ID,RealMessengerX.ClientTCP,True);
  951.         EmployeeData.MySocket.SendBuffer(Buffer,SizeOf(CB)+1);  {发送消息}
  952.         if TVUserList.Items.Count>1 then
  953.         begin
  954.           Sleep(10);
  955.           Application.ProcessMessages;
  956.         end;
  957.         GetMem(PCB,SizeOf(TCBMessage));
  958.         CopyMemory(PCB,@CB,SizeOf(TCBMessage));
  959.         MsgReturnCheck.Add(PCB);
  960.         if not RealMessengerX.MsgTimer.Enabled then RealMessengerX.MsgTimer.Enabled:=True;
  961.         SaveHistory(CB);
  962.       end;
  963.     finally
  964.     end;
  965.   end
  966.   else
  967.   begin
  968.     try
  969.       for i:=1 to CB.Room.UserCount do
  970.       begin
  971.         if CB.Room.Users[i]=Me.ID then continue;
  972.         CB.Receiver:=CB.Room.Users[i];
  973.         CB.SendTicket:=GetTickCount;
  974.         Buffer[1]:=skMessage;
  975.         CopyMemory(@Buffer[2],@CB,SizeOf(CB));
  976.         
  977.         EmployeeData:=FindEmployeeByID(CB.Receiver);
  978.         if EmployeeData=nil then continue;        
  979.         if EmployeeData.MySocket=nil then  EmployeeData.MySocket:=TMySocket.Create(EmployeeData.ID,RealMessengerX.ClientTCP,True);
  980.         EmployeeData.MySocket.SendBuffer(Buffer,SizeOf(CB)+1);  {发送消息}
  981.         if CB.Room.UserCount>2 then
  982.         begin
  983.           Sleep(10);
  984.           Application.ProcessMessages;
  985.         end;
  986.         GetMem(PCB,SizeOf(TCBMessage));
  987.         CopyMemory(PCB,@CB,SizeOf(TCBMessage));
  988.         MsgReturnCheck.Add(PCB);
  989.         if not RealMessengerX.MsgTimer.Enabled then RealMessengerX.MsgTimer.Enabled:=True;
  990.         SaveHistory(CB);
  991.       end;
  992.     finally
  993.     end;
  994.   end;
  995.   MsgInput.SetFocus();
  996. end;
  997. {------------------------------------------------------------------------------}
  998. procedure TChatingForm.ImgHistoryClick(Sender: TObject);
  999. begin
  1000.   if TVUserList.Items.Count > 1 then exit;
  1001.   if HistoryForm<>nil then HistoryForm.Close;
  1002.   HistoryForm:=THistoryForm.Create(Application);
  1003.   if IsSystemMsg then
  1004.   begin
  1005.     HistoryForm.ID:=-1;
  1006.     HistoryForm.Name:='系统消息';
  1007.   end
  1008.   else
  1009.   begin
  1010.     HistoryForm.ID:=PEmployee(TVUserList.Items.GetFirstNode.Data).ID;
  1011.     HistoryForm.Name:=PEmployee(TVUserList.Items.GetFirstNode.Data).Name;
  1012.   end;
  1013.   HistoryForm.Show;
  1014. end;
  1015. {------------------------------------------------------------------------------}
  1016. procedure TChatingForm.FormResize(Sender: TObject);
  1017. var
  1018.   TempReg:TRegistry;
  1019.   OT,OH:Integer;
  1020. begin
  1021.     ShowTitle(False);
  1022.     
  1023.     if PnlLeftTop.Height<145 then
  1024.     begin
  1025.       PnlLeftTop.Height:=145;
  1026.       OT:=PnlSpplit.Top;
  1027.       PnlSpplit.Top:=PnlLeftTop.Top+PnlLeftTop.Height;
  1028.       PnlLeftBottom.Top:=PnlLeftBottom.Top+(PnlSpplit.Top-OT);
  1029.       PnlRightBottom.Top:=PnlLeftBottom.Top;
  1030.       PnlMyCamera.Top:=PnlLeftBottom.Top;
  1031.       PnlLeftBottom.Height:=PnlLeftBottom.Height+(OT-PnlSpplit.Top);
  1032.       PnlRightBottom.Height:=PnlRightBottom.Height+(OT-PnlSpplit.Top);
  1033.     end;
  1034.     
  1035.     if PnlLeftBottom.Height<90 then
  1036.     begin
  1037.       OH:=PnlLeftBottom.Height;
  1038.       PnlLeftBottom.Height:=90;
  1039.       PnlRightBottom.Height:=115;
  1040.       PnlLeftTop.Height:=PnlLeftTop.Height-(PnlLeftBottom.Height-OH);
  1041.       OT:=PnlSpplit.Top;
  1042.       PnlSpplit.Top:=PnlLeftTop.Top+PnlLeftTop.Height;
  1043.       PnlLeftBottom.Top:=PnlLeftBottom.Top+(PnlSpplit.Top-OT);
  1044.       PnlRightBottom.Top:=PnlLeftBottom.Top;
  1045.       PnlMyCamera.Top:=PnlLeftBottom.Top;
  1046.     end;
  1047.     if WindowState = wsMaximized then exit;
  1048.     TempReg:=TRegistry.Create;
  1049.     try
  1050.       TempReg.RootKey:=HKEY_LOCAL_MACHINE;
  1051.       if TempReg.OpenKey(AppKey+''+LoginName+'ChatingFormStore', True) then
  1052.       begin
  1053.         TempReg.WriteString('Left',IntToStr(Left));
  1054.         TempReg.WriteString('Top',IntToStr(Top));
  1055.         TempReg.WriteString('Width',IntToStr(Width));
  1056.         TempReg.WriteString('Height',IntToStr(Height));
  1057.         TempReg.WriteString('SpplitTop',IntToStr(PnlSpplit.Top));
  1058.       end;
  1059.     finally
  1060.       TempReg.Free;
  1061.     end;
  1062. end;
  1063. {------------------------------------------------------------------------------}
  1064. procedure TChatingForm.ImgFontClick(Sender: TObject);
  1065. var
  1066.   TempReg:TRegistry;
  1067. begin
  1068.   FontDialog1.Font:=MsgInput.Font;
  1069.   if FontDialog1.Execute then
  1070.   begin
  1071.     MsgInput.Font:=FontDialog1.Font;
  1072.     TempReg:=TRegistry.Create;
  1073.     try
  1074.       TempReg.RootKey:=HKEY_LOCAL_MACHINE;
  1075.       if TempReg.OpenKey(AppKey+''+LoginName+'Font', True) then
  1076.       begin
  1077.         TempReg.WriteString('Name',FontDialog1.Font.Name);
  1078.         TempReg.WriteString('Color',IntToStr(FontDialog1.Font.Color));
  1079.         TempReg.WriteString('Size',IntToStr(FontDialog1.Font.Size));
  1080.         
  1081.         if fsBold in FontDialog1.Font.Style then
  1082.           TempReg.WriteString('fsBold','1')
  1083.         else
  1084.           TempReg.WriteString('fsBold','0');
  1085.         if fsItalic in FontDialog1.Font.Style then
  1086.           TempReg.WriteString('fsItalic','1')
  1087.         else
  1088.           TempReg.WriteString('fsItalic','0');
  1089.         if fsUnderline in FontDialog1.Font.Style then
  1090.           TempReg.WriteString('fsUnderline','1')
  1091.         else
  1092.           TempReg.WriteString('fsUnderline','0');
  1093.         if fsStrikeOut in FontDialog1.Font.Style then
  1094.           TempReg.WriteString('fsStrikeOut','1')
  1095.         else
  1096.           TempReg.WriteString('fsStrikeOut','0')
  1097.       end;
  1098.     finally
  1099.       TempReg.Free;
  1100.     end;
  1101.   end;
  1102. end;
  1103. {------------------------------------------------------------------------------}
  1104. procedure TChatingForm.FormShow(Sender: TObject);
  1105. var
  1106.   iLoop:Integer;
  1107.   Stream:TMemoryStream;
  1108.   BitMap:TBitMap;
  1109.   StreamContent:array[1..9999] of Char;
  1110.   Content,T:string;
  1111.   i,J:Integer;
  1112.   DRect,SRect:TRect;
  1113.   ImgFace:TImage;
  1114. begin
  1115.   ShowTitle;
  1116.   OnResize:=FormResize;
  1117.   if FaceHasGeted then exit;
  1118.   
  1119.   ImgFace:=TImage.Create(nil);
  1120.   BitMap:=TBitMap.Create;
  1121.   try
  1122.     ImgFace.Picture.Bitmap.LoadFromFile(PicPath+'Faces.bmp');
  1123.     DRect.Left:=0;
  1124.     DRect.Top:=0;
  1125.     DRect.Right:=19;
  1126.     DRect.Bottom:=19;
  1127.     BitMap.Width:=20;
  1128.     BitMap.Height:=20;
  1129.     BitMap.Canvas.FillRect(DRect);
  1130.     for iLoop:=1 to Length(Faces) do
  1131.     begin
  1132.       SRect.Left:=((iLoop-1) mod 10)*30+6;
  1133.       SRect.Top:=((iLoop-1) div 10)*30+6;
  1134.       SRect.Right:=((iLoop-1) mod 10)*30+25;
  1135.       SRect.Bottom:=((iLoop-1) div 10)*30+25;
  1136.       BitMap.Canvas.CopyRect(DRect,ImgFace.Canvas,SRect);
  1137.       if Length(Faces[iLoop])<=0 then
  1138.       begin
  1139.           Faces[iLoop]:=ConvertBitmapToRTF(BitMap);
  1140.           TempRxRichEdit.Lines.Add('BmpStartBmpEnd');
  1141.           TempRxRichEdit.SelStart:=8;
  1142.           TempRxRichEdit.SelLength:=0;
  1143.           TempRxRichEdit.SelText:=Faces[iLoop];
  1144.           Stream:=TMemoryStream.Create;
  1145.           TempRxRichEdit.Lines.SaveToStream(Stream);
  1146.           Stream.Position:=0;
  1147.           stream.Read(StreamContent,stream.Size);
  1148.           Content:=Copy(StreamContent,1,stream.Size);
  1149.           J:=Pos('BmpStart', Content);
  1150.           T:=Copy(Content, J+8, Length(Content));
  1151.           I:=Pos('BmpEnd',T);
  1152.           FaceCodes[iLoop]:=Copy(Content,J+8,I-1);
  1153.           TempRxRichEdit.Clear;
  1154.       end;
  1155.       if iLoop mod 5=0 then Application.ProcessMessages;
  1156.     end;
  1157.   finally
  1158.     BitMap.Free;
  1159.     ImgFace.Free;
  1160.     FaceHasGeted:=True;
  1161.   end;
  1162. end;
  1163. {------------------------------------------------------------------------------}
  1164. procedure TChatingForm.TVUserListCustomDrawItem(Sender: TCustomTreeView;
  1165.   Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
  1166. begin
  1167.   DefaultDraw:=true;
  1168.   if Node.Selected then
  1169.   begin
  1170.     TVUserList.Canvas.Font.Color:=clWhite;
  1171.   end
  1172.   else
  1173.   begin
  1174.     if (Node.StateIndex = 2) and (not InGroupMsg) then
  1175.     begin
  1176.       if (Node.ImageIndex = 6) or (Node.ImageIndex = 10) then
  1177.         TVUserList.Canvas.Font.Color:=clRed
  1178.       else
  1179.         TVUserList.Canvas.Font.Color:=clGreen;
  1180.     end
  1181.     else if Node.StateIndex = -1 then
  1182.     begin
  1183.       TVUserList.Canvas.Font.Color:=$00934A46;
  1184.       TVUserList.Canvas.Font.Style:=[fsBold];
  1185.     end
  1186.     else
  1187.       TVUserList.Canvas.Font.Color:=clBlack;
  1188.   end;
  1189.   TVUserList.Canvas.Textout(Node.DisplayRect(True).Left+2,Node.DisplayRect(True).Top+2,Node.Text);
  1190. end;
  1191. {------------------------------------------------------------------------------}
  1192. procedure TChatingForm.ImgAddNewClick(Sender: TObject);
  1193. var
  1194.   ID:Integer;
  1195.   iLoop,jLoop:Integer;
  1196.   Finded:Boolean;
  1197.   CBAddUser:TCBAddUser;
  1198.   AddRoom:ChatRoom;
  1199.   Buffer:Array[1..2048]of char;
  1200. begin
  1201.   if InGroupMsg=True then
  1202.   begin
  1203.       MessageBox(Handle,'群发消息状态下不能进入多人模式!','提示',MB_ICONINFORMATION);
  1204.       exit;
  1205.   end;
  1206.   if AudioIsOn then
  1207.   begin
  1208.       MessageBox(Handle,'当前窗口已打开音频对话任务,不能进入多人模式!','提示',MB_ICONINFORMATION);
  1209.       exit;
  1210.   end;
  1211.   if VideoIsOn then
  1212.   begin
  1213.       MessageBox(Handle,'当前窗口已打开视频对话任务,不能进入多人模式!','提示',MB_ICONINFORMATION);
  1214.       exit;
  1215.   end;
  1216.   SelUserForm:=TSelUserForm.Create(Self);
  1217.   try
  1218.     if SelUserForm.ShowModal = mrOk then
  1219.     begin
  1220.       CBAddUser.Room.UserCount:=RoomInfo.UserCount;
  1221.       for iLoop:=1 to RoomInfo.UserCount do CBAddUser.Room.Users[iLoop]:=RoomInfo.Users[iLoop];
  1222.       AddRoom.UserCount:=0;
  1223.       for iLoop := 0 to SelUserForm.TrevUserList.Items.Count - 1 do
  1224.       begin
  1225.         if (SelUserForm.TrevUserList.Items[iLoop].ImageIndex<6) or (SelUserForm.TrevUserList.Items[iLoop].ImageIndex>13)  then continue;
  1226.         if IsNodeChecked(SelUserForm.TrevUserList.Items[iLoop])=False then continue;
  1227.         ID:=PEmployee(SelUserForm.TrevUserList.Items[iLoop].Data).ID;
  1228.         Finded:=False;
  1229.         for jLoop:=1 to RoomInfo.UserCount do
  1230.         begin
  1231.           if RoomInfo.Users[jLoop] = ID then
  1232.           begin
  1233.             Finded:=True;
  1234.             break;
  1235.           end;
  1236.         end;
  1237.         if not Finded then
  1238.         begin
  1239.           if RoomInfo.UserCount=16 then
  1240.           begin
  1241.             MessageBox(Handle,PChar('多人对话环境的最大收件人数不得超过 '+IntToStr(15)+' 个'),'提示',MB_OK);
  1242.             Break;
  1243.           end;
  1244.           AddRoom.UserCount:=AddRoom.UserCount+1;
  1245.           AddRoom.Users[AddRoom.UserCount]:=ID;
  1246.           RoomInfo.UserCount:=RoomInfo.UserCount+1;
  1247.           RoomInfo.Users[RoomInfo.UserCount]:=ID;
  1248.         end;
  1249.       end;
  1250.       if AddRoom.UserCount>0 then
  1251.       begin
  1252.         ImgHistory.Visible:=False;
  1253.         for jLoop:=1 to CBAddUser.Room.UserCount do
  1254.         begin
  1255.           if CBAddUser.Room.Users[jLoop]<>Me.ID then
  1256.           begin
  1257.             CBAddUser.Receiver:=CBAddUser.Room.Users[jLoop];
  1258.             CBAddUser.AddRoom:=AddRoom;
  1259.             Buffer[1]:=skAddUser;
  1260.             CopyMemory(@Buffer[2],@CBAddUser,SizeOf(CBAddUser));
  1261.             RealMessengerX.ClientTCP.WriteBuffer(Buffer,SizeOf(CBAddUser)+1);
  1262.           end;
  1263.         end;
  1264.       end;
  1265.     end;
  1266.   finally
  1267.     SelUserForm.Free;
  1268.     SelUserForm:=nil;
  1269.   end;
  1270.   ShowTitle();
  1271. end;
  1272. {------------------------------------------------------------------------------}
  1273. procedure TChatingForm.ImgSendFileClick(Sender: TObject);
  1274. var
  1275.   Receiver:Integer;
  1276.   ReceiverName:String;
  1277.   Form:TChatingForm;
  1278.   Room:ChatRoom;
  1279. begin
  1280.   if InGroupMsg=True then
  1281.   begin
  1282.       MessageBox(Handle,'群发消息状态下不能进行文件传输!','提示',MB_ICONINFORMATION);
  1283.       exit;
  1284.   end;
  1285.   if TVUserList.Items.Count = 1 then
  1286.   begin
  1287.     Receiver    :=PEmployee(TVUserList.Items.GetFirstNode.Data).ID;
  1288.     ReceiverName:=PEmployee(TVUserList.Items.GetFirstNode.Data).Name;
  1289.     Form        :=Self;
  1290.   end
  1291.   else
  1292.   begin
  1293.     if TVUserList.SelectionCount = 0 then
  1294.     begin
  1295.       MessageBox(Handle,'请先在 当前对话列表 中选择收件人!','提示',MB_ICONINFORMATION);
  1296.       exit;
  1297.     end;
  1298.     Receiver    :=PEmployee(TVUserList.Selected.Data).ID;
  1299.     ReceiverName:=PEmployee(TVUserList.Selected.Data).Name;
  1300.     Room.UserCount:=2;
  1301.     Room.Users[1] :=Me.ID;
  1302.     Room.Users[2] :=Receiver;
  1303.     Form:=OpenChatingForm(Room);
  1304.     Form.Show;
  1305.   end;
  1306.   OpenDialog.Title:='请选择要给 '+ReceiverName+' 发送的文件';
  1307.   if OpenDialog.Execute then
  1308.   begin
  1309.     TTransmitFile.Create(tfSend,Me.ID,Me.Name,Receiver,ReceiverName,OpenDialog.Files.Strings[0],Form,'',0,'',0);
  1310.   end;
  1311. end;
  1312. {------------------------------------------------------------------------------}
  1313. {
  1314. 功能:模拟Toolbar的按钮动作,MouseMove时显示为凸起状态
  1315. }
  1316. procedure TChatingForm.ImgAddNewMouseMove(Sender: TObject;
  1317.   Shift: TShiftState; X, Y: Integer);
  1318. begin
  1319.  {   ImgIndex:=(Sender as TImage).Tag;
  1320.     if ImgIndex=LastImgIndex then exit;
  1321.     ImgDraw.Canvas.lock;
  1322.     With ImgDraw.Canvas do
  1323.     begin
  1324.       Pen.Mode :=pmCopy;
  1325.       Pen.Style:=psClear;
  1326.       Rectangle(0,0,ImgDraw.Width+1,ImgDraw.Height+1);
  1327.       Pen.Style:=psSolid;
  1328.       Pen.Color:=$00FEFEFE;
  1329.       Pen.Width:=1;
  1330.       MoveTo((Sender as TImage).Left-ImgDraw.Left,50);
  1331.       LineTo(PenPos.X,2);
  1332.       LineTo(PenPos.X+(Sender as TImage).Width,2);
  1333.       Pen.Color:=EndColor;
  1334.       LineTo(PenPos.X,50);
  1335.       LineTo(PenPos.X-(Sender as TImage).Width,50);
  1336.       Pen.Mode :=pmWhite;
  1337.       Pen.Style:=psSolid;
  1338.      // Rectangle((Sender as TImage).Left-ImgDraw.Left+1,3,(Sender as TImage).Left-ImgDraw.Left+(Sender as TImage).Width,50);
  1339.       //Refresh;
  1340.     end;
  1341.     LastImgIndex:=ImgIndex;
  1342.     TimerTopBar.Enabled:=True;
  1343.     ImgDraw.Canvas.Unlock;   }
  1344. end;
  1345. {------------------------------------------------------------------------------}
  1346. {
  1347. 功能:检查Mouse是否还在指定的范围之内,如不在则复位ToolBar的显示状态
  1348. }
  1349. procedure TChatingForm.TimerTopBarTimer(Sender: TObject);
  1350. var
  1351.    p : TPoint;
  1352. begin
  1353.  {  GetCursorPos(p);
  1354.    if (P.X < Left + ImgDraw.Left) or
  1355.       (P.X > Left + ImgDraw.Left + ImgDraw.Width) or
  1356.       (P.Y < Top + ImgDraw.Top) or
  1357.       (P.Y > Top + ImgDraw.Top + ImgDraw.Height) then
  1358.    begin
  1359.       With ImgDraw.Canvas do
  1360.       begin
  1361.         Pen.Mode :=pmCopy;
  1362.         Pen.Style:=psClear;
  1363.         Rectangle(0,0,ImgDraw.Width+1,ImgDraw.Height+1);
  1364.       end;
  1365.       ImgIndex:=-1;
  1366.       LastImgIndex:=-1;
  1367.       TimerTopBar.Enabled:=False;
  1368.    end;     }
  1369. end;
  1370. {------------------------------------------------------------------------------}
  1371. {
  1372. 功能:模拟Toolbar的按钮动作,MouseDown时显示为凹下状态
  1373. }
  1374. procedure TChatingForm.ImgAddNewMouseDown(Sender: TObject;
  1375.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1376. begin
  1377. {    With ImgDraw.Canvas do
  1378.     begin
  1379.       Pen.Mode :=pmCopy;
  1380.       Pen.Style:=psClear;
  1381.       Rectangle(0,0,ImgDraw.Width+1,ImgDraw.Height+1);
  1382.       Pen.Style:=psSolid;
  1383.       Pen.Color:=EndColor;
  1384.       Pen.Width:=1;
  1385.       MoveTo((Sender as TImage).Left-ImgDraw.Left,50);
  1386.       LineTo(PenPos.X,2);
  1387.       LineTo(PenPos.X+(Sender as TImage).Width,2);
  1388.       Pen.Color:=$00FEFEFE;
  1389.       LineTo(PenPos.X,50);
  1390.       LineTo(PenPos.X-(Sender as TImage).Width,50);
  1391.       Pen.Mode :=pmWhite;
  1392.       Pen.Style:=psSolid;
  1393.       //Rectangle((Sender as TImage).Left-ImgDraw.Left+1,3,(Sender as TImage).Left-ImgDraw.Left+(Sender as TImage).Width,50);
  1394.     end;
  1395.     ImgFontMouseDown(Sender,Button,Shift,X,Y);
  1396.     TimerTopBar.Enabled:=False;   }
  1397. end;
  1398. {------------------------------------------------------------------------------}
  1399. {
  1400. 功能:模拟Toolbar的按钮动作,MouseUp时显示为凸起状态
  1401. }
  1402. procedure TChatingForm.ImgAddNewMouseUp(Sender: TObject;
  1403.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1404. begin
  1405.  {     ImgFontMouseUp(Sender,Button,Shift,X,Y);
  1406.       With ImgDraw.Canvas do
  1407.       begin
  1408.       Pen.Mode :=pmCopy;
  1409.       Pen.Style:=psClear;
  1410.       Rectangle(0,0,ImgDraw.Width+1,ImgDraw.Height+1);
  1411.       Pen.Style:=psSolid;
  1412.       Pen.Color:=$00FEFEFE;
  1413.       Pen.Width:=1;
  1414.       MoveTo((Sender as TImage).Left-ImgDraw.Left,50);
  1415.       LineTo(PenPos.X,2);
  1416.       LineTo(PenPos.X+(Sender as TImage).Width,2);
  1417.       Pen.Color:=EndColor;
  1418.       LineTo(PenPos.X,50);
  1419.       LineTo(PenPos.X-(Sender as TImage).Width,50);
  1420.       Pen.Mode :=pmWhite;
  1421.       Pen.Style:=psSolid;
  1422.       //Rectangle((Sender as TImage).Left-ImgDraw.Left+1,3,(Sender as TImage).Left-ImgDraw.Left+(Sender as TImage).Width,50);
  1423.       end;
  1424.     TimerTopBar.Enabled:=True; }
  1425. end;
  1426. {------------------------------------------------------------------------------}
  1427. {
  1428. 功能:视频对话
  1429. }
  1430. procedure TChatingForm.ImgVideoClick(Sender: TObject);
  1431. var
  1432.   Receiver:Integer;
  1433.   ReceiverName:String;
  1434.   Form:TChatingForm;
  1435.   Room:ChatRoom;
  1436. begin
  1437.   if InGroupMsg=True then
  1438.   begin
  1439.       MessageBox(Handle,'群发消息状态下不能进行视频对话!','提示',MB_ICONINFORMATION);
  1440.       exit;
  1441.   end;
  1442.   RealMessengerX.TestVideoDevice();
  1443.   if TVUserList.Items.Count = 1 then
  1444.   begin
  1445.     if (not HaveVideoDevice) and (not PEmployee(TVUserList.Items.GetFirstNode.Data).HaveVideoDevice) then
  1446.     begin
  1447.       MessageBox(Handle,PChar('您和 '+String(PEmployee(TVUserList.Items.GetFirstNode.Data).Name)+' 的机器均没有安装视频捕获设备,不能开启网络摄像机功能'),'提示',MB_ICONINFORMATION);
  1448.       exit
  1449.     end;
  1450.     Receiver    :=PEmployee(TVUserList.Items.GetFirstNode.Data).ID;
  1451.     ReceiverName:=PEmployee(TVUserList.Items.GetFirstNode.Data).Name;
  1452.     Form        :=Self;
  1453.   end
  1454.   else
  1455.   begin
  1456.     if TVUserList.SelectionCount = 0 then
  1457.     begin
  1458.       MessageBox(Handle,'请先在“当前对话列表”中选择您要邀请的开始进行视频对话的人!','提示',MB_ICONINFORMATION);
  1459.       exit;
  1460.     end;
  1461.     if (not HaveVideoDevice) and (not PEmployee(TVUserList.Selected.Data).HaveVideoDevice) then
  1462.     begin
  1463.       MessageBox(Handle,PChar('您和 '+String(PEmployee(TVUserList.Selected.Data).Name)+' 的机器均没有安装视频捕获设备,不能开启网络摄像机功能'),'提示',MB_ICONINFORMATION);
  1464.       exit
  1465.     end;
  1466.     Receiver    :=PEmployee(TVUserList.Selected.Data).ID;
  1467.     ReceiverName:=PEmployee(TVUserList.Selected.Data).Name;
  1468.     Room.UserCount:=2;
  1469.     Room.Users[1] :=Me.ID;
  1470.     Room.Users[2] :=Receiver;
  1471.     Form:=OpenChatingForm(Room);
  1472.     Form.Show;
  1473.   end;
  1474.   TVideoHandShake.Create(vhRequest,Receiver,ReceiverName,Form,'',0,'',0,'',0,'',0);
  1475. end;
  1476. {------------------------------------------------------------------------------}
  1477. {
  1478. 功能:音频对话
  1479. }
  1480. procedure TChatingForm.ImgVoiceClick(Sender: TObject);
  1481. var
  1482.   Receiver:Integer;
  1483.   ReceiverName:String;
  1484.   Form:TChatingForm;
  1485.   Room:ChatRoom;
  1486. begin
  1487.   if InGroupMsg=True then
  1488.   begin
  1489.       MessageBox(Handle,'群发消息状态下不能进行音频对话!','提示',MB_ICONINFORMATION);
  1490.       exit;
  1491.   end;
  1492.   if not HaveAudioDevice then
  1493.   begin
  1494.     MessageBox(Handle,'您的机器没有安装声音设备,不能进行音频对话','提示',MB_ICONINFORMATION);
  1495.     exit
  1496.   end;
  1497.   if TVUserList.Items.Count = 1 then
  1498.   begin
  1499.     if not PEmployee(TVUserList.Items.GetFirstNode.Data).HaveAudioDevice then
  1500.     begin
  1501.       MessageBox(Handle,'对方的机器没有安装声音设备,不能进行音频对话','提示',MB_ICONINFORMATION);
  1502.       exit
  1503.     end;
  1504.     Receiver    :=PEmployee(TVUserList.Items.GetFirstNode.Data).ID;
  1505.     ReceiverName:=PEmployee(TVUserList.Items.GetFirstNode.Data).Name;
  1506.     Form        :=Self;
  1507.   end
  1508.   else
  1509.   begin
  1510.     if TVUserList.SelectionCount = 0 then
  1511.     begin
  1512.       MessageBox(Handle,'请先在“当前对话列表”中选择您要邀请的开始进行音频对话的人!','提示',MB_ICONINFORMATION);
  1513.       exit;
  1514.     end;
  1515.     if not PEmployee(TVUserList.Selected.Data).HaveAudioDevice then
  1516.     begin
  1517.       MessageBox(Handle,'对方的机器没有安装声音设备,不能进行音频对话','提示',MB_ICONINFORMATION);
  1518.       exit;
  1519.     end;
  1520.     Receiver    :=PEmployee(TVUserList.Selected.Data).ID;
  1521.     ReceiverName:=PEmployee(TVUserList.Selected.Data).Name;
  1522.     Room.UserCount:=2;
  1523.     Room.Users[1] :=Me.ID;
  1524.     Room.Users[2] :=Receiver;
  1525.     Form:=OpenChatingForm(Room);
  1526.     Form.Show;
  1527.   end;
  1528.   TAudioHandShake.Create(ahRequest,Receiver,ReceiverName,Form,'',0,'',0);
  1529. end;
  1530. {------------------------------------------------------------------------------}
  1531. procedure TChatingForm.SetDOMStyle(Doc:IHTMLDocument2);
  1532. var
  1533.   v: Variant;
  1534.   TempReg:TRegistry;
  1535. begin
  1536.   v := VarArrayCreate([0, 0], varVariant);
  1537.   v[0] := '<body oncontextmenu="location.href=''PopMenu'';return false;"></body>';
  1538.   doc.write(PSafeArray(TVarData(v).VArray));
  1539.   try
  1540.       CssColor:='#'+Copy(IntToHex(EndColor,6),5,2)+Copy(IntToHex(EndColor,6),3,2)+Copy(IntToHex(EndColor,6),1,2);
  1541.   except
  1542.   end;
  1543.   Doc.body.style.cssText:='SCROLLBAR-FACE-COLOR:'+CssColor+';'+
  1544.   'SCROLLBAR-HIGHLIGHT-COLOR: ButtonHighLight;'+
  1545.   'SCROLLBAR-SHADOW-COLOR:ButtonShadow;'+
  1546.   'SCROLLBAR-ARROW-COLOR: #333333;'+
  1547.   'SCROLLBAR-3DLIGHT-COLOR:'+CssColor+';'+
  1548.   'SCROLLBAR-TRACK-COLOR:'+CssColor+';'+
  1549.   'SCROLLBAR-DARKSHADOW-COLOR:'+CssColor+';'+
  1550.   'word-break:break-all;'+
  1551.         'background-attachment: fixed;'+
  1552.         'background-repeat: no-repeat;'+
  1553.         'background-position: left top;';
  1554.   Doc.body.style.overflow:='auto';
  1555.   Doc.body.style.border:='0px solid';
  1556.   Doc.body.style.margin:='2px';
  1557.   Doc.body.style.fontFamily:='宋体';
  1558.   Doc.body.style.fontSize:='9pt';
  1559.   TempReg:=TRegistry.Create;
  1560.   try
  1561.     TempReg.RootKey:=HKEY_LOCAL_MACHINE;
  1562.     if TempReg.OpenKey(AppKey+''+LoginName+'ChatingFormStore', True) then
  1563.     begin
  1564.         Doc.body.style.backgroundImage:='url('+TempReg.ReadString('BackGroundImage')+')';
  1565.     end;
  1566.   finally
  1567.     TempReg.Free;
  1568.   end;
  1569. end;
  1570. {------------------------------------------------------------------------------}
  1571. procedure TChatingForm.SetBrowserStyle();
  1572. begin
  1573.   SetDOMStyle(MsgContent.Document as IHTMLDocument2);
  1574. end;
  1575. {------------------------------------------------------------------------------}
  1576. procedure TChatingForm.SetBrowserBg(Url:String);
  1577. var
  1578.   TempReg:TRegistry;
  1579. begin
  1580.     TempReg:=TRegistry.Create;
  1581.     try
  1582.       TempReg.RootKey:=HKEY_LOCAL_MACHINE;
  1583.       if TempReg.OpenKey(AppKey+''+LoginName+'ChatingFormStore', True) then
  1584.       begin
  1585.         TempReg.WriteString('BackGroundImage',Url);
  1586.         SetBrowserStyle();
  1587.       end;
  1588.     finally
  1589.       TempReg.Free;
  1590.     end;
  1591. end;
  1592. {------------------------------------------------------------------------------}
  1593. {
  1594. 功能:选择表情图标
  1595. }
  1596. procedure TChatingForm.ImgSelFaceClick(Sender: TObject);
  1597. begin
  1598.   if SelFaceForm=nil then
  1599.   begin
  1600.         SelFaceForm:=TSelFaceForm.Create(Self);
  1601.         SelFaceForm.ParentForm:=Self;
  1602.         SelFaceForm.Show;
  1603.   end;
  1604. end;
  1605. {------------------------------------------------------------------------------}
  1606. {
  1607. 功能:模拟Toolbar的按钮动作,MouseMove时显示为凸起状态
  1608. }
  1609. procedure TChatingForm.ImgFontMouseMove(Sender: TObject;
  1610.   Shift: TShiftState; X, Y: Integer);
  1611. begin
  1612.     ImgIndex:=(Sender as TImage).Tag;
  1613.     if ImgIndex=LastImgIndex then exit;
  1614.     With ImgBottomDraw.Canvas do
  1615.     begin
  1616.       Pen.Mode :=pmCopy;
  1617.       Pen.Style:=psClear;
  1618.       Rectangle(0,0,ImgBottomDraw.Width+1,ImgBottomDraw.Height+1);
  1619.       Pen.Style:=psSolid;
  1620.       Pen.Color:=$00FEFEFE;
  1621.       Pen.Width:=1;
  1622.       MoveTo((Sender as TImage).Left-ImgBottomDraw.Left,21);
  1623.       LineTo(PenPos.X,2);
  1624.       LineTo(PenPos.X+(Sender as TImage).Width,2);
  1625.       Pen.Color:=$00AAAAAA;
  1626.       LineTo(PenPos.X,21);
  1627.       LineTo(PenPos.X-(Sender as TImage).Width,21);
  1628.       Refresh;
  1629.     end;
  1630.     LastImgIndex:=ImgIndex;
  1631.     TimerBottomBar.Enabled:=True;
  1632. end;
  1633. {------------------------------------------------------------------------------}
  1634. {
  1635. 功能:检查Mouse是否还在指定的区域之内,如不在则复位按钮状态
  1636. }
  1637. procedure TChatingForm.TimerBottomBarTimer(Sender: TObject);
  1638. var
  1639.    p : TPoint;
  1640. begin
  1641.    GetCursorPos(p);
  1642.    if (P.X < Left + PnlLeftBottom.Left + ImgBottomDraw.Left) or
  1643.       (P.X > Left + PnlLeftBottom.Left + ImgBottomDraw.Left + ImgBottomDraw.Width) or
  1644.       (P.Y < Top + PnlLeftBottom.Top + ImgBottomDraw.Top) or
  1645.       (P.Y > Top + PnlLeftBottom.Top + ImgBottomDraw.Top + ImgBottomDraw.Height) then
  1646.    begin
  1647.       With ImgBottomDraw.Canvas do
  1648.       begin
  1649.         Pen.Mode :=pmCopy;
  1650.         Pen.Style:=psClear;
  1651.         Rectangle(0,0,ImgBottomDraw.Width+1,ImgBottomDraw.Height+1);
  1652.       end;
  1653.       ImgIndex:=-1;
  1654.       LastImgIndex:=-1;
  1655.       TimerBottomBar.Enabled:=False;
  1656.    end;
  1657. end;
  1658. {------------------------------------------------------------------------------}
  1659. {
  1660. 功能:模拟Toolbar的按钮动作,MouseDown时显示为凸起状态
  1661. }
  1662. procedure TChatingForm.ImgSelBackMouseDown(Sender: TObject;
  1663.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1664. begin
  1665.     With ImgBottomDraw.Canvas do
  1666.     begin
  1667.       Pen.Mode :=pmCopy;
  1668.       Pen.Style:=psClear;
  1669.       Rectangle(0,0,ImgBottomDraw.Width+1,ImgBottomDraw.Height+1);
  1670.       Pen.Style:=psSolid;
  1671.       Pen.Color:=$00AAAAAA;
  1672.       Pen.Width:=1;
  1673.       MoveTo((Sender as TImage).Left-ImgBottomDraw.Left,21);
  1674.       LineTo(PenPos.X,2);
  1675.       LineTo(PenPos.X+(Sender as TImage).Width,2);
  1676.       Pen.Color:=$00FEFEFE;
  1677.       LineTo(PenPos.X,21);
  1678.       LineTo(PenPos.X-(Sender as TImage).Width,21);
  1679.       Refresh;
  1680.     end;
  1681.     ImgFontMouseDown(Sender,Button,Shift,X,Y);
  1682.     TimerBottomBar.Enabled:=False;
  1683. end;
  1684. {------------------------------------------------------------------------------}
  1685. {
  1686. 功能:模拟Toolbar的按钮动作,MouseUp时显示为凹下状态
  1687. }
  1688. procedure TChatingForm.ImgSelBackMouseUp(Sender: TObject;
  1689.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1690. begin
  1691.     ImgFontMouseUp(Sender,Button,Shift,X,Y);
  1692.     With ImgBottomDraw.Canvas do
  1693.     begin
  1694.       Pen.Mode :=pmCopy;
  1695.       Pen.Style:=psClear;
  1696.       Rectangle(0,0,ImgBottomDraw.Width+1,ImgBottomDraw.Height+1);
  1697.       Pen.Style:=psSolid;
  1698.       Pen.Color:=$00FEFEFE;
  1699.       Pen.Width:=1;
  1700.       MoveTo((Sender as TImage).Left-ImgBottomDraw.Left,21);
  1701.       LineTo(PenPos.X,2);
  1702.       LineTo(PenPos.X+(Sender as TImage).Width,2);
  1703.       Pen.Color:=$00AAAAAA;
  1704.       LineTo(PenPos.X,21);
  1705.       LineTo(PenPos.X-(Sender as TImage).Width,21);
  1706.       Refresh;
  1707.     end;
  1708.     TimerBottomBar.Enabled:=True;
  1709. end;
  1710. {------------------------------------------------------------------------------}
  1711. {
  1712. 功能:选择背景
  1713. }
  1714. procedure TChatingForm.ImgSelBackClick(Sender: TObject);
  1715. begin
  1716.   if SelBackForm=nil then
  1717.   begin
  1718.         SelBackForm:=TSelBackForm.Create(Self);
  1719.         SelBackForm.ParentForm:=Self;
  1720.         SelBackForm.Show;
  1721.   end;
  1722. end;
  1723. {------------------------------------------------------------------------------}
  1724. {
  1725. 功能:调整输入框的高度(MouseMove事件)
  1726. }
  1727. procedure TChatingForm.PnlSpplitMouseMove(Sender: TObject; Shift: TShiftState;
  1728.   X, Y: Integer);
  1729. var
  1730.   OT:Integer;
  1731. begin
  1732.   if Not CanMove Then exit;
  1733.   if (PnlLeftTop.Height+(PnlSpplit.Top-OldTop)<145) and (PnlSpplit.Top>PnlSpplit.Top+(Y-OY)) then exit;
  1734.   if (PnlLeftBottom.Height+(OldTop-PnlSpplit.Top)<118) and (PnlSpplit.Top<PnlSpplit.Top+(Y-OY)) then exit;
  1735.   OT:=PnlSpplit.Top;
  1736.   PnlSpplit.Top:=PnlSpplit.Top+(Y-OY);
  1737.   if (PnlSpplit.Top<80) or (PnlSpplit.Top>Height-120) then PnlSpplit.Top:=OT
  1738. end;
  1739. {------------------------------------------------------------------------------}
  1740. {
  1741. 功能:调整输入框的高度(MouseDown事件)
  1742. }
  1743. procedure TChatingForm.PnlSpplitMouseDown(Sender: TObject;
  1744.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1745. begin
  1746.   CanMove:=True;
  1747.   OX:=X;
  1748.   OY:=Y;
  1749.   OldTop:=PnlSpplit.Top;
  1750.   PnlSpplit.Color:=EndColor;
  1751. end;
  1752. {------------------------------------------------------------------------------}
  1753. {
  1754. 功能:调整输入框的高度(MouseUp事件)
  1755. }
  1756. procedure TChatingForm.PnlSpplitMouseUp(Sender: TObject;
  1757.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1758. begin
  1759.   if Not CanMove Then exit;
  1760.   PnlLeftTop.Height:=PnlLeftTop.Height+(PnlSpplit.Top-OldTop);
  1761.   PnlLeftBottom.Top:=PnlLeftTop.Top+PnlLeftTop.Height+3;
  1762.   PnlRightBottom.Top:=PnlLeftBottom.Top;
  1763.   PnlMyCamera.Top:=PnlLeftBottom.Top;
  1764.   PnlLeftBottom.Height:=PnlLeftBottom.Height+(OldTop-PnlSpplit.Top);
  1765.   PnlRightBottom.Height:=PnlRightBottom.Height+(OldTop-PnlSpplit.Top);
  1766.   FormResize(nil);
  1767.   CanMove:=False;
  1768.   PnlSpplit.ParentColor:=true;
  1769. end;
  1770. {复制}
  1771. procedure TChatingForm.Copy1Click(Sender: TObject);
  1772. var
  1773.   wb:IOleCommandTarget;
  1774.   hr:HRESULT;
  1775.   vv: olevariant;
  1776. begin
  1777.   //Copy 复制
  1778.   try
  1779.     //MsgContent.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_PROMPTUSER);
  1780.   MsgContent.document.QueryInterface(IOleCommandTarget,wb);
  1781.   if(wb=nil) then exit;
  1782.   hr:=wb.Exec(@CGID_MSHTML,15,OLECMDEXECOPT_DODEFAULT,EmptyParam,vv);
  1783.   except
  1784.   end;
  1785. end;
  1786. {全选}
  1787. procedure TChatingForm.SelectAll1Click(Sender: TObject);
  1788. begin
  1789.   //Select All 全选
  1790.   try
  1791.     MsgContent.ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_PROMPTUSER);
  1792.   except
  1793.   end;
  1794. end;
  1795. {------------------------------------------------------------------------------}
  1796. procedure TChatingForm.MsgContentBeforeNavigate2(Sender: TObject;
  1797.   const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  1798.   Headers: OleVariant; var Cancel: WordBool);
  1799. const
  1800.   hUrl = 'about:blank';
  1801. var
  1802.   NewUrl:String;
  1803.   BaseID:String;
  1804.   TransmitFile:TTransmitFile;
  1805.   AudioHandShake:TAudioHandShake;
  1806.   VideoHandShake:TVideoHandShake;
  1807.   function GetBaseIDFromUrl(SrcUrl:String):String;
  1808.   begin
  1809.     result:=Copy(SrcUrl,AnsiPos('_',SrcUrl)+1,Length(SrcUrl));
  1810.   end;
  1811. begin
  1812.   NewUrl:=Trim(AnsiReplaceStr(String(URL),hUrl,''));
  1813.   if AnsiSameText(NewUrl , 'PopMenu') then
  1814.   begin
  1815.     Cancel:=True;
  1816.     WebPopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
  1817.     exit;
  1818.   end;
  1819.   if AnsiSameText(Copy(NewUrl,1,8) , 'TFCancel') then
  1820.   begin
  1821.     Cancel:=True;
  1822.     BaseID:=GetBaseIDFromUrl(NewUrl);
  1823.     TransmitFile:=FindTransmitFileByBaseID(BaseID);
  1824.     if TransmitFile<>nil then TransmitFile.Cancel;
  1825.     exit;
  1826.   end;
  1827.   if AnsiSameText(Copy(NewUrl,1,8) , 'TFAccept') then
  1828.   begin
  1829.     Cancel:=True;
  1830.     BaseID:=GetBaseIDFromUrl(NewUrl);
  1831.     TransmitFile:=FindTransmitFileByBaseID(BaseID);
  1832.     if TransmitFile<>nil then TransmitFile.Accept;
  1833.     exit;
  1834.   end;
  1835.   if AnsiSameText(Copy(NewUrl,1,9) , 'TFdecline') then
  1836.   begin
  1837.     Cancel:=True;
  1838.     BaseID:=GetBaseIDFromUrl(NewUrl);
  1839.     TransmitFile:=FindTransmitFileByBaseID(BaseID);
  1840.     if TransmitFile<>nil then TransmitFile.Decline;
  1841.     exit;
  1842.   end;
  1843.   if AnsiSameText(Copy(NewUrl,1,6) , 'TFStop') then
  1844.   begin
  1845.     Cancel:=True;
  1846.     BaseID:=GetBaseIDFromUrl(NewUrl);
  1847.     TransmitFile:=FindTransmitFileByBaseID(BaseID);
  1848.     if TransmitFile<>nil then TransmitFile.Stop(Me.ID);
  1849.     exit;
  1850.   end;
  1851.   if AnsiSameText(Copy(NewUrl,1,7) , 'File://') then
  1852.   begin
  1853.     Cancel:=True;
  1854.     BaseID:=AnsiReplaceStr(GetBaseIDFromUrl(NewUrl),'%20',' ');
  1855.     ShellExecute(handle, 'open', PChar(BaseID), nil, nil, SW_SHOWNORMAL);
  1856.     exit;
  1857.   end;
  1858.   if AnsiSameText(Copy(NewUrl,1,8) , 'AHCancel') then
  1859.   begin
  1860.     Cancel:=True;
  1861.     BaseID:=GetBaseIDFromUrl(NewUrl);
  1862.     AudioHandShake:=FindAudioHandShakeByBaseID(BaseID);
  1863.     if AudioHandShake<>nil then AudioHandShake.Cancel;
  1864.     exit;
  1865.   end;
  1866.   if AnsiSameText(Copy(NewUrl,1,9) , 'AHdecline') then
  1867.   begin
  1868.     Cancel:=True;
  1869.     BaseID:=GetBaseIDFromUrl(NewUrl);
  1870.     AudioHandShake:=FindAudioHandShakeByBaseID(BaseID);
  1871.     if AudioHandShake<>nil then AudioHandShake.Decline;
  1872.     exit;
  1873.   end;
  1874.   if AnsiSameText(Copy(NewUrl,1,8) , 'AHAccept') then
  1875.   begin
  1876.     Cancel:=True;
  1877.     BaseID:=GetBaseIDFromUrl(NewUrl);
  1878.     AudioHandShake:=FindAudioHandShakeByBaseID(BaseID);
  1879.     if AudioHandShake<>nil then AudioHandShake.Accept;
  1880.     exit;
  1881.   end;
  1882.   if AnsiSameText(Copy(NewUrl,1,6) , 'AHStop') then
  1883.   begin
  1884.     Cancel:=True;
  1885.     LblQuitAudioClick(nil);
  1886.     exit;
  1887.   end;
  1888.   if AnsiSameText(Copy(NewUrl,1,8) , 'VHCancel') then
  1889.   begin
  1890.     Cancel:=True;
  1891.     BaseID:=GetBaseIDFromUrl(NewUrl);
  1892.     VideoHandShake:=FindVideoHandShakeByBaseID(BaseID);
  1893.     if VideoHandShake<>nil then VideoHandShake.Cancel;
  1894.     exit;
  1895.   end;
  1896.   if AnsiSameText(Copy(NewUrl,1,9) , 'VHdecline') then
  1897.   begin
  1898.     Cancel:=True;
  1899.     BaseID:=GetBaseIDFromUrl(NewUrl);
  1900.     VideoHandShake:=FindVideoHandShakeByBaseID(BaseID);
  1901.     if VideoHandShake<>nil then VideoHandShake.Decline;
  1902.     exit;
  1903.   end;
  1904.   if AnsiSameText(Copy(NewUrl,1,8) , 'VHAccept') then
  1905.   begin
  1906.     Cancel:=True;
  1907.     BaseID:=GetBaseIDFromUrl(NewUrl);
  1908.     VideoHandShake:=FindVideoHandShakeByBaseID(BaseID);
  1909.     if VideoHandShake<>nil then VideoHandShake.Accept;
  1910.     exit;
  1911.   end;
  1912.   if AnsiSameText(Copy(NewUrl,1,6) , 'VHStop') then
  1913.   begin
  1914.     Cancel:=True;
  1915.     LblQuitAudioClick(nil);
  1916.     exit;
  1917.   end;
  1918. end;
  1919. {------------------------------------------------------------------------------}
  1920. procedure TChatingForm.WebPopupMenuPopup(Sender: TObject);
  1921. begin
  1922.   //Edit Menu 编辑菜单
  1923.   if MsgContent.OleObject.Document.queryCommandEnabled('Copy') then
  1924.     Copy1.Enabled := True
  1925.   else
  1926.     Copy1.Enabled := False;
  1927. end;
  1928. {OnActivate事件}
  1929. procedure TChatingForm.FormActivate(Sender: TObject);
  1930. begin
  1931.   ActiveChatingForm:=Self;
  1932. end;
  1933. {OnDeactivate事件}
  1934. procedure TChatingForm.FormDeactivate(Sender: TObject);
  1935. begin
  1936.   ActiveChatingForm:=nil;
  1937. end;
  1938. {------------------------------------------------------------------------------}
  1939. procedure TChatingForm.MMMixerSliderInChange(Sender: TObject);
  1940. var
  1941.    hexString:String;
  1942.    rVALUE, bVALUE, gVALUE: integer;
  1943.    hNewVALUE, sNewVALUE, lNewVALUE  : Double;
  1944. begin
  1945.     hexString:=IntToHex(EndColor,6);
  1946.     RGBtoHSL(StrToInt('$'+Copy(hexString,5,2)), StrToInt('$'+Copy(hexString,3,2)), StrToInt('$'+Copy(hexString,1,2)), hNewVALUE, sNewVALUE, lNewVALUE);
  1947.     HSLtorgb(hNewVALUE, sNewVALUE,90-30*((Sender as TMMMixerSlider).Position/(Sender as TMMMixerSlider).MaxValue), rVALUE, gVALUE, bVALUE);
  1948.     (Sender as TMMMixerSlider).Color:=TColor(bVALUE*256*256+gVALUE*256+rVALUE);
  1949. end;
  1950. {------------------------------------------------------------------------------}
  1951. {
  1952. 功能:开启/关闭麦克风
  1953. }
  1954. procedure TChatingForm.ImgMicClick(Sender: TObject);
  1955. begin
  1956.   ImgMicDisabled.Visible:=not ImgMicDisabled.Visible;
  1957.   if ImgMicDisabled.Visible then
  1958.     ACMWaveIn.Close
  1959.   else
  1960.     ACMWaveIn.Open(PWaveFormatEx(pwfx),MMMixerDevice1.DeviceID);
  1961. end;
  1962. {------------------------------------------------------------------------------}
  1963. {
  1964. 功能:开启/关闭扬声器
  1965. }
  1966. procedure TChatingForm.ImgSpkClick(Sender: TObject);
  1967. begin
  1968.   ImgSpkDisabled.Visible:=not ImgSpkDisabled.Visible;
  1969.   if ImgMicDisabled.Visible then
  1970.     ACMWaveOut.Close
  1971.   else
  1972.     ACMWaveOut.Open(PWaveFormatEx(pwfx),MMMixerDevice2.DeviceID);
  1973. end;
  1974. {------------------------------------------------------------------------------}
  1975. {
  1976. 功能:结束音频对话
  1977. }
  1978. procedure TChatingForm.LblQuitAudioClick(Sender: TObject);
  1979. var
  1980.   iLoop:Integer;
  1981.   AudioHandShake:TAudioHandShake;
  1982.   VideoHandShake:TVideoHandShake;
  1983. begin
  1984.   with AudioHandShakes.LockList do
  1985.   try
  1986.     for iLoop:=Count - 1 downto 0 do
  1987.     begin
  1988.       AudioHandShake:=Items[iLoop];
  1989.       if AudioHandShake.ChatingForm = Self then
  1990.       begin
  1991.         AudioHandShake.Stop(Me.ID);
  1992.         Break;
  1993.       end;
  1994.     end;
  1995.   finally
  1996.     AudioHandShakes.UnlockList;
  1997.   end;
  1998.   with VideoHandShakes.LockList do
  1999.   try
  2000.     for iLoop:=Count - 1 downto 0 do
  2001.     begin
  2002.       VideoHandShake:=Items[iLoop];
  2003.       if VideoHandShake.ChatingForm = Self then
  2004.       begin
  2005.         VideoHandShake.Stop(Me.ID);
  2006.         Break;
  2007.       end;
  2008.     end;
  2009.   finally
  2010.     VideoHandShakes.UnlockList;
  2011.   end;
  2012. end;
  2013. {------------------------------------------------------------------------------}
  2014. procedure TChatingForm.MsgContentDocumentComplete(Sender: TObject;
  2015.   const pDisp: IDispatch; var URL: OleVariant);
  2016. begin
  2017.   try
  2018.     SetDomStyle(MsgContent.Document as IHtmlDocument2 );
  2019.     MsgContent.OnDocumentComplete:=nil;
  2020.   except
  2021.   end;
  2022. end;
  2023. {------------------------------------------------------------------------------}
  2024. procedure TChatingForm.ImgSelColorClick(Sender: TObject);
  2025. begin
  2026.   if SelColorForm=nil then
  2027.   begin
  2028.         SelColorForm:=TSelColorForm.Create(Self);
  2029.         SelColorForm.ParentForm:=Self;
  2030.         SelColorForm.Show;
  2031.   end;
  2032. end;
  2033. {按钮被按下}
  2034. procedure TChatingForm.ImgSendTypeMouseDown(Sender: TObject;
  2035.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  2036. begin
  2037.   ImgListSendType.GetBitmap(1,ImgSendType.Picture.Bitmap);
  2038.   ConvertBitmapToColor(ImgSendType.Picture.Bitmap,EndColor);
  2039.   ImgSendType.Refresh;
  2040. end;
  2041. {恢复按钮的初始状态}
  2042. procedure TChatingForm.ImgSendTypeMouseUp(Sender: TObject;
  2043.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  2044. begin
  2045.   ImgListSendType.GetBitmap(0,ImgSendType.Picture.Bitmap);
  2046.   ConvertBitmapToColor(ImgSendType.Picture.Bitmap,EndColor);
  2047.   ImgSendType.Refresh;
  2048. end;
  2049. {------------------------------------------------------------------------------}
  2050. procedure TChatingForm.ImgSendTypeClick(Sender: TObject);
  2051. begin
  2052.   SendTypePopupMenu.Popup(Left+ImgSendType.Left+ImgSendType.Width+4,Top+ImgSendType.Top+3);
  2053. end;
  2054. procedure TChatingForm.TMEnterClick(Sender: TObject);
  2055. var
  2056.   TempReg:TRegistry;
  2057. begin
  2058.     TempReg:=TRegistry.Create;
  2059.     try
  2060.       TempReg.RootKey:=HKEY_LOCAL_MACHINE;
  2061.       if TempReg.OpenKey(AppKey+''+LoginName+'ChatingFormStore', True) then
  2062.       begin
  2063.         TempReg.WriteString('SendType','Enter');
  2064.         TMEnter.Enabled:=False;
  2065.         TMCtrlEnter.Enabled:=True;
  2066.       end;
  2067.     finally
  2068.       TempReg.Free;
  2069.     end;
  2070. end;
  2071. procedure TChatingForm.TMCtrlEnterClick(Sender: TObject);
  2072. var
  2073.   TempReg:TRegistry;
  2074. begin
  2075.     TempReg:=TRegistry.Create;
  2076.     try
  2077.       TempReg.RootKey:=HKEY_LOCAL_MACHINE;
  2078.       if TempReg.OpenKey(AppKey+''+LoginName+'ChatingFormStore', True) then
  2079.       begin
  2080.         TempReg.WriteString('SendType','CtrlEnter');
  2081.         TMEnter.Enabled:=True;
  2082.         TMCtrlEnter.Enabled:=False;
  2083.       end;
  2084.     finally
  2085.       TempReg.Free;
  2086.     end;
  2087. end;
  2088. procedure TChatingForm.ImgGroupMsgClick(Sender: TObject);
  2089. var
  2090.   iLoop:Integer;
  2091.   Employee1:PEmployee;
  2092. begin
  2093. {  if InGroupMsg=True then
  2094.   begin
  2095.     TVUserList.Items.Clear;
  2096.     InGroupMsg:=False;
  2097.     ShowTitle(True);
  2098.     Exit;
  2099.   end;
  2100.   if AudioIsOn then
  2101.   begin
  2102.       MessageBox(Handle,'当前窗口已打开音频对话任务,不能群发消息!','提示',MB_ICONINFORMATION);
  2103.       exit;
  2104.   end;
  2105.   if VideoIsOn then
  2106.   begin
  2107.       MessageBox(Handle,'当前窗口已打开视频对话任务,不能群发消息!','提示',MB_ICONINFORMATION);
  2108.       exit;
  2109.   end;
  2110.   SelUserForm:=TSelUserForm.Create(Application);
  2111.   try
  2112.     if SelUserForm.ShowModal = mrOk then
  2113.     begin
  2114.       TVUserList.Items.Clear;
  2115.       for iLoop:=0 to SelUserForm.TrevUserList.Items.Count-1 do
  2116.       begin
  2117.         if (SelUserForm.TrevUserList.Items[iLoop].ImageIndex<6) or (SelUserForm.TrevUserList.Items[iLoop].ImageIndex>13)  then continue;
  2118.         if IsNodeChecked(SelUserForm.TrevUserList.Items[iLoop])=False then continue;
  2119.         Employee1:=PEmployee(SelUserForm.TrevUserList.Items[iLoop].Data);
  2120.         if Employee1.ID<>Me.ID then
  2121.         with TVUserList.Items.AddChild(nil,Employee1.Node.Text) do
  2122.         begin
  2123.           ImageIndex:=7;
  2124.           SelectedIndex:=ImageIndex;
  2125.           StateIndex:=Employee1.ID;
  2126.         end;
  2127.       end;
  2128.       if TVUserList.Items.Count>0 then
  2129.         InGroupMsg:=True
  2130.       else
  2131.         InGroupMsg:=False;
  2132.       ShowTitle();
  2133.     end;
  2134.   finally
  2135.     SelUserForm.Free;
  2136.     SelUserForm:=nil;
  2137.   end;    }
  2138.   if TVUserList.Items.Count > 1 then exit;
  2139.   if HistoryForm<>nil then HistoryForm.Close;
  2140.   HistoryForm:=THistoryForm.Create(Application);
  2141.   if IsSystemMsg then
  2142.   begin
  2143.     HistoryForm.ID:=-1;
  2144.     HistoryForm.Name:='系统消息';
  2145.   end
  2146.   else
  2147.   begin
  2148.     HistoryForm.ID:=PEmployee(TVUserList.Items.GetFirstNode.Data).ID;
  2149.     HistoryForm.Name:=PEmployee(TVUserList.Items.GetFirstNode.Data).Name;
  2150.   end;
  2151.   HistoryForm.Show;
  2152. end;
  2153. procedure TChatingForm.TVUserListGetImageIndex(Sender: TObject;
  2154.   Node: TTreeNode);
  2155. begin
  2156. {  if InGroupMsg then exit;
  2157.   if Node.StateIndex = -1 then
  2158.   begin
  2159.       if Node.Expanded then
  2160.         Node.ImageIndex:=4
  2161.       else
  2162.         Node.ImageIndex:=5;
  2163.   end;
  2164.   if Node.StateIndex = 0 then
  2165.   begin
  2166.       if Node.Expanded then
  2167.         Node.ImageIndex:=1
  2168.       else
  2169.         Node.ImageIndex:=0;
  2170.   end;
  2171.   if Node.StateIndex = 1 then
  2172.   begin
  2173.       if Node.Expanded then
  2174.         Node.ImageIndex:=3
  2175.       else
  2176.         Node.ImageIndex:=2;
  2177.   end;      
  2178.   Node.SelectedIndex:=Node.ImageIndex;}
  2179. end;
  2180. procedure TChatingForm.ApplicationEvents1Message(var Msg: tagMSG;
  2181.   var Handled: Boolean);
  2182. var
  2183.   nFiles, I,j: Integer;
  2184.   Filename,DragFilename: string;
  2185.   Receiver:Integer;
  2186.   ReceiverName:String;
  2187.   Form:TChatingForm;
  2188.   Room:ChatRoom;
  2189. begin
  2190.   if (Msg.message = WM_DROPFILES) then
  2191.   begin
  2192.     if InGroupMsg=True then
  2193.     begin
  2194.       MessageBox(Handle,'群发消息状态下不能进行文件传输!','提示',MB_ICONINFORMATION);
  2195.       exit;
  2196.     end;
  2197.     if TVUserList.Items.Count = 1 then
  2198.     begin
  2199.       Receiver    :=PEmployee(TVUserList.Items.GetFirstNode.Data).ID;
  2200.       ReceiverName:=PEmployee(TVUserList.Items.GetFirstNode.Data).Name;
  2201.       Form        :=Self;
  2202.     end
  2203.     else
  2204.     begin
  2205.       if TVUserList.SelectionCount = 0 then
  2206.       begin
  2207.         MessageBox(Handle,'请先在 当前对话列表 中选择收件人!','提示',MB_ICONINFORMATION);
  2208.         exit;
  2209.       end;
  2210.       Receiver    :=PEmployee(TVUserList.Selected.Data).ID;
  2211.       ReceiverName:=PEmployee(TVUserList.Selected.Data).Name;
  2212.       Room.UserCount:=2;
  2213.       Room.Users[1] :=Me.ID;
  2214.       Room.Users[2] :=Receiver;
  2215.       Form:=OpenChatingForm(Room);
  2216.       Form.Show;
  2217.     end;
  2218.     
  2219.     nFiles := DragQueryFile (Msg.wParam, $FFFFFFFF, nil, 0);
  2220.     try
  2221.       if nFiles>1 then nFiles:=1;
  2222.       for I := 0 to nFiles - 1 do
  2223.       begin
  2224.         SetLength (Filename, 255);
  2225.         DragQueryFile (Msg.wParam, I, PChar (Filename), 255);
  2226.         for j:=1 to 255 do
  2227.         begin
  2228.           if Ord(Filename[j])>0 then
  2229.           begin
  2230.             SetLength (DragFilename, j);
  2231.             DragFilename[j]:=Filename[j];
  2232.           end
  2233.           else
  2234.             Break;
  2235.         end;
  2236.         TTransmitFile.Create(tfSend,Me.ID,Me.Name,Receiver,ReceiverName,DragFilename,Form,'',0,'',0);
  2237.       end;
  2238.     finally
  2239.       DragFinish (Msg.wParam);
  2240.       Handled := True;
  2241.     end;
  2242.   end;
  2243.   
  2244.   if CopyScreenForm<>nil then exit;
  2245.   if msg.message<>wm_keydown then exit;
  2246.   if (GetKeyState(VK_CONTROL)<0) and (msg.hwnd<>MsgInput.Handle) then
  2247.   begin
  2248.     if (msg.wParam=Ord('C')) and MsgContent.OleObject.Document.queryCommandEnabled('Copy') then Copy1Click(nil);
  2249.     if msg.wParam=Ord('A') then SelectAll1Click(nil);
  2250.   end;
  2251. end;
  2252. procedure TChatingForm.X1Click(Sender: TObject);
  2253. begin
  2254.   if TMCtrlEnter.Checked then ImgSendClick(ImgSend);
  2255. end;
  2256. procedure TChatingForm.X2Click(Sender: TObject);
  2257. begin
  2258.   if TMEnter.Checked then
  2259.     ImgSendClick(ImgSend)
  2260.   else if MsgInput.Focused then
  2261.   begin
  2262.     MsgInput.SelText:=#13#10;
  2263.     MsgInput.SelStart:=MsgInput.SelStart+1;
  2264.     MsgInput.SelLength:=0;
  2265.   end;
  2266. end;
  2267. procedure TChatingForm.MsgInputMouseDown(Sender: TObject;
  2268.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  2269. begin
  2270.   if Button=mbRight then PopupMenuEdit.Popup(Left+PnlLeftBottom.Left+X,Top+PnlLeftBottom.Top+MsgInput.Top+Y);
  2271. end;
  2272. procedure TChatingForm.VideoCapVideoStream(sender: TObject;
  2273.   lpVhdr: PVIDEOHDR);
  2274. begin
  2275.   CompareFrame(lpVhdr);
  2276. end;
  2277. procedure TChatingForm.AviPanelOutDblClick(Sender: TObject);
  2278. var
  2279.   VideoHandShake:TVideoHandShake;
  2280. begin
  2281.   if VideoForm=nil then
  2282.   begin
  2283.     VideoHandShake:=FindVideoHandShakeByID(PEmployee(TVUserList.Items.GetFirstNode.Data).ID);
  2284.     if VideoHandShake<>nil then
  2285.     begin
  2286.       VideoForm:=TVideoForm.Create(Self);
  2287.       VideoForm.VideoHandShake:=VideoHandShake;
  2288.       VideoHandShake.PDC:=GetDC(VideoForm.Handle);
  2289.       VideoForm.ChatingForm:=Self;
  2290.       VideoForm.Show;
  2291.     end;
  2292.   end;
  2293. end;
  2294. procedure TChatingForm.ACMWaveInData(data: Pointer; size: Integer);
  2295. var
  2296.   CBAudio:TCBAudio;
  2297.   Buffer:Array[1..2048]of char;
  2298. begin
  2299.   //Self.Caption:=IntToStr(size);
  2300.   if AudioReceiverID = 0 then exit;
  2301.   CBAudio.Receiver:=AudioReceiverID;
  2302.   CBAudio.Sender:=Me.ID;
  2303.   CopyMemory(@(CBAudio.lpData),data,size);
  2304.   CBAudio.dwBufferLength:=size;
  2305.   Buffer[1]:=skAudio;
  2306.   CopyMemory(@Buffer[2],@CBAudio,SizeOf(CBAudio));
  2307.   AudioMySocket.SendBuffer(Buffer,SizeOf(CBAudio)+1);{发送语音}
  2308. end;
  2309. procedure TChatingForm.CopyScreen;
  2310. var
  2311.   Fullscreen:Tbitmap;
  2312.   FullscreenCanvas:TCanvas;
  2313.   dc:HDC;
  2314.   TransmitFile:TTransmitFile;
  2315.   iLoop,TFCount:Integer;
  2316. begin
  2317.   if InGroupMsg=True then
  2318.   begin
  2319.       MessageBox(Handle,'群发消息状态下不能进行截屏操作!','提示',MB_ICONINFORMATION);
  2320.       exit;
  2321.   end;
  2322.   if TVUserList.Items.Count > 1 then
  2323.   begin
  2324.     MessageBox(Handle,'多人模式下不能进行截屏操作','提示',MB_ICONINFORMATION);
  2325.     exit
  2326.   end;
  2327.   if PEmployee(TVUserList.Items.GetFirstNode.Data).State='断开' then
  2328.   begin
  2329.     MessageBox(Handle,'对方不在线,不能进行截屏操作','提示',MB_ICONINFORMATION);
  2330.     exit
  2331.   end;
  2332.   TFCount:=0;
  2333.   with TransmitFiles.LockList do
  2334.   try
  2335.     for iLoop:=0 to Count - 1 do
  2336.     begin
  2337.       TransmitFile:=Items[iLoop];
  2338.       if (TransmitFile.SenderID = Me.ID) and (TransmitFile.ReceiverID = PEmployee(TVUserList.Items.GetFirstNode.Data).ID) and (TransmitFile.IsAccepted=True) then
  2339.       begin
  2340.         if TransmitFile.IsScreen then
  2341.         begin
  2342.           messagebox(Handle,'请先等待前一张图片传输完毕!','提示',MB_ICONINFORMATION);
  2343.           exit;
  2344.         end;
  2345.         Inc(TFCount);
  2346.         if TFCount>=3 then
  2347.         begin
  2348.           messagebox(Handle,'在其它文件或图片发送完毕之前,您不能进行截屏操作!','提示',MB_ICONINFORMATION);
  2349.           exit;
  2350.         end;
  2351.       end;
  2352.     end;
  2353.   finally
  2354.     TransmitFiles.UnlockList;
  2355.   end;
  2356.   CopyScreenForm:=TCopyScreenForm.Create(Self);
  2357.   Fullscreen := TBitmap.Create;      
  2358.   Fullscreen.Width := screen.width;
  2359.   Fullscreen.Height := screen.Height;
  2360.   DC := GetDC (0);                   
  2361.   FullscreenCanvas := TCanvas.Create;
  2362.   FullscreenCanvas.Handle := DC;
  2363.   Fullscreen.Canvas.CopyRect
  2364.       (Rect (0, 0, screen.Width, screen.Height), fullscreenCanvas,
  2365.       Rect (0, 0, Screen.Width, Screen.Height));
  2366.   FullscreenCanvas.Free;         
  2367.   ReleaseDC (0, DC);
  2368.   CopyScreenForm.ImgScreen.picture.Bitmap:=fullscreen;
  2369.   CopyScreenForm.Width:=fullscreen.Width;
  2370.   CopyScreenForm.Height:=fullscreen.Height;
  2371.   fullscreen.free;                        
  2372.   CopyScreenForm.ParentForm:=Self;
  2373.   CopyScreenForm.Show;
  2374. end;
  2375. procedure TChatingForm.ImgCopyScreenClick(Sender: TObject);
  2376. begin
  2377.   CopyScreenTypePopupMenu.Popup(Left+PnlLeftBottom.Left+ImgCopyScreen.Left+3,Top+PnlLeftBottom.Top+ImgCopyScreen.Top+ImgCopyScreen.Height+3);
  2378. end;
  2379. procedure TChatingForm.MDirectCopyScreenClick(Sender: TObject);
  2380. begin
  2381.   CopyScreenTimer.Enabled:=True;
  2382. end;
  2383. procedure TChatingForm.MCopyScreenAfterMinWindowClick(Sender: TObject);
  2384. begin
  2385.   ShowWindow(Handle,SW_HIDE);
  2386.   CopyScreenTimer.Enabled:=True;
  2387. end;
  2388. procedure TChatingForm.CopyScreenTimerTimer(Sender: TObject);
  2389. begin
  2390.   CopyScreenTimer.Enabled:=False;
  2391.   CopyScreen;
  2392.   if CopyScreenForm=nil then ShowWindow(Handle,SW_SHOW);
  2393. end;
  2394. procedure TChatingForm.lblTitleClick(Sender: TObject);
  2395. begin
  2396.   if WindowState = wsNormal then
  2397.   begin
  2398.     WindowState := wsMaximized;
  2399.     Left:=0;
  2400.     Top:=0;
  2401.     Width:=Screen.WorkAreaWidth;
  2402.     Height:=Screen.WorkAreaHeight;
  2403.   end
  2404.   else
  2405.   begin
  2406. //    ImgListMax.GetBitmap(0,ImgMax.Picture.Bitmap);
  2407.     WindowState := wsNormal;
  2408.   end;
  2409. //  ConvertBitmapToColor(ImgMax.Picture.Bitmap,EndColor);
  2410. //  ImgMax.Refresh;
  2411. end;
  2412. procedure TChatingForm.TVUserListClick(Sender: TObject);
  2413. begin
  2414.   if TVUserList.selected <> nil then
  2415.     TVUserList.selected.imageindex:=TVUserList.selected.imageindex;
  2416.     //showmessage(inttostr(TVUserList.selected.imageindex));
  2417. end;
  2418. procedure TChatingForm.fcImageBtn3Click(Sender: TObject);
  2419. var
  2420.   Receiver:Integer;
  2421.   ReceiverName:String;
  2422.   Form:TChatingForm;
  2423.   Room:ChatRoom;
  2424. begin
  2425.   if InGroupMsg=True then
  2426.   begin
  2427.       MessageBox(Handle,'群发消息状态下不能进行文件传输!','提示',MB_ICONINFORMATION);
  2428.       exit;
  2429.   end;
  2430.   if TVUserList.Items.Count = 1 then
  2431.   begin
  2432.     Receiver    :=PEmployee(TVUserList.Items.GetFirstNode.Data).ID;
  2433.     ReceiverName:=PEmployee(TVUserList.Items.GetFirstNode.Data).Name;
  2434.     Form        :=Self;
  2435.   end
  2436.   else
  2437.   begin
  2438.     if TVUserList.SelectionCount = 0 then
  2439.     begin
  2440.       MessageBox(Handle,'请先在 当前对话列表 中选择收件人!','提示',MB_ICONINFORMATION);
  2441.       exit;
  2442.     end;
  2443.     Receiver    :=PEmployee(TVUserList.Selected.Data).ID;
  2444.     ReceiverName:=PEmployee(TVUserList.Selected.Data).Name;
  2445.     Room.UserCount:=2;
  2446.     Room.Users[1] :=Me.ID;
  2447.     Room.Users[2] :=Receiver;
  2448.     Form:=OpenChatingForm(Room);
  2449.     Form.Show;
  2450.   end;
  2451.   OpenDialog.Title:='请选择要给 '+ReceiverName+' 发送的文件';
  2452.   if OpenDialog.Execute then
  2453.   begin
  2454.     TTransmitFile.Create(tfSend,Me.ID,Me.Name,Receiver,ReceiverName,OpenDialog.Files.Strings[0],Form,'',0,'',0);
  2455.   end;
  2456. end;
  2457. procedure TChatingForm.fcImageBtn2Click(Sender: TObject);
  2458. var
  2459.   ID:Integer;
  2460.   iLoop,jLoop:Integer;
  2461.   Finded:Boolean;
  2462.   CBAddUser:TCBAddUser;
  2463.   AddRoom:ChatRoom;
  2464.   Buffer:Array[1..2048]of char;
  2465. begin
  2466.   if InGroupMsg=True then
  2467.   begin
  2468.       MessageBox(Handle,'群发消息状态下不能进入多人模式!','提示',MB_ICONINFORMATION);
  2469.       exit;
  2470.   end;
  2471.   if AudioIsOn then
  2472.   begin
  2473.       MessageBox(Handle,'当前窗口已打开音频对话任务,不能进入多人模式!','提示',MB_ICONINFORMATION);
  2474.       exit;
  2475.   end;
  2476.   if VideoIsOn then
  2477.   begin
  2478.       MessageBox(Handle,'当前窗口已打开视频对话任务,不能进入多人模式!','提示',MB_ICONINFORMATION);
  2479.       exit;
  2480.   end;
  2481.   SelUserForm:=TSelUserForm.Create(Self);
  2482.   try
  2483.     if SelUserForm.ShowModal = mrOk then
  2484.     begin
  2485.       CBAddUser.Room.UserCount:=RoomInfo.UserCount;
  2486.       for iLoop:=1 to RoomInfo.UserCount do CBAddUser.Room.Users[iLoop]:=RoomInfo.Users[iLoop];
  2487.       AddRoom.UserCount:=0;
  2488.       for iLoop := 0 to SelUserForm.TrevUserList.Items.Count - 1 do
  2489.       begin
  2490.         if (SelUserForm.TrevUserList.Items[iLoop].ImageIndex<6) or (SelUserForm.TrevUserList.Items[iLoop].ImageIndex>13)  then continue;
  2491.         if IsNodeChecked(SelUserForm.TrevUserList.Items[iLoop])=False then continue;
  2492.         ID:=PEmployee(SelUserForm.TrevUserList.Items[iLoop].Data).ID;
  2493.         Finded:=False;
  2494.         for jLoop:=1 to RoomInfo.UserCount do
  2495.         begin
  2496.           if RoomInfo.Users[jLoop] = ID then
  2497.           begin
  2498.             Finded:=True;
  2499.             break;
  2500.           end;
  2501.         end;
  2502.         if not Finded then
  2503.         begin
  2504.           if RoomInfo.UserCount=16 then
  2505.           begin
  2506.             MessageBox(Handle,PChar('多人对话环境的最大收件人数不得超过 '+IntToStr(15)+' 个'),'提示',MB_OK);
  2507.             Break;
  2508.           end;
  2509.           AddRoom.UserCount:=AddRoom.UserCount+1;
  2510.           AddRoom.Users[AddRoom.UserCount]:=ID;
  2511.           RoomInfo.UserCount:=RoomInfo.UserCount+1;
  2512.           RoomInfo.Users[RoomInfo.UserCount]:=ID;
  2513.         end;
  2514.       end;
  2515.       if AddRoom.UserCount>0 then
  2516.       begin
  2517.         ImgHistory.Visible:=False;
  2518.         for jLoop:=1 to CBAddUser.Room.UserCount do
  2519.         begin
  2520.           if CBAddUser.Room.Users[jLoop]<>Me.ID then
  2521.           begin
  2522.             CBAddUser.Receiver:=CBAddUser.Room.Users[jLoop];
  2523.             CBAddUser.AddRoom:=AddRoom;
  2524.             Buffer[1]:=skAddUser;
  2525.             CopyMemory(@Buffer[2],@CBAddUser,SizeOf(CBAddUser));
  2526.             RealMessengerX.ClientTCP.WriteBuffer(Buffer,SizeOf(CBAddUser)+1);
  2527.           end;
  2528.         end;
  2529.       end;
  2530.     end;
  2531.   finally
  2532.     SelUserForm.Free;
  2533.     SelUserForm:=nil;
  2534.   end;
  2535.   ShowTitle();
  2536. end;
  2537. procedure TChatingForm.fcImageBtn4Click(Sender: TObject);
  2538. var
  2539.   Receiver:Integer;
  2540.   ReceiverName:String;
  2541.   Form:TChatingForm;
  2542.   Room:ChatRoom;
  2543. begin
  2544.   if InGroupMsg=True then
  2545.   begin
  2546.       MessageBox(Handle,'群发消息状态下不能进行音频对话!','提示',MB_ICONINFORMATION);
  2547.       exit;
  2548.   end;
  2549.   if not HaveAudioDevice then
  2550.   begin
  2551.     MessageBox(Handle,'您的机器没有安装声音设备,不能进行音频对话','提示',MB_ICONINFORMATION);
  2552.     exit
  2553.   end;
  2554.   if TVUserList.Items.Count = 1 then
  2555.   begin
  2556.     if not PEmployee(TVUserList.Items.GetFirstNode.Data).HaveAudioDevice then
  2557.     begin
  2558.       MessageBox(Handle,'对方的机器没有安装声音设备,不能进行音频对话','提示',MB_ICONINFORMATION);
  2559.       exit
  2560.     end;
  2561.     Receiver    :=PEmployee(TVUserList.Items.GetFirstNode.Data).ID;
  2562.     ReceiverName:=PEmployee(TVUserList.Items.GetFirstNode.Data).Name;
  2563.     Form        :=Self;
  2564.   end
  2565.   else
  2566.   begin
  2567.     if TVUserList.SelectionCount = 0 then
  2568.     begin
  2569.       MessageBox(Handle,'请先在“当前对话列表”中选择您要邀请的开始进行音频对话的人!','提示',MB_ICONINFORMATION);
  2570.       exit;
  2571.     end;
  2572.     if not PEmployee(TVUserList.Selected.Data).HaveAudioDevice then
  2573.     begin
  2574.       MessageBox(Handle,'对方的机器没有安装声音设备,不能进行音频对话','提示',MB_ICONINFORMATION);
  2575.       exit;
  2576.     end;
  2577.     Receiver    :=PEmployee(TVUserList.Selected.Data).ID;
  2578.     ReceiverName:=PEmployee(TVUserList.Selected.Data).Name;
  2579.     Room.UserCount:=2;
  2580.     Room.Users[1] :=Me.ID;
  2581.     Room.Users[2] :=Receiver;
  2582.     Form:=OpenChatingForm(Room);
  2583.     Form.Show;
  2584.   end;
  2585.   TAudioHandShake.Create(ahRequest,Receiver,ReceiverName,Form,'',0,'',0);
  2586. end;
  2587. procedure TChatingForm.fcImageBtn1Click(Sender: TObject);
  2588. var
  2589.   Receiver:Integer;
  2590.   ReceiverName:String;
  2591.   Form:TChatingForm;
  2592.   Room:ChatRoom;
  2593. begin
  2594.   if InGroupMsg=True then
  2595.   begin
  2596.       MessageBox(Handle,'群发消息状态下不能进行视频对话!','提示',MB_ICONINFORMATION);
  2597.       exit;
  2598.   end;
  2599.   RealMessengerX.TestVideoDevice();
  2600.   if TVUserList.Items.Count = 1 then
  2601.   begin
  2602.     if (not HaveVideoDevice) and (not PEmployee(TVUserList.Items.GetFirstNode.Data).HaveVideoDevice) then
  2603.     begin
  2604.       MessageBox(Handle,PChar('您和 '+String(PEmployee(TVUserList.Items.GetFirstNode.Data).Name)+' 的机器均没有安装视频捕获设备,不能开启网络摄像机功能'),'提示',MB_ICONINFORMATION);
  2605.       exit
  2606.     end;
  2607.     Receiver    :=PEmployee(TVUserList.Items.GetFirstNode.Data).ID;
  2608.     ReceiverName:=PEmployee(TVUserList.Items.GetFirstNode.Data).Name;
  2609.     Form        :=Self;
  2610.   end
  2611.   else
  2612.   begin
  2613.     if TVUserList.SelectionCount = 0 then
  2614.     begin
  2615.       MessageBox(Handle,'请先在“当前对话列表”中选择您要邀请的开始进行视频对话的人!','提示',MB_ICONINFORMATION);
  2616.       exit;
  2617.     end;
  2618.     if (not HaveVideoDevice) and (not PEmployee(TVUserList.Selected.Data).HaveVideoDevice) then
  2619.     begin
  2620.       MessageBox(Handle,PChar('您和 '+String(PEmployee(TVUserList.Selected.Data).Name)+' 的机器均没有安装视频捕获设备,不能开启网络摄像机功能'),'提示',MB_ICONINFORMATION);
  2621.       exit
  2622.     end;
  2623.     Receiver    :=PEmployee(TVUserList.Selected.Data).ID;
  2624.     ReceiverName:=PEmployee(TVUserList.Selected.Data).Name;
  2625.     Room.UserCount:=2;
  2626.     Room.Users[1] :=Me.ID;
  2627.     Room.Users[2] :=Receiver;
  2628.     Form:=OpenChatingForm(Room);
  2629.     Form.Show;
  2630.   end;
  2631.   TVideoHandShake.Create(vhRequest,Receiver,ReceiverName,Form,'',0,'',0,'',0,'',0);
  2632. end;
  2633. procedure TChatingForm.fcImageBtn5Click(Sender: TObject);
  2634. begin
  2635.   if TVUserList.Items.Count > 1 then exit;
  2636.   if HistoryForm<>nil then HistoryForm.Close;
  2637.   HistoryForm:=THistoryForm.Create(Application);
  2638.   if IsSystemMsg then
  2639.   begin
  2640.     HistoryForm.ID:=-1;
  2641.     HistoryForm.Name:='系统消息';
  2642.   end
  2643.   else
  2644.   begin
  2645.     HistoryForm.ID:=PEmployee(TVUserList.Items.GetFirstNode.Data).ID;
  2646.     HistoryForm.Name:=PEmployee(TVUserList.Items.GetFirstNode.Data).Name;
  2647.   end;
  2648.   HistoryForm.Show;
  2649. end;
  2650. procedure TChatingForm.Label1Click(Sender: TObject);
  2651. begin
  2652. fcImageBtn2.click;
  2653. end;
  2654. procedure TChatingForm.Label2Click(Sender: TObject);
  2655. begin
  2656. fcImageBtn3.click;
  2657. end;
  2658. procedure TChatingForm.Label3Click(Sender: TObject);
  2659. begin
  2660. fcImageBtn4.click;
  2661. end;
  2662. procedure TChatingForm.Label4Click(Sender: TObject);
  2663. begin
  2664. fcImageBtn1.click;
  2665. end;
  2666. procedure TChatingForm.Label5Click(Sender: TObject);
  2667. begin
  2668. fcImageBtn5.click;
  2669. end;
  2670. end.