MainBordDlg.cpp
上传用户:onsales
上传日期:2010-01-31
资源大小:224k
文件大小:17k
源码类别:

网络编程

开发平台:

Visual C++

  1. // MainBordDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MainBord.h"
  5. #include "MainBordDlg.h"
  6. #include "Message.h"
  7. #include "AddFreind.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CAboutDlg dialog used for App About
  15. class CAboutDlg : public CDialog
  16. {
  17. public:
  18. CAboutDlg();
  19. // Dialog Data
  20. //{{AFX_DATA(CAboutDlg)
  21. enum { IDD = IDD_ABOUTBOX };
  22. //}}AFX_DATA
  23. // ClassWizard generated virtual function overrides
  24. //{{AFX_VIRTUAL(CAboutDlg)
  25. protected:
  26. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  27. //}}AFX_VIRTUAL
  28. // Implementation
  29. protected:
  30. //{{AFX_MSG(CAboutDlg)
  31. //}}AFX_MSG
  32. DECLARE_MESSAGE_MAP()
  33. };
  34. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  35. {
  36. //{{AFX_DATA_INIT(CAboutDlg)
  37. //}}AFX_DATA_INIT
  38. }
  39. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  40. {
  41. CDialog::DoDataExchange(pDX);
  42. //{{AFX_DATA_MAP(CAboutDlg)
  43. //}}AFX_DATA_MAP
  44. }
  45. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  46. //{{AFX_MSG_MAP(CAboutDlg)
  47. // No message handlers
  48. //}}AFX_MSG_MAP
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CMainBordDlg dialog
  52. CMainBordDlg::CMainBordDlg(CWnd* pParent /*=NULL*/)
  53. : CDialog(CMainBordDlg::IDD, pParent)
  54. {
  55. //{{AFX_DATA_INIT(CMainBordDlg)
  56. //}}AFX_DATA_INIT
  57. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  58. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  59. }
  60. void CMainBordDlg::DoDataExchange(CDataExchange* pDX)
  61. {
  62. CDialog::DoDataExchange(pDX);
  63. //{{AFX_DATA_MAP(CMainBordDlg)
  64. DDX_Control(pDX, IDC_FriendLIST, m_FriendList);
  65. //}}AFX_DATA_MAP
  66. }
  67. BEGIN_MESSAGE_MAP(CMainBordDlg, CDialog)
  68. //{{AFX_MSG_MAP(CMainBordDlg)
  69. ON_WM_SYSCOMMAND()
  70. ON_WM_PAINT()
  71. ON_WM_QUERYDRAGICON()
  72. ON_BN_CLICKED(IDC_AddBTN, OnAddBTN)
  73. ON_BN_CLICKED(IDC_StartBTN, OnStartBTN)
  74. ON_LBN_DBLCLK(IDC_FriendLIST, OnDblclkFriendLIST)
  75. ON_BN_CLICKED(IDC_PhoneBTN, OnPhoneBTN)
  76. ON_BN_CLICKED(IDC_SendFileBTN, OnSendFileBTN)
  77. ON_BN_CLICKED(IDC_HIDEBTN, OnHidebtn)
  78. ON_MESSAGE(TESTWM_NOTIFYICON,OnTestNotifyIcon)
  79. ON_COMMAND(ID_SUBMENU1,OnSubmenu1)
  80. ON_COMMAND(ID_SUBMENU2,OnSubmenu2)
  81. //}}AFX_MSG_MAP
  82. ON_MESSAGE(WM_CLIENT_READCLOSE,OnRead)
  83. ON_MESSAGE(WM_CLIENT_ACCEPT,OnAccept)
  84. END_MESSAGE_MAP()
  85. /////////////////////////////////////////////////////////////////////////////
  86. // CMainBordDlg message handlers
  87. BOOL CMainBordDlg::OnInitDialog()
  88. {
  89. CDialog::OnInitDialog();
  90. // Add "About..." menu item to system menu.
  91. // IDM_ABOUTBOX must be in the system command range.
  92. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  93. ASSERT(IDM_ABOUTBOX < 0xF000);
  94. CMenu* pSysMenu = GetSystemMenu(FALSE);
  95. if (pSysMenu != NULL)
  96. {
  97. CString strAboutMenu;
  98. strAboutMenu.LoadString(IDS_ABOUTBOX);
  99. if (!strAboutMenu.IsEmpty())
  100. {
  101. pSysMenu->AppendMenu(MF_SEPARATOR);
  102. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  103. }
  104. }
  105. // Set the icon for this dialog.  The framework does this automatically
  106. //  when the application's main window is not a dialog
  107. SetIcon(m_hIcon, TRUE); // Set big icon
  108. SetIcon(m_hIcon, FALSE); // Set small icon
  109. m_FriendList.SetItemHeight( 0, 18 );
  110. start=NULL;
  111. last=NULL;
  112. // TODO: Add extra initialization here
  113. GetIP_Name();
  114. strcpy(lpszTipBefore,"QQ "+IPName);
  115. (CEdit *)GetDlgItem(IDC_AddBTN)->EnableWindow(FALSE);
  116. (CEdit *)GetDlgItem(IDC_MSGBTN)->EnableWindow(FALSE);
  117. (CEdit *)GetDlgItem(IDC_PhoneBTN)->EnableWindow(FALSE);
  118. (CEdit *)GetDlgItem(IDC_SendFileBTN)->EnableWindow(FALSE);
  119. return TRUE;  // return TRUE  unless you set the focus to a control
  120. }
  121. void CMainBordDlg::OnSysCommand(UINT nID, LPARAM lParam)
  122. {
  123. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  124. {
  125. CAboutDlg dlgAbout;
  126. dlgAbout.DoModal();
  127. }
  128. else
  129. {
  130. CDialog::OnSysCommand(nID, lParam);
  131. }
  132. }
  133. // If you add a minimize button to your dialog, you will need the code below
  134. //  to draw the icon.  For MFC applications using the document/view model,
  135. //  this is automatically done for you by the framework.
  136. void CMainBordDlg::OnPaint() 
  137. {
  138. if (IsIconic())
  139. {
  140. CPaintDC dc(this); // device context for painting
  141. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  142. // Center icon in client rectangle
  143. int cxIcon = GetSystemMetrics(SM_CXICON);
  144. int cyIcon = GetSystemMetrics(SM_CYICON);
  145. CRect rect;
  146. GetClientRect(&rect);
  147. int x = (rect.Width() - cxIcon + 1) / 2;
  148. int y = (rect.Height() - cyIcon + 1) / 2;
  149. // Draw the icon
  150. dc.DrawIcon(x, y, m_hIcon);
  151. }
  152. else
  153. {
  154. CDialog::OnPaint();
  155. }
  156. }
  157. // The system calls this to obtain the cursor to display while the user drags
  158. //  the minimized window.
  159. HCURSOR CMainBordDlg::OnQueryDragIcon()
  160. {
  161. return (HCURSOR) m_hIcon;
  162. }
  163. void CMainBordDlg::OnAddBTN() 
  164. {
  165. // TODO: Add your control notification handler code here
  166. AddFreind mydlg;
  167. if(mydlg.DoModal() == IDOK)
  168. {
  169. if(mydlg.ipstr.GetLength()==0)
  170. {
  171. MessageBox("您没有输入IP地址!!!","错误信息",NULL);
  172. return;
  173. }
  174. ip=mydlg.ipstr;
  175. }
  176. else return;
  177. WSADATA wsaData;
  178.     if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL
  179.          WSACleanup();
  180.          return;
  181. }
  182. tempSocket=socket(PF_INET,SOCK_STREAM,0);    //创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信
  183.     if(tempSocket == INVALID_SOCKET)
  184. {
  185.          return;
  186. }
  187. DWORD dwip;
  188. if((dwip=inet_addr(ip))==INADDR_NONE)
  189. {
  190. MessageBox("IP赋值错误","错误信息");
  191. return;
  192. }
  193.     tempSocketAddr.sin_family=AF_INET; //使用TCP/IP协议
  194.     tempSocketAddr.sin_port = htons(8001);
  195. tempSocketAddr.sin_addr.S_un.S_addr = dwip;
  196. if(connect(tempSocket,(LPSOCKADDR)&tempSocketAddr,sizeof(tempSocketAddr)) == SOCKET_ERROR)
  197.     {
  198.     MessageBox("对方不在线","添加失败",NULL);
  199.         return;
  200. }
  201. else
  202. {
  203. msg.sign=6;
  204. strcpy(msg.msg,IPName);
  205. }
  206. if(send(tempSocket,(char *)&msg,sizeof(msg),0)==SOCKET_ERROR)
  207. {
  208. MessageBox("发送消息失败","错误信息",MB_OK);
  209. return;
  210. }
  211. }
  212. void CMainBordDlg::OnStartBTN() 
  213. {
  214. // TODO: Add your control notification handler code here
  215. (CEdit *)GetDlgItem(IDC_AddBTN)->EnableWindow(TRUE);
  216. (CEdit *)GetDlgItem(IDC_MSGBTN)->EnableWindow(TRUE);
  217. (CEdit *)GetDlgItem(IDC_PhoneBTN)->EnableWindow(TRUE);
  218. (CEdit *)GetDlgItem(IDC_SendFileBTN)->EnableWindow(TRUE);
  219. WSADATA wsaData;
  220.     int iErrorCode;
  221.     if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL
  222.          WSACleanup();
  223.          return;
  224. }
  225. //m_List.InsertString(0,"服务器开始创建SOCKET。");
  226. ServerSocket=socket(PF_INET,SOCK_STREAM,0);    //创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信
  227.     if(ServerSocket == INVALID_SOCKET)
  228. {
  229.          //m_List.InsertString(0,"无法创建服务器socket!");
  230.          return;
  231. }
  232.     m_sockServerAddr.sin_family = AF_INET;
  233.     m_sockServerAddr.sin_addr.s_addr = INADDR_ANY;   //向所有的IP地址发送消息
  234.     m_sockServerAddr.sin_port = htons(8001);
  235.     if (bind(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,sizeof(m_sockServerAddr)) == SOCKET_ERROR) //与选定的端口绑定
  236.     {
  237.     //m_List.InsertString(0,"无法绑定服务器。");
  238.         return;
  239. }
  240.     iErrorCode=WSAAsyncSelect(ServerSocket,m_hWnd,WM_CLIENT_ACCEPT,FD_ACCEPT);
  241.          // 产生相应传递给窗口的消息为WM_SERVER_ACCEPT ,这是自定义消息
  242.     if (iErrorCode == SOCKET_ERROR) 
  243. {
  244.          return;
  245. }
  246.     if (listen(ServerSocket,1) == SOCKET_ERROR) //开始监听客户连接请求
  247. {
  248. //m_List.InsertString(0,"服务器监听失败!");
  249.         return;
  250. }
  251. IsTrue = TRUE;
  252.   //m_List.AddString("服务器绑定监听成功。");
  253.     return; 
  254. }
  255. void CMainBordDlg::OnDblclkFriendLIST() 
  256. {
  257. // TODO: Add your control notification handler code here
  258. if(IsTrue!=TRUE)return;//未登录
  259. int index=m_FriendList.GetCurSel();
  260. if(index!=LB_ERR)
  261. {
  262. CString strname;
  263. m_FriendList.GetText(index,strname);
  264. FriendList *s;
  265. s=start;
  266. while(s!=NULL&&strcmp(s->name,strname)!=0)
  267. {
  268. s=s->next;
  269. }
  270. if(s==NULL){MessageBox("没找到!");return;}
  271. CString ipstr;
  272. ipstr.Format("%s",s->IP);
  273. CString a;
  274. a="0#"+ipstr+"#"+strname+"#";
  275. CFile myfile;
  276. myfile.Open("msg.txt",CFile::modeCreate | CFile::modeWrite);
  277. myfile.Write( a, a.GetLength()); 
  278. myfile.Close();
  279. //MessageBox(a);
  280. WinExec("Talk.exe",SW_SHOW);
  281. }
  282. }
  283. LRESULT CMainBordDlg::OnRead(WPARAM wParam, LPARAM lParam)
  284. {
  285. if(!IsTrue)
  286. {
  287. //m_List.InsertString(0,"有数据到达,但是没有工作站连接。");
  288. }
  289. CString str;
  290. switch (WSAGETSELECTEVENT(lParam))
  291. {
  292. case FD_READ:
  293. if(recv(Client,(char *)&msg,sizeof(msg),0) == SOCKET_ERROR)
  294. {
  295. // m_List.InsertString(0,"接收数据发生错误。");
  296. return 0;
  297. }
  298. SelectWay();
  299. //m_History_List.InsertString(0,str);
  300. //MessageBox(str);
  301. break;
  302. case FD_CLOSE:
  303. str = _T("工作站退出。");
  304. //m_List.InsertString(0,str);
  305. closesocket(Client);
  306. //IsTrue = FALSE;
  307. break;
  308. }
  309. return 0L;
  310. }
  311. LRESULT CMainBordDlg::OnAccept(WPARAM wParam, LPARAM lParam)
  312. {
  313. if (WSAGETSELECTERROR(lParam))
  314. {
  315. //m_List.InsertString(0,"Error detected on entry into OnServerAccept.");
  316. return 0L;
  317. }
  318. if(WSAGETSELECTEVENT(lParam) == FD_ACCEPT)//如果
  319. {
  320.     Client = accept(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,0);
  321.     if (Client == INVALID_SOCKET)
  322. {
  323. //m_List.InsertString(0,"Server socket failed to accept connection.");
  324. return 0L;
  325. }
  326. //Clinet
  327. WSAAsyncSelect(Client,m_hWnd,WM_CLIENT_READCLOSE,FD_READ|FD_CLOSE);
  328. IsTrue = TRUE;
  329. }
  330. //m_List.InsertString(0,"有客户机连接上了服务器。");
  331. return 0L;
  332. }
  333. void CMainBordDlg::OnPhoneBTN() 
  334. {
  335. // TODO: Add your control notification handler code here
  336. if(IsTrue!=TRUE)return;//未登录
  337. int index=m_FriendList.GetCurSel();
  338. if(index!=LB_ERR)
  339. {
  340. CString strname;
  341. m_FriendList.GetText(index,strname);
  342. FriendList *s;
  343. s=start;
  344. while(s!=NULL&&strcmp(s->name,strname)!=0)
  345. {
  346. s=s->next;
  347. }
  348. if(s==NULL){MessageBox("没找到!");return;}
  349. CString ipstr;
  350. msg.sign=2;
  351. ipstr.Format("%s",s->IP);
  352. ip=ipstr;
  353. SystemMessage=IPName+"#"+HostName+"#";
  354. // MessageBox("here!!!");
  355. SendMsg();
  356. }
  357. }
  358. void CMainBordDlg::OnSendFileBTN() 
  359. {
  360. // TODO: Add your control notification handler code here
  361. int index=m_FriendList.GetCurSel();
  362. if(index!=LB_ERR)
  363. {//先发送对方是否接收
  364. CString strname;
  365. m_FriendList.GetText(index,strname);
  366. FriendList *s;
  367. s=start;
  368. while(s!=NULL&&strcmp(s->name,strname)!=0)
  369. {
  370. s=s->next;
  371. }
  372. if(s==NULL){MessageBox("没找到!");return;}
  373. CString ipstr;
  374. ipstr.Format("%s",s->IP);
  375. ip=ipstr;//目标IP
  376. SystemMessage=IPName+"#"+HostName+"#";
  377. msg.sign=4;
  378. SendMsg();
  379. }
  380. }
  381. void CMainBordDlg::SelectWay()
  382. {
  383. FriendList *newlist=new struct FriendList;
  384. CString strIP,strName,temp;//添加新成员
  385. CString message;
  386. int i,j=0;
  387. i=msg.sign;
  388. message.Format("%d#%s",msg.sign,msg.msg);
  389. // MessageBox("here!!!");
  390. // MessageBox(message);
  391. CFile myfile;
  392. switch(i)
  393. {
  394. case 1://别人跟你聊天
  395. myfile.Open("msg.txt",CFile::modeCreate | CFile::modeWrite);
  396. myfile.Write(message, message.GetLength()); 
  397. myfile.Close(); 
  398. WinExec("Talk.exe",SW_SHOW);break;
  399. case 2:
  400. j=0;
  401. temp="";
  402. ip="";
  403. while(msg.msg[j]!='#'){ip+=msg.msg[j];j++;}j++;
  404. // MessageBox(ip);
  405. while(msg.msg[j]!='#'){temp+=msg.msg[j];j++;}
  406. if((MessageBox(temp+"请求网络聊天","请求信息",IDOK))!=1)
  407.    {
  408.    return;
  409.    }
  410. myfile.Open("voice.txt",CFile::modeCreate | CFile::modeWrite);
  411. myfile.Write( message, message.GetLength()); 
  412. myfile.Close();
  413. SystemMessage=IPName+"#"+HostName+"#";
  414. msg.sign=3;
  415. SendMsg();WinExec("Speak.exe",SW_SHOW);
  416. break;
  417. case 3://别人接受聊天请求
  418. message.Format("3#%s",msg.msg);
  419. myfile.Open("voice.txt",CFile::modeCreate | CFile::modeWrite);
  420. myfile.Write( message, message.GetLength()); 
  421. myfile.Close();
  422. //MessageBox("here!!");
  423. WinExec("Speak.exe",SW_SHOW);break;
  424. case 4: //别人问你是否同意接收传送文件
  425. j=0;
  426. temp="";
  427. ip="";
  428. while(msg.msg[j]!='#'){ip+=msg.msg[j];j++;}j++;
  429. // MessageBox(ip);
  430. while(msg.msg[j]!='#'){temp+=msg.msg[j];j++;}
  431. if((MessageBox(temp+"向你传送文件,你是否同意接收?","请求信息",IDOK))!=1)
  432.    {
  433.    return;
  434.    }
  435. //同意接收,发送反馈消息
  436. message.Format("5#%s",msg.msg);//变成被动接收文件
  437. myfile.Open("file.txt",CFile::modeCreate | CFile::modeWrite);
  438. myfile.Write( message, message.GetLength()); 
  439. myfile.Close();
  440. SystemMessage=IPName+"#"+HostName+"#";
  441. msg.sign=5;
  442. SendMsg();
  443. WinExec("FileTransfer.exe",SW_SHOW);
  444. break;
  445. case 5: message.Format("4#%s",msg.msg);//别人同意接收文件,主动传送文件
  446. myfile.Open("file.txt",CFile::modeCreate | CFile::modeWrite);
  447. myfile.Write( message, message.GetLength()); 
  448. myfile.Close();
  449.     WinExec("FileTransfer.exe",SW_SHOW);break;
  450. break;//接收文件
  451. case 6:message.Format("%s",msg.msg);
  452. // MessageBox(message);
  453. if((MessageBox(message+"请求你通过身份验证","请求信息",IDOK))!=1)
  454.    {
  455. //MessageBox("here!!!");   
  456. return;
  457.    }
  458. ip=message;//同意加为好友
  459. SystemMessage=IPName+"#"+HostName+"#";
  460. msg.sign=7;
  461. SendMsg();
  462. break;
  463. case 7://MessageBox(message);
  464. message.Format("%s",msg.msg);
  465. // MessageBox(message);
  466. strIP="";
  467. strName="";
  468. j=0;
  469. while(msg.msg[j]!='#')
  470. {
  471. strIP+=msg.msg[j];
  472. j++;
  473. }
  474. j++;
  475. while(msg.msg[j]!='#')
  476. {
  477. strName+=msg.msg[j];
  478. j++;
  479. }
  480. for(j=0;j<m_FriendList.GetCount();j++)
  481. {
  482. m_FriendList.GetText(j,temp);
  483. if(strcmp(strName,temp)==0)
  484. {MessageBox("你已经添加了这个成员","错误信息",NULL);
  485. return;}
  486. }
  487. strcpy(newlist->IP,strIP);
  488. strcpy(newlist->name,strName);
  489. newlist->next=NULL;
  490. if(start==NULL){start=newlist;last=newlist;}
  491. else{
  492. last->next=newlist;
  493. last=newlist;
  494. }
  495. m_FriendList.AddString(strName);
  496. MessageBox(strName+"通过你的身份验证!!!","验证信息",NULL);
  497. UpdateData(TRUE);break;
  498. default:break;
  499. }
  500. }
  501. void CMainBordDlg::GetIP_Name()//获得IP和主机名
  502. {
  503. WORD wVersionRequested;
  504. WSADATA wsaData;
  505. char hostname[128];
  506. CString strip;
  507. PHOSTENT hostinfo;
  508. wVersionRequested=MAKEWORD(2,0);
  509. if(WSAStartup(wVersionRequested,&wsaData)==0)
  510. {
  511. if(gethostname(hostname,sizeof(hostname))==0)
  512. {
  513. if((hostinfo=gethostbyname(hostname))!=NULL)
  514. {
  515. strip=inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list);
  516. }
  517. }
  518. WSACleanup();
  519. }
  520. IPName=strip;
  521. HostName.Format("%s",hostname);
  522. }
  523. void CMainBordDlg::SendMsg()//接受或发送系统请求信息
  524. {
  525. WSADATA wsaData;
  526.     if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL
  527.          WSACleanup();
  528.          return;
  529. }
  530. tempSocket=socket(PF_INET,SOCK_STREAM,0);    //创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信
  531.     if(tempSocket == INVALID_SOCKET)
  532. {
  533.          return;
  534. }
  535. DWORD dwip;
  536. if((dwip=inet_addr(ip))==INADDR_NONE)
  537. {
  538. MessageBox("IP赋值错误","错误信息");
  539. return;
  540. }
  541.     tempSocketAddr.sin_family=AF_INET; //使用TCP/IP协议
  542.     tempSocketAddr.sin_port = htons(8001);
  543. tempSocketAddr.sin_addr.S_un.S_addr = dwip;
  544. if(connect(tempSocket,(LPSOCKADDR)&tempSocketAddr,sizeof(tempSocketAddr)) == SOCKET_ERROR)
  545.     {
  546.     MessageBox("对方不在线","失败信息",NULL);
  547.         return;
  548. }
  549. strcpy(msg.msg,SystemMessage);
  550. if(send(tempSocket,(char *)&msg,sizeof(msg),0)==SOCKET_ERROR)
  551. {
  552. MessageBox("发送消息失败","错误信息",MB_OK);
  553. return;
  554. }
  555. }
  556. void CMainBordDlg::OnHidebtn() 
  557. {
  558. // TODO: Add your control notification handler code here
  559. TrayAddIcon();
  560. ShowWindow(SW_HIDE);
  561. }
  562. LRESULT CMainBordDlg::OnTestNotifyIcon(WPARAM wParam, LPARAM lParam)
  563. {
  564.    switch(lParam)
  565. {
  566. case WM_LBUTTONDBLCLK:
  567. if(wParam==DEMOICON)
  568. {
  569. ShowWindow(SW_SHOW);
  570. }
  571. break;
  572. case WM_RBUTTONDOWN:
  573. if(wParam==DEMOICON)
  574. {
  575. CMenu *pm1,m2;
  576. CPoint pp(LOWORD(lParam),HIWORD(lParam));
  577. m2.LoadMenu(IDR_MENU1);
  578. pm1=m2.GetSubMenu(0);
  579. ClientToScreen(&pp);
  580. pm1->TrackPopupMenu(TPM_RIGHTALIGN|TPM_LEFTBUTTON,
  581. pp.x,
  582. GetSystemMetrics(SM_CYSCREEN)-50,this);
  583. }
  584. break;
  585.     default:
  586. break;
  587. }
  588. return 0L;
  589. }
  590. int CMainBordDlg::TrayAddIcon()
  591. {
  592.    BOOL res;
  593. NOTIFYICONDATA tnid;
  594. HICON hicon;
  595. hicon=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICONBEFORE));
  596. tnid.cbSize=sizeof(NOTIFYICONDATA);
  597. tnid.hWnd=GetSafeHwnd();
  598. tnid.cbSize=sizeof(NOTIFYICONDATA);
  599. tnid.hWnd=GetSafeHwnd();
  600. tnid.uID=DEMOICON;
  601. tnid.uFlags=NIF_ICON|NIF_TIP|NIF_MESSAGE;
  602. tnid.uCallbackMessage=TESTWM_NOTIFYICON;
  603. tnid.hIcon=hicon;
  604. if(lpszTipBefore)
  605. lstrcpyn(tnid.szTip,lpszTipBefore,sizeof(tnid.szTip));
  606. else
  607. tnid.szTip[0]='';
  608. res=Shell_NotifyIcon(NIM_ADD,&tnid);
  609. if(hicon)
  610. DestroyIcon(hicon);
  611. return res;
  612. }
  613. void CMainBordDlg::OnSubmenu1()
  614. {
  615. ShowWindow(SW_SHOW);
  616. }
  617. void CMainBordDlg::OnSubmenu2()
  618. {
  619.   EndDialog(TRUE);
  620. }