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

📄 remotedlg.cpp

📁 一个简单的视频会议VC++MFC工程文件
💻 CPP
字号:
// RemoteDlg.cpp : implementation file
//

#include "stdafx.h"
#include "GraghDialog.h"
//#include "RemoteDlg.h"
#include "GraghDialogDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CRemoteDlg dialog


CRemoteDlg::CRemoteDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CRemoteDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CRemoteDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CRemoteDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRemoteDlg)
	DDX_Control(pDX, IDC_REMOTE_ZOOM, m_RemoteZoom);
	DDX_Control(pDX, IDC_REMOTE_CLOSE, m_RemoteClose);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CRemoteDlg, CDialog)
	//{{AFX_MSG_MAP(CRemoteDlg)
	ON_BN_CLICKED(IDC_REMOTE_ZOOM, OnRemoteZoom)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_BN_CLICKED(IDC_REMOTE_MIN, OnRemoteMin)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRemoteDlg message handlers
/*
void CRemoteDlg::OnRemoteClose() 
{
	// TODO: Add your control notification handler code here
	INT ret=AfxMessageBox("退出会议?",MB_OKCANCEL);
	if(ret!=IDOK) return;

	((CGraghDialogDlg*)pdlg)->DestroyConference ();
	UpdateUI();
	ShowWindow(SW_HIDE);
}
*/
void CRemoteDlg::FreeSource()
{
	DeleteObject(m_hTitleRgn);
	DeleteObject(m_hVideoRgn);
	if(hdib!=NULL)
	{
		::DrawDibEnd(hdib);
		::DrawDibClose(hdib);
	}
}
void CRemoteDlg::OnRemoteZoom() 
{
	// TODO: Add your control notification handler code here
	m_bZoomed = !m_bZoomed;
	int scale=1;
	if(m_bZoomed)
	{
		scale=2;
		m_Width =m_Width*2;
		m_Height =m_Height*2-16;
	}else
	{
		m_Width=(m_Width)/2;
		m_Height=(m_Height+16)/2;
	}
	Invalidate(TRUE);
	::SetWindowPos(m_hWnd,HWND_TOP,0 ,0 ,m_Width,m_Height,SWP_NOMOVE);
	
	DeleteObject(m_hVideoRgn);
	POINT pt[4];
	pt[0].x=m_Video_x;		pt[0].y=m_Video_y;
	pt[1].x=m_Video_x+scale*IMAGE_WIDTH;	pt[1].y=m_Video_y;
	pt[2].x=m_Video_x+scale*IMAGE_WIDTH;	pt[2].y=m_Video_y+scale*IMAGE_HEIGHT;
	pt[3].x=m_Video_x;		pt[3].y=m_Video_y+scale*IMAGE_HEIGHT;
	m_hVideoRgn = CreatePolygonRgn(pt,4,ALTERNATE);
	UpdateUI();
}

BOOL CRemoteDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	SetWindowText (_T("远程视频"));
	m_RemoteClose.SetIcon (IDI_MININ,IDI_MIN,10,10);
	m_RemoteZoom.SetIcon (IDI_ZOOMIN,IDI_ZOOM,10,10);
	m_RemoteClose.AddToolTip (_T("关闭"));
	m_RemoteZoom.AddToolTip (_T("缩放"));
	m_bHilight=FALSE;
	m_Last=FALSE;
	m_hdc = GetDC()->m_hDC ;
	RECT rc;
	GetClientRect(&rc);

	m_Width=rc.right -rc.left ;
	m_Height=rc.bottom -rc.top ;

	POINT pt[4];
	pt[0].x=0;		pt[0].y=0;
	pt[1].x=3*m_Width/4;	pt[1].y=0;
	pt[2].x=3*m_Width/4;	pt[2].y=16;
	pt[3].x=0;		pt[3].y=16;
	m_hTitleRgn	=	CreatePolygonRgn(pt,4,ALTERNATE);
	
	m_Video_x = 2;	m_Video_y=18;
	pt[0].x=m_Video_x;		pt[0].y=m_Video_y;
	pt[1].x=m_Video_x+IMAGE_WIDTH;	pt[1].y=m_Video_y;
	pt[2].x=m_Video_x+IMAGE_WIDTH;	pt[2].y=m_Video_y+IMAGE_HEIGHT;
	pt[3].x=m_Video_x;		pt[3].y=m_Video_y+IMAGE_HEIGHT;
	m_hVideoRgn = CreatePolygonRgn(pt,4,ALTERNATE);
	
	hdib=NULL;
	m_bVideoIn = FALSE;
	m_bZoomed	= FALSE;
	DrawTitleBar(m_hdc);
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CRemoteDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
//	CDialog::OnLButtonDown(nFlags, point);
	if(PtInRegion(m_hTitleRgn,point.x,point.y))
		PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y)); 
}

void CRemoteDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	PtInRegion(m_hTitleRgn,point.x,point.y)?m_bHilight =TRUE:m_bHilight =FALSE;
	if(m_bHilight != m_Last )
	{
		m_Last=m_bHilight;
		DrawTitleBar(m_hdc);
	}
//	CDialog::OnMouseMove(nFlags, point);
}

void CRemoteDlg::DrawTitleBar(HDC hdc)
{
	RECT rc;
	GetClientRect(&rc);
	HBRUSH hbr;
	char szTitle[128]="";
	
	if(m_bHilight)	hbr=CreateSolidBrush(0x00FF3333);		
	else			hbr=CreateSolidBrush(0x00660000);		
	FillRgn(hdc,m_hTitleRgn,hbr);
	DeleteObject(hbr);
	
	NONCLIENTMETRICS ncm;
	ncm.cbSize = sizeof(ncm);
	SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
	HFONT hf=CreateFontIndirect(&ncm.lfCaptionFont);
	HFONT hof=(HFONT)SelectObject(hdc,hf);
	SetBkMode(hdc,TRANSPARENT);
	if(m_bHilight)	SetTextColor(hdc,0x000000ff);
	else			SetTextColor(hdc,0x00C0C0C0);
	GetWindowText(szTitle,63);
	
	DrawText(hdc,szTitle,strlen(szTitle),&CRect(4,0,144,12),DT_LEFT);

	if(!m_bVideoIn)// video playing
	{
		hbr=CreateSolidBrush(0x00000000);
		FillRgn(hdc,m_hVideoRgn,hbr);
		sprintf(szTitle,"没有收到对方视频");
		DrawText(hdc,szTitle,strlen(szTitle),&CRect(m_Width/4,m_Height/2,m_Width,m_Height),DT_LEFT);
		DeleteObject(hbr);
	}
	SelectObject(hdc,hof);
	DeleteObject(hf);
	DeleteObject(hof);
}

void CRemoteDlg::DisplayRemoteFrame(unsigned char *data,int size)
{
//	TRACE("CRemoteDlg::DisplayRemoteFrame %d Bytes\n",size);
	int i=0,j=0;
	RECT rc;
	if(data == NULL || size<=0)		return;
	m_bVideoIn =TRUE;
	if(!hdib)
	{// 1st time display,setup paras
		m_bmpinfo=((CGraghDialogDlg*)pdlg)->m_bmpinfo ;
		GetClientRect(&rc);
		m_Width=rc.right -rc.left ;
		m_Height=rc.bottom -rc.top ;
		hdib=::DrawDibOpen();
		if(hdib!=NULL)
		{
			::DrawDibBegin(hdib,
				m_hdc,
				-1,				// don't stretch
				-1,				// don't stretch
				&m_bmpinfo->bmiHeader,
				IMAGE_WIDTH,         // width of image
				IMAGE_HEIGHT,        // height of image
				0				
				);
		}
	}else
		::DrawDibDraw(hdib,
				  m_hdc,
				  m_Video_x,		// dest : left pos
				  m_Video_y,		// dest : top pos
				  m_bZoomed?2*IMAGE_WIDTH:-1,		// zoom x
				  m_bZoomed?2*IMAGE_HEIGHT:-1,		// zoom y
				  &m_bmpinfo->bmiHeader,	 // bmp header info
				  data,					 // bmp data
				  0,					 // src :left
				  0,					 // src :top
				  IMAGE_WIDTH,				 // src : width
				  IMAGE_HEIGHT,				 // src : height
				  DDF_SAME_DRAW			 // use prev params....
				  );
}

void CRemoteDlg::SetParent(CDialog *pdialog)
{
	pdlg=pdialog;
}
void CRemoteDlg::UpdateUI()
{
	DrawTitleBar (m_hdc);
}
void CRemoteDlg::OnOK()
{}
	
void CRemoteDlg::OnCancel()
{}

void CRemoteDlg::OnRemoteMin() 
{
	ShowWindow(SW_MINIMIZE);	
}

⌨️ 快捷键说明

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