最近在搞IM开发,现在遇到了一个问题,实现类似于qq多窗口聊天界面,也就是平常我们上qq跟多个用户聊天有多个聊天窗口.每个窗口对应一个好友,所有的收发消息都在对应的窗口里.我的思路是,创建了对话框指针数组ChatDlg m_ChatDlg[500]后,生成用户对应的对话框,到该对话框关闭时,向主对话框发一个WM_DECRECHATDLG 消息.以便排序.
//打开聊天窗口
void CMainDlg::OpenMsg()
{
int nCount=m_ChatDialogInfo.Count;
TRACE("nCount%d\n",nCount);
m_ChatDialog[nCount]=new CChatDialog(); //生成对话框
m_ChatDialog[nCount]->Create(IDD_CHAT_DIALOG,this->GetDesktopWindow());

m_ChatDialog[nCount]->SetDlgItemText(IDC_STATIC_NAME,strMsgName);
m_ChatDialog[nCount]->m_DestName=strMsgName;
m_ChatDialog[nCount]->m_SendJid=strMsgJid;
m_ChatDialog[nCount]->SetWindowText(strMsgName);
m_ChatDialog[nCount]->RedrawWindow();
m_ChatDialog[nCount]->ShowWindow(SW_SHOWNORMAL);
m_ChatDialog[nCount]->SetWindowPos(&wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
m_ChatDialog[nCount]->m_nPos=nCount;
m_ChatDialog[nCount]->SetHwnd(this->m_hWnd);

TRACE("Add ChatInfo\n");
m_ChatDialogInfo.ChatInfo[nCount].destjid=strMsgJid;
m_ChatDialogInfo.ChatInfo[nCount].destname=strMsgName;
m_ChatDialogInfo.Count+=1;
}
WM_DECRECHATDLG 消息响应函数
LRESULT CMainDlg::OnDecreChatDlg(WPARAM wParam,LPARAM lParam)
{
TRACE("OnDecreChatDlg\n");
    //CString   &sJid=(CString&)wParam;
TRACE("sJid nPos\n");
//unsigned int nPos=(unsigned int)lParam;
int nPos=theApp.nPos;
    TRACE(" nPos%d\n",nPos);
int posend=nPos;
   if(m_ChatDialogInfo.Count>1)
   {
   
for(int i=nPos;i<m_ChatDialogInfo.Count-1;i++)
{
  memcpy(m_ChatDialog[i],m_ChatDialog[i+1],sizeof(m_ChatDialog[i+1]));
  m_ChatDialogInfo.ChatInfo[i].destjid=m_ChatDialogInfo.ChatInfo[i+1].destjid;
  m_ChatDialogInfo.ChatInfo[i].destname=m_ChatDialogInfo.ChatInfo[i+1].destjid;
    
}
for(int j=nPos;j<m_ChatDialogInfo.Count;j++)
{
TRACE("替换后%s\n",m_ChatDialog[j]->m_DestName);
}

 posend=m_ChatDialogInfo.Count-1;   }
 
   if(m_ChatDialog[posend]!=NULL)
{
 TRACE("删除%d\n",posend);
 delete m_ChatDialog[posend];
     m_ChatDialog[posend]=NULL;
 m_ChatDialogInfo.Count-=1;
 TRACE("update nCount%d\n",m_ChatDialogInfo.Count);
}
      for(int n=0;n<m_ChatDialogInfo.Count;n++)
{
TRACE("显示%d",n);
TRACE("Update %s\n",m_ChatDialog[n]->m_DestName);
}

return 0;
}
我按顺序打开a,b,c三个用户聊天对话框,指针数组对应的m_ChatDialog[0],m_ChatDialog[1],m_ChatDialog[2].当把a对话框关闭时,b,c在指针数组的位置向前移一位.也就是m_ChatDialog[0]=m_ChatDialog[1],m_ChatDialog[1]=m_ChatDialog[2]. m_ChatDialog[3] 指针释放,以便下一次调用OpenMsg()创建。
当把对话框a关闭时,c也关闭了.现在问题是,如何在把c对应的对话框类复制到b类,也就是m_ChatDialog[2]里所有的资源都赋值给m_ChatDialog[1] ,而不是指针地址赋值.
请教高手,谢谢

解决方案 »

  1.   

    其实只要这个地址就可以访问他的所有资源,没有必要再把m_ChatDialog[2]里所有的资源都赋值给m_ChatDialog[1]。
      

  2.   

    感谢热心回复.
    把m_ChatDialog[2]里所有的资源都赋值给m_ChatDialog[1]的原因是在赋值,然后delete m_ChatDialog[2]。
    当需打开另一聊天窗口时,调用OpenMsg(),在指针数组m_ChatDialog[2]上创建对话框。
      

  3.   

    自己顶。
    如果要把把m_ChatDialog[2]里所有的资源都赋值给m_ChatDialog[1]该怎么办?
    谢谢。
      

  4.   

    你这样做系统开销会很较大的。
    如果要把把m_ChatDialog[2]里所有的资源都赋值给m_ChatDialog[1]:
    *m_chatDialog[1] = *m_ChatDialog[2];
    这样就可以了