⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netphonedlg.cpp

📁 具有异形窗口的网络电话的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// NetPhoneDlg.cpp : implementation file
//

#include "stdafx.h"
#include "NetPhone.h"
#include "NetPhoneDlg.h"
#include "mmsystem.h"     // 音频相关函数所需头文件
#include "SocketServer.h"
#include "SocketClient.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define INP_BUFFER_SIZE 4096   // 缓冲区大小

#define WM_NC  1001   // 最小到系统托盘区时自定义消息
#define IDC_NC 1002   // 托盘区NOTIFYICONDATA结构对应资源号 

static HWAVEIN      hWaveIn ;        // 录音设备句柄
static HWAVEOUT     hWaveOut ;       // 播放设备句柄
static PBYTE        pBufferIn[2];    // 用于接收和播放的两块缓冲区
static PBYTE        pBufferOut[2];   // 用于发送和录音的两块缓冲区
static PWAVEHDR     pWaveHdrIn[2];   // 用于录音的PWAVEHDR结构数组
static PWAVEHDR     pWaveHdrOut[2];  // 用于播放的PWAVEHDR结构数组
static WAVEFORMATEX waveform ;       // 用于打开音频设备的WAVEFORMATEX结构

int                 nIn=0;       // pBufferIn[2]中,当前播放缓冲区号
int                 nOut=0;      // pBufferOut[2]中,当前录音缓冲区号
int                 nComState=1;  // 用于显示通话状态信息的变量
BOOL                bDisconnectState=TRUE;   // 是否处于未连接状态
BOOL                bBtnConnectDown =FALSE;  // “连接”按钮是否被按下
BOOL                bServerState    =FALSE;  // 是否处于服务器端状态
BOOL                bClientState    =FALSE;  // 是否处于客户端状态
BOOL                bMiniState      =FALSE;  // 是否处于最小化状态


CSocketServer       Socket_Server;    // 接收套接字
CSocketClient       Socket_Client;    // 发送套接字
CSocketServer       Socket_Listen;    // 侦听套接字
CString             LocalIP;          // 本机IP地址
CString             sRemoteIP;        // 远端主机IP地址
CString  sAck;             // 储存远端机器应答信息
char     cAck[15];         // 储存远端机器应答信息


extern CNetPhoneApp theApp;
CNetPhoneDlg  *pDlg;
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNetPhoneDlg dialog
CNetPhoneDlg::CNetPhoneDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CNetPhoneDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CNetPhoneDlg)
	m_sServerIP = _T("192.168.0.11");  
	m_bFirstMini = TRUE;                
	m_bFirstRunBitmap = TRUE;
	m_bFirstRunAudio  = TRUE;
	m_Left=0;
    m_Top=0;
	m_Width=342;
	m_Height=426;
	m_FrameWidth=0;
	m_CaptionHeight=0;
	m_BackBitmapID;
	m_MaskLeftOff=0;
	m_MaskRightOff=0;
	m_MaskTopOff=0;
	m_MaskBottomOff=0;

    m_pBtnCommunicate=new CBitmapButton;
	m_pBtnConnect    =new CBitmapButton;
	m_pBtnDisconnect =new CBitmapButton;
    m_pBtnHelp       =new CBitmapButton;
	m_pBtnExit       =new CBitmapButton;
	m_pBtnMinimize   =new CBitmapButton;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CNetPhoneDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNetPhoneDlg)
	DDX_Control(pDX, IDC_STATIC_INFORMATION, m_staInformation);
	DDX_Text(pDX, IDC_SERVER, m_sServerIP);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CNetPhoneDlg, CDialog)
	//{{AFX_MSG_MAP(CNetPhoneDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_MESSAGE(WM_NC,OnNc)
	ON_WM_ERASEBKGND()
	ON_WM_NCHITTEST()
	ON_BN_CLICKED(ID_EXIT, OnExit)
	ON_BN_CLICKED(IDC_BUTTON_MINIMIZE, OnButtonMinimize)	
	ON_BN_CLICKED(ID_HELP, OnHelp)
	ON_MESSAGE(MM_WIM_OPEN,ON_MM_WIM_OPEN)
	ON_MESSAGE(MM_WIM_DATA,ON_MM_WIM_DATA)
	ON_MESSAGE(MM_WIM_CLOSE,ON_MM_WIM_CLOSE)
	ON_MESSAGE(MM_WOM_OPEN,ON_MM_WOM_OPEN)
	ON_BN_CLICKED(IDC_BUTTON_CONNECT, OnButtonConnect)
	ON_BN_CLICKED(IDC_BUTTON_COMMUNICATE, OnButtonCommunicate)    
	ON_BN_CLICKED(IDC_BUTTON_DISCONNECT, OnButtonDisconnect)
	
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNetPhoneDlg message handlers
void CNetPhoneDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CNetPhoneDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

BOOL CNetPhoneDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	// Add "About..." menu item to system menu.
	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);
	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}
	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon	
	// TODO: Add extra initialization here
	// 得到对话框句柄
	pDlg=(CNetPhoneDlg *)theApp.m_pMainWnd; 
    // 初始化按钮	
	InitBitmapButton();
    // 获得本机IP
    WORD wVersionRequested;
    WSADATA wsaData;
    char name[255];
    PHOSTENT hostinfo;
    wVersionRequested = MAKEWORD( 2, 0 );
    if(WSAStartup( wVersionRequested, &wsaData ) == 0 )
    {
       if( gethostname ( name, sizeof(name)) == 0)
       {
           if((hostinfo = gethostbyname(name)) != NULL)
           {
               LocalIP = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
	       }
       }            
       WSACleanup( );
    } 
    
    //	设置按钮的初始状态
	GetDlgItem(IDC_BUTTON_COMMUNICATE)->EnableWindow(FALSE) ;
	GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(FALSE) ;
	GetDlgItem(IDC_BUTTON_CONNECT)->SetFocus();

	// 创建侦听套接字
	Socket_Listen.Create(5000,SOCK_STREAM);
	// 绑定侦听套接字到本地IP
	Socket_Listen.Bind(5000,LocalIP);
	// 开始侦听
	Socket_Listen.Listen();
	// 创建发送(客户端)套接字
	Socket_Client.Create(5001,SOCK_STREAM);
	
	// 模板处理区域与窗口边框的距离
	m_MaskLeftOff=m_MaskTopOff=m_MaskRightOff=m_MaskBottomOff=0;
	// 窗口边框宽度和标题栏高度
	m_FrameWidth=m_CaptionHeight=0;
	LONG style=::GetWindowLong(this->m_hWnd,GWL_STYLE);
	if((style&WS_BORDER)==WS_BORDER)
		m_FrameWidth=::GetSystemMetrics(SM_CXBORDER);
	if((style&WS_THICKFRAME)==WS_THICKFRAME)
		m_FrameWidth=::GetSystemMetrics(SM_CXFIXEDFRAME);
	if((style&DS_MODALFRAME)==DS_MODALFRAME)
	    m_FrameWidth=::GetSystemMetrics(SM_CXFIXEDFRAME);
	if((style&WS_CAPTION)==WS_CAPTION)
	{
		m_FrameWidth=::GetSystemMetrics(SM_CXFIXEDFRAME);
		m_CaptionHeight=::GetSystemMetrics(SM_CYSMCAPTION);
	}
	m_CaptionHeight+=m_FrameWidth*2;
	// 重置窗口位置和大小
	MoveWindow(m_Left,m_Top,m_Width+m_FrameWidth*2,m_Height+m_CaptionHeight,TRUE);
    
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CNetPhoneDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		// m_bFirstRunBitmap使得SetupRegion只在程序启动时被调用一次
		if(m_bFirstRunBitmap)
		{
		   BeginWaitCursor();
		   // 区域处理,设置透明区域颜色为黑色
		   SetupRegion(GetWindowDC(),IDB_BACKBITMAP,IDB_BACKBITMAP,0x00000000);
		   EndWaitCursor();
		   m_bFirstRunBitmap = FALSE; 
		}		
		CDialog::OnPaint();
	}
}

// “最小化”按钮被按下消息处理函数
void CNetPhoneDlg::OnButtonMinimize() 
{
	if(m_bFirstMini == TRUE)
	{  
	   NOTIFYICONDATA nc;
	   nc.cbSize = sizeof(NOTIFYICONDATA);
	   nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	   nc.hWnd = m_hWnd;
	   lstrcpy(nc.szTip,"o^_^o 网络电话 @_@");
	   nc.uCallbackMessage = WM_NC;
	   nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
	   nc.uID = IDC_NC;
	   Shell_NotifyIcon(NIM_ADD, &nc); 
	   m_bFirstMini = FALSE;
	}
	bMiniState=TRUE;
	ShowWindow(FALSE);	
}

// WM_NC消息处理函数
void CNetPhoneDlg::OnNc(WPARAM wParam,LPARAM lParam)
{
	if(lParam == WM_LBUTTONDBLCLK)
      ShowWindow(SW_SHOW);
	bMiniState=FALSE;	
}

// 初始化按钮控件
void CNetPhoneDlg::InitBitmapButton()
{
	// 按钮控件加载按钮资源
    m_pBtnCommunicate->AutoLoad(IDC_BUTTON_COMMUNICATE,this);
	m_pBtnConnect->AutoLoad(IDC_BUTTON_CONNECT,this);
	m_pBtnDisconnect->AutoLoad(IDC_BUTTON_DISCONNECT,this);
	m_pBtnExit->AutoLoad(ID_EXIT,this);
	m_pBtnHelp->AutoLoad(ID_HELP,this);
    m_pBtnMinimize->AutoLoad(IDC_BUTTON_MINIMIZE,this);	

    // 按钮加载位图资源
	m_pBtnCommunicate->LoadBitmaps(IDB_COMMUNICATEU,0,0,IDB_COMMUNICATEX);
	m_pBtnConnect->LoadBitmaps(IDB_CONNECTU,0,0,IDB_CONNECTX);
	m_pBtnDisconnect->LoadBitmaps(IDB_DISCONNECTU,0,0,IDB_DISCONNECTX);
    m_pBtnExit->LoadBitmaps(IDB_EXITU,0,0,0);
    m_pBtnHelp->LoadBitmaps(IDB_HELPU,0,0,0);
    m_pBtnMinimize->LoadBitmaps(IDB_MINIU,0,0,0);

	// 设置按钮大小适合于贴图大小
	m_pBtnCommunicate->SizeToContent();
    m_pBtnConnect->SizeToContent();
	m_pBtnDisconnect->SizeToContent();
    m_pBtnExit->SizeToContent();
	m_pBtnHelp->SizeToContent();
    m_pBtnMinimize->SizeToContent();
}

// 区域处理函数
void CNetPhoneDlg::SetupRegion(CDC* pDC,UINT BackBitmapID,UINT MaskBitmapID,COLORREF TransColor)
{
  CDC       memDC;
  CBitmap   cBitmap;
  CBitmap*  pOldMemBmp=NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -