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

📄 screenchattingserverdlg.cpp

📁 Screen Chatting source
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// ScreenChattingServerDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ScreenChattingServer.h"
#include "ScreenChattingServerDlg.h"

#include "VFWWrapper.h"

extern "C"
{
//	#include "Wave.h"
	#include "Recoder.h"
}

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

#define MAX_CLIENT 10
#define TIMERID_CAPTURE 1010

#define MAX_SEND_PACKET_SIZE    (16 * 1024)
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
//Source file code
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////

#define XMD_H
#define JPEG_WORK_BUFFER_SIZE 8192      // 8KB Work Buffer
#define FULL_MAIN_BUFFER_SUPPORTED
#define NEED_FAR_POINTERS

extern "C"
{
#include "jpeglib.h"
#include "jdatadst.c"
#include "jpegint.h"
#include "jcmainct.c"
}
#include <setjmp.h> 

typedef struct
{
  struct jpeg_destination_mgr pub;       // public fields

  JOCTET * buffer;
}
data_dest_mgr;

struct ima_error_mgr
{
  struct  jpeg_error_mgr pub; //"public" fields
  jmp_buf setjmp_buffer;	  //for return to caller
};

CScreenChattingServerDlg *g_pScreenChattingServerDlg;

BOOL WriteDIB( LPTSTR szFile, HANDLE hDIB);
HANDLE DDBToDIB( CBitmap& bitmap, DWORD dwCompression, CPalette* pPal  ,BYTE *pData);
BOOL JpegFromDib(HANDLE hDib,int nQuality,CString csJpeg,CString* pcsMsg); 
BOOL JpegBufferFromDib(HANDLE hDib,int nQuality,CString* pcsMsg); 
BOOL DibToSamps(HANDLE hDib,int nSampsPerRow,struct jpeg_compress_struct cinfo,JSAMPARRAY                  jsmpPixels,CString*                    pcsMsg);
RGBQUAD QuadFromWord(WORD b16);

METHODDEF(void)jpeg_mem_dest_init (j_compress_ptr cinfo);
METHODDEF(boolean)jpeg_mem_dest_empty_output_buffer (j_compress_ptr cinfo);
METHODDEF(void)jpeg_mem_dest_term (j_compress_ptr cinfo);
GLOBAL(void)jpeg_mem_dest(j_compress_ptr cinfo,JOCTET * pData,int FileSize);

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
CVFWWrapper *CScreenChattingServerDlg::m_pVFWWrapper=NULL;

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()

/////////////////////////////////////////////////////////////////////////////
// CScreenChattingServerDlg dialog

CScreenChattingServerDlg::CScreenChattingServerDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CScreenChattingServerDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CScreenChattingServerDlg)
	m_uPortNum = 0;
	m_uJpegQuality = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CScreenChattingServerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CScreenChattingServerDlg)
	DDX_Text(pDX, IDE_PORTNUM, m_uPortNum);
	DDV_MinMaxUInt(pDX, m_uPortNum, 0, 100000);
	DDX_Text(pDX, IDE_JPEGQUALITY, m_uJpegQuality);
	DDV_MinMaxUInt(pDX, m_uJpegQuality, 0, 100);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CScreenChattingServerDlg, CDialog)
	//{{AFX_MSG_MAP(CScreenChattingServerDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDB_CHANGESIZE, OnChangesize)
	ON_BN_CLICKED(IDB_LISTEN, OnListen)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDB_CHANGESOURCE, OnChangesource)
	ON_BN_CLICKED(IDR_TCP, OnTcp)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDR_UDP, OnUdp)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CScreenChattingServerDlg message handlers

BOOL CScreenChattingServerDlg::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
	CRect rect;

	m_uJpegQuality=100;
	m_uPortNum=3165;

	CWnd *pWndChatting=GetDlgItem(IDS_CHATTINGWINDOW);
	pWndChatting->GetWindowRect(&rect);

	m_pSendFrameServerSocket=NULL;
	m_pVFWWrapper=(CVFWWrapper*)new CVFWWrapper;

	if (!m_pVFWWrapper->Initialize(TRUE,TRUE,CRect(rect.Width()/2-80,rect.Height()/2-60,rect.Width()/2+80,rect.Height()/2+60),this)) return FALSE;

	FARPROC fpErrorCallback=MakeProcInstance((FARPROC)ErrorCallbackProc,AfxGetInstanceHandle());
	FARPROC fpYieldCallback=MakeProcInstance((FARPROC)YieldCallbackProc,AfxGetInstanceHandle());    
	FARPROC fpStatusCallback=MakeProcInstance((FARPROC)StatusCallbackProc,AfxGetInstanceHandle());
	FARPROC fpVideoStreamCallback=MakeProcInstance((FARPROC)VideoStreamCallbackProc,AfxGetInstanceHandle());
	FARPROC fpFrameCallback=MakeProcInstance((FARPROC)FrameCallbackProc,AfxGetInstanceHandle());

	m_pVFWWrapper->SetHandler(fpErrorCallback,fpYieldCallback,fpStatusCallback,fpVideoStreamCallback,fpFrameCallback);

	OnChangesize();

	g_pScreenChattingServerDlg=this;

	m_curMethod=TCP;
	((CButton *)GetDlgItem(IDR_UDP))->SetCheck(1);
	
	UpdateData(FALSE);

	return TRUE;  // return TRUE  unless you set the focus to a control
}

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

// 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 CScreenChattingServerDlg::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
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CScreenChattingServerDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}
/*
void CScreenChattingServerDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if (!m_pVFWWrapper->CaptureFrame()) return;
	CWinBmpEx *pWinBmpEx=m_pScreenCapture->CaptureIt(m_pVFWWrapper->m_pCapWnd);

	if (!pWinBmpEx) return ;

	BYTE *pJpegData;
	CJPEGEncoderEx Encoder;

	int nBufferSize=Encoder.GetJpegData(pWinBmpEx,&pJpegData);
	SendFrame(pJpegData,nBufferSize);

	free(pJpegData);
	delete pWinBmpEx;

	CDialog::OnTimer(nIDEvent);
}

void CScreenChattingServerDlg::OnProgress(double Part)
{

}
*/
LRESULT CScreenChattingServerDlg::ErrorCallbackProc(HWND hWnd,int nErrID,LPSTR lpErrorText)
{
/*
	if (!ghWndMain) return FALSE;
    if (nErrID==0) return TRUE;

    lstrcpy(gachLastError, lpErrorText);
*/
    AfxMessageBox(lpErrorText);

    return (LRESULT) TRUE ;
}

LRESULT CScreenChattingServerDlg::StatusCallbackProc(HWND hWnd,int nID,LPSTR lpStatusText)
{
	static int CurrentID;
/*
    if (!ghWndMain) 
	{
        return FALSE;
    }
*/
    if (nID==IDS_CAP_END) 
	{
        if ((CurrentID==IDS_CAP_STAT_VIDEOAUDIO)||(CurrentID==IDS_CAP_STAT_VIDEOONLY)) 
		{
            return(TRUE);
        }
    }
    CurrentID=nID;

    return (LRESULT)TRUE;
}

LRESULT CScreenChattingServerDlg::YieldCallbackProc(HWND hWnd)
{
    MSG msg;

    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
	{
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (LRESULT) TRUE;
}

LRESULT CScreenChattingServerDlg::VideoStreamCallbackProc(HWND hWnd,LPVIDEOHEADER lpVideoHeader)
{
	return TRUE;
}

LRESULT CScreenChattingServerDlg::FrameCallbackProc(HWND hWnd,LPVIDEOHEADER lpVideoHeader)
{
	CString strErrMsg;
	CBitmap  cBitmap;

	g_pScreenChattingServerDlg->UpdateData(TRUE);

	BITMAPINFO *pBi=m_pVFWWrapper->GetBitmapInfo();
	BITMAPINFOHEADER *pBih=&pBi->bmiHeader;

	cBitmap.CreateBitmap(pBih->biWidth,pBih->biHeight,pBih->biPlanes,pBih->biBitCount,lpVideoHeader->lpData);
	cBitmap.SetBitmapBits(lpVideoHeader->dwBytesUsed,lpVideoHeader->lpData);

	HANDLE hDIB=DDBToDIB(cBitmap,BI_RGB,NULL,lpVideoHeader->lpData);
	
	int nBufferSize=GlobalSize(hDIB);
	g_pScreenChattingServerDlg->m_pBuffer=(LPBYTE)malloc(nBufferSize);
	g_pScreenChattingServerDlg->m_nMaxBufferSize=nBufferSize;
	g_pScreenChattingServerDlg->m_nCurPos=0;

	JpegBufferFromDib(hDIB,g_pScreenChattingServerDlg->m_uJpegQuality,&strErrMsg);
	g_pScreenChattingServerDlg->SendFrame(g_pScreenChattingServerDlg->m_pBuffer,g_pScreenChattingServerDlg->m_nCurPos);

	free(g_pScreenChattingServerDlg->m_pBuffer);
	delete pBi;

	return TRUE;
}

void CScreenChattingServerDlg::OnChangesize() 
{
	// TODO: Add your control notification handler code here
	m_pVFWWrapper->ChangeFormat();

	CRect rect;
	CWnd *pWndChatting=GetDlgItem(IDS_CHATTINGWINDOW);
	pWndChatting->GetWindowRect(&rect);

	int nWidthDiv2=m_pVFWWrapper->m_capStatus.uiImageWidth/2;
	int nHeightDiv2=m_pVFWWrapper->m_capStatus.uiImageHeight/2;

	m_pVFWWrapper->m_pCapWnd->MoveWindow(rect.Width()/2-nWidthDiv2,rect.Height()/2-nHeightDiv2,m_pVFWWrapper->m_capStatus.uiImageWidth,m_pVFWWrapper->m_capStatus.uiImageHeight,TRUE);
}

void CScreenChattingServerDlg::OnChangesource() 
{

⌨️ 快捷键说明

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