快速业务通道

用C++Builder实现Windows 2000的Messenger

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

本文讲述了如何用C++Builder实现Messenger的详细方法,其中使用了如下技术:

1. 多线程序技术,防止界面出现死锁。

2. 使用了网络枚举来枚举在线的网络用户。

3. 使用了Unicode的转换函数进从AnsiString到Unicode的转换。

4. 使用了简单的不规则窗口的技术。

5. 自动安装,将自己加入系统起动中。

6. 系统托盘技术。

编程方法:

1. 如图所示在窗体上加入的有的控件:TListView,TTreeView,TMemo,菜单、托盘、按钮、状态栏

用C++Builder实现Windows 2000的Messenger

2. 针对各控件按本文所写加入代码即可。

3. 以下是发送函数

void __fastcall TFormMain::ButtonSendClick(TObject *Sender)
{
 AnsiString Message,UserName,FromName;
 TListItem *ListItem;
 if(CheckBoxAnony->Checked)FromName=EditAnony->Text;
 else FromName="";
 Message=Memo1->Text;
 if(Message==""){ShowMessage("Please Enter words to send");return;}
 if(!ListView1->SelCount){
  if(TreeView1->Selected==NULL){ShowMessage("Please select destnation");return;}
  UserName=TreeView1->Selected->Text;
  if(TreeView1->Selected->Level==1)UserName=UserName+"*";
  new NetMessageSend(false,UserName,FromName,Message,CheckBoxGetRet->Checked);
 return;
 }
 ListItem=ListView1->Selected;
 UserName=ListItem->Caption;
 if(TreeView1->Selected->Level==0)UserName+="*";
 while(UserName[1]==''\\'')UserName=UserName.SubString(2,UserName.Length()-1);
 new NetMessageSend(false,UserName,FromName,Message,CheckBoxGetRet->Checked);
 for(int i=1;iSelCount;i++){
 ListItem=ListView1->GetNextItem(ListItem,sdAll,TItemStates()<  UserName=ListItem->Caption;
 if(TreeView1->Selected->Level==0)UserName+="*";
 while(UserName[1]==''\\'')UserName=UserName.SubString(2,UserName.Length()-1);
 new NetMessageSend(false,UserName,FromName,Message,CheckBoxGetRet->Checked);
 }
}

以下是网络结点枚举函数,是个线程

bool __fastcall EnumNetResource::GetNetRes(TTreeNodes *Nodes,TTreeNode * Node,NETRESOURCE *pNetResource,int Depth)
{
#define ENUMBUFSIZE (16*1024)
#define ENUMCOUNT 10
NETRESOURCE buff[1024];
AnsiString UserName;
if(Terminated) return false;
if(Nodes==NULL) return false;
if(Depth==0) return true;
HANDLE hEnum;
bool reValue=true;
NETRESOURCE *pNetRes,NetRes;
if(WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,
pNetResource,&hEnum)!=NO_ERROR)return false;
DWORD ECount=ENUMCOUNT;
DWORD ESize=ENUMBUFSIZE;
DWORD Error_num;
do{
Error_num=WNetEnumResource(hEnum,&ECount,buff,&ESize);
if (ESize>ENUMBUFSIZE) return false;
if (Error_num==NO_ERROR){
for (DWORD num=0;num if(Terminated)return false;
pNetRes=&buff[num];
file://if(Node)Node->ImageIndex=1-Depth;
UserName=AnsiString(pNetRes->lpRemoteName);
while(UserName[1]==''\\'')
UserName=UserName.SubString(2,UserName.Length()-1);
TTreeNode *tNode=Nodes->AddChild(Node,UserName);
if(tNode)
switch(pNetRes->dwType){
case RESOURCETYPE_ANY:
switch(tNode->Level){
case 0:tNode->ImageIndex=1;break;
case 1:
case 2:tNode->ImageIndex=2;break;
}
break;
case RESOURCETYPE_DISK:tNode->ImageIndex

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号