我写的一个监控视频程序,想实现双击视频全屏,再双击回复原来大小,求助哪里错了

timeyg 2012-10-08 09:12:01
我写了一个监控视频程序,显示网络摄像头的实时内容,想实现双击视频全屏,再双击回复原来大小,但是调试的时候是视频的整个窗口全屏,而不是视频全屏(窗口里面还有其他的按钮什么的)而且视频的大小没有变化,另外再双击的时候整个窗口就没有了但是程序没有退出调试,小弟是新手,请教各位前辈,我的程序应该怎么修改。

#include "stdafx.h"
#include "DvrClientPreview.h"
#include "DvrClientPreviewDlg.h"

#include "..\\include\HBSDVRSDK.h"

#pragma comment(lib, "..\\lib\\7000SDK.lib")

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


#define POPMENU_ID 10000
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

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

// 对话框数据
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现
protected:
DECLARE_MESSAGE_MAP()
};

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

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

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CDvrClientPreviewDlg 对话框




CDvrClientPreviewDlg::CDvrClientPreviewDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDvrClientPreviewDlg::IDD, pParent)
, m_csLoginIp(_T("192.168.2.102"))
, m_ulLoginPort(8101)
, m_csLoginUser(_T("admin"))
, m_csLoginPassword(_T("888888"))
{
m_lRealPlayhandle = FALSE;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDvrClientPreviewDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDITIP, m_csLoginIp);
DDX_Text(pDX, IDC_EDITPORT, m_ulLoginPort);
DDX_Text(pDX, IDC_EDITUSER, m_csLoginUser);
DDX_Text(pDX, IDC_EDITPASSWORD, m_csLoginPassword);
DDX_Control(pDX, IDC_LISTSERVER, m_listCtrlServer);
DDX_Control(pDX, IDC_STATICPLAYWINDOW, m_cStaticPlayWindow);
}

BEGIN_MESSAGE_MAP(CDvrClientPreviewDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTONLOGIN, &CDvrClientPreviewDlg::OnBnClickedButtonlogin)
ON_NOTIFY(NM_RCLICK, IDC_LISTSERVER, &CDvrClientPreviewDlg::OnNMRClickListserver)
ON_BN_CLICKED(IDC_BUTTONLOGOUT, &CDvrClientPreviewDlg::OnBnClickedButtonlogout)
ON_WM_CLOSE()
ON_WM_LBUTTONDBLCLK()
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LISTSERVER, &CDvrClientPreviewDlg::OnLvnItemchangedListserver)
ON_EN_CHANGE(IDC_EDITIP, &CDvrClientPreviewDlg::OnEnChangeEditip)
// ON_BN_CLICKED(IDC_BUTTON1, &CDvrClientPreviewDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CDvrClientPreviewDlg::OnBnClickedButton2)
ON_STN_CLICKED(IDC_STATICPLAYWINDOW, &CDvrClientPreviewDlg::OnStnClickedStaticplaywindow)
ON_EN_CHANGE(IDC_EDITPASSWORD, &CDvrClientPreviewDlg::OnEnChangeEditpassword)
ON_EN_CHANGE(IDC_EDITUSER, &CDvrClientPreviewDlg::OnEnChangeEdituser)
END_MESSAGE_MAP()


// CDvrClientPreviewDlg 消息处理程序

BOOL CDvrClientPreviewDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
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);
}
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码

//初始化ListCtrl
LVCOLUMN Title;
Title.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH;
Title.fmt=LVCFMT_LEFT;
Title.pszText=_T("");
Title.cx=185;
m_listCtrlServer.InsertColumn(0, &Title);
m_listCtrlServer.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

//初始化7000sdk
CString csWarning;
if (!HB_SDVR_Init())
{
csWarning.LoadString(IDS_STRINGSDVRINITFAIL);
MessageBox(csWarning);
return FALSE;
}
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

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

// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。

void CDvrClientPreviewDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
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;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

...全文
419 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
看不见的裂痕 2012-10-18
  • 打赏
  • 举报
回复
关键那时候,大神们7天长假还没缓过神来呢
timeyg 2012-10-18
  • 打赏
  • 举报
回复
没人回答,自己弄出来了,结贴都郁闷
timeyg 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

汉邦DVR? 看到7000SDK了。
[/Quote]是啊,用的汉邦的摄像头,从网站下载的SDK,请指教啊,控件全屏。。。。
Delphi_A7 2012-10-09
  • 打赏
  • 举报
回复
汉邦DVR? 看到7000SDK了。
timeyg 2012-10-08
  • 打赏
  • 举报
回复
请各位高手帮忙看看,我想实现的功能是:
1,双击视频全屏,再双击回复原来大小(只有视频变为全屏)
timeyg 2012-10-08
  • 打赏
  • 举报
回复
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CDvrClientPreviewDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}


// 用户登陆DVR
void CDvrClientPreviewDlg::OnBnClickedButtonlogin()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);

CString csWarning;

HB_SDVR_DEVICEINFO_EX devInfo;
ZeroMemory(&devInfo, sizeof(HB_SDVR_DEVICEINFO_EX));
LONG lUserId = HB_SDVR_Login_Ex_Nvs(m_csLoginIp.GetBuffer(), (WORD)m_ulLoginPort,
m_csLoginUser.GetBuffer(), m_csLoginPassword.GetBuffer(), &devInfo);
if (lUserId <= 0)//登录发生错误
{
switch(lUserId)
{
case HB_SDVR_IPERR :
csWarning.LoadString(IDS_STRINGCONNECTFAILIPERR);
//F_AddEvent(evenThing);
break;
case HB_SDVR_MACERR :
csWarning.LoadString(IDS_STRINGCONNECTFAILMACERR);
//F_AddEvent(evenThing);
break;
case HB_SDVR_PSWERR :
csWarning.LoadString(IDS_STRINGCONNECTFAILPSWERR);
//F_AddEvent(evenThing);
break;
case HB_SDVR_USERERR :
csWarning.LoadString(IDS_STRINGCONNECTFAILUSERERR);
//F_AddEvent(evenThing);
break;
case HB_SDVR_USERISFULL :
csWarning.LoadString(IDS_STRINGCONNECTFAILUSERISFULL);
//F_AddEvent(evenThing);
break;

case HB_SDVR_NETWORK_RECV_TIMEOUT :
csWarning.LoadString(IDS_STRINGCONNECTFAILTIMEOUT);
//F_AddEvent(evenThing);
break;
case HB_SDVR_NETWORK_SEND_ERROR:
csWarning.LoadString(IDS_STRINGCONNECTFAILSENDERROR);
//F_AddEvent(evenThing);
break;
case HB_SDVR_PARAMETER_ERROR:
csWarning.LoadString(IDS_STRINGCONNECTFAILPARAMETERERROR);
//F_AddEvent(evenThing);
break;
case HB_SDVR_NETWORK_FAIL_CONNECT:
csWarning.LoadString(IDS_STRINGCONNECTFAIL);
//F_AddEvent(evenThing);
break;
case HB_SDVR_CREATESOCKET_ERROR:
csWarning.LoadString(IDS_STRINGCONNECTFAILCREATESOCKETERROR);
//F_AddEvent(evenThing);
break;
case HB_SDVR_USERISALIVE:
csWarning.LoadString(IDS_STRINGCONNECTFAILUSERISALIVE);
//F_AddEvent(evenThing);
break;
case HB_SDVR_IPMISMATCH:
csWarning.LoadString(IDS_STRINGCONNECTFAILIPMISMATCH);
//F_AddEvent(evenThing);
break;
default:
break;
}
MessageBox(csWarning);
return;
}
else
{
USERIDDEVINFO ud;
ud.lUserId = lUserId;
ud.devInfo = devInfo;
m_userIdSet.push_back(ud);//服务器信息和用户登录ID保存

CString csTemp;
csTemp.Format(_T("%s(%s):%d-%d"), (LPTSTR)devInfo.sDvrName,
m_csLoginIp, m_ulLoginPort, devInfo.byChanNum);
m_listCtrlServer.InsertItem(m_listCtrlServer.GetItemCount(),
csTemp);//服务器信息放入列表控件
}
}
//动态创建右键菜单
void CDvrClientPreviewDlg::OnNMRClickListserver(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
int nSelect = m_listCtrlServer.GetSelectionMark();
if (-1 == nSelect)
{
return;
}

CString csChanInfo;
CMenu popMenu;
if(popMenu.CreatePopupMenu())//创建动态弹出菜单
{
for(int nChanNum = 0; nChanNum < (int)m_userIdSet[nSelect].devInfo.byChanNum;
nChanNum++)//添加子菜单项等于通道数
{

csChanInfo.Format(_T("%d-%s"),nChanNum+1,
(LPTSTR)m_userIdSet[nSelect].devInfo.sChanName[nChanNum]);
popMenu.AppendMenu(MF_STRING, nChanNum + POPMENU_ID, csChanInfo);
}

CPoint pt;
GetCursorPos(&pt);//获取鼠标点击位置
popMenu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);//绘制窗口

popMenu.DestroyMenu();//销毁弹出菜单
}
*pResult = 0;
}
//用户注销DVR
void CDvrClientPreviewDlg::OnBnClickedButtonlogout()
{
// TODO: 在此添加控件通知处理程序代码
int nSelect = m_listCtrlServer.GetSelectionMark();
if (-1 == nSelect)
{
return;
}

CString csWarning;
if (FALSE != m_lRealPlayhandle)//当前有实时视频在播放
{
HB_SDVR_StopRealPlay(m_lRealPlayhandle);
}
if (!HB_SDVR_Logout(m_userIdSet[nSelect].lUserId))//用户注销
{
csWarning.LoadString(IDS_STRINGLOGOUTFAIL);
MessageBox(csWarning);
}
m_lRealPlayhandle = FALSE;

m_listCtrlServer.DeleteItem(m_listCtrlServer.GetSelectionMark());
Invalidate(TRUE);
RedrawWindow();
m_userIdSet.erase(m_userIdSet.begin()+nSelect);//从列表控件删除注销的服务器
}
//列表控件右键菜单的左键单击消息
BOOL CDvrClientPreviewDlg::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
// TODO: 在此添加专用代码和/或调用基类
WPARAM MenuId = GetCurrentMessage()->wParam; //获得当前被单击的菜单的ID号
if(MenuId >= POPMENU_ID) //检查ID是否是动态建立的
{
if(MenuId == nID && nCode == CN_COMMAND) //子菜单项被单击
{
if (FALSE != m_lRealPlayhandle)
{
HB_SDVR_StopRealPlay(m_lRealPlayhandle);
}
HB_SDVR_CLIENTINFO clientInfo;
ZeroMemory(&clientInfo, sizeof(clientInfo));

clientInfo.hPlayWnd = m_cStaticPlayWindow.GetSafeHwnd();
clientInfo.lChannel = nID - POPMENU_ID;
clientInfo.lLinkMode = 0x00000000; //TCP

m_lRealPlayhandle = HB_SDVR_RealPlay(
m_userIdSet[m_listCtrlServer.GetSelectionMark()].lUserId, 0, &clientInfo);//开始播放实时视频
}
}
return CDialog::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

void CDvrClientPreviewDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CString csWarning;
if (FALSE != m_lRealPlayhandle)
{
OnBnClickedButtonlogout();
}
if (FALSE == HB_SDVR_Cleanup())//回收资源
{
csWarning.LoadString(IDS_STRINGCLEANUPERR);
MessageBox(csWarning);
}

CDialog::OnClose();
}


void CDvrClientPreviewDlg::OnLvnItemchangedListserver(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
}

void CDvrClientPreviewDlg::OnEnChangeEditip()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.

// TODO: Add your control notification handler code here
}

// void CDvrClientPreviewDlg::OnBnClickedButton1()
// {
// // TODO: Add your control notification handler code here
//
// }

void CDvrClientPreviewDlg::OnBnClickedButton2()
{
// TODO: Add your control notification handler code here
char cFilename[256];
CTime time = CTime::GetCurrentTime();
sprintf(cFilename, "D:\\pic\\%dch%d%d%d%d%d%d%d.bmp", m_lRealPlayhandle ,
time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond(), GetTickCount());
if (m_lRealPlayhandle > -1)
{
HB_SDVR_CapturePicture(m_lRealPlayhandle,cFilename);
}

}


void CDvrClientPreviewDlg::OnStnClickedStaticplaywindow()
{
// TODO: 在此添加控件通知处理程序代码

}

BOOL bClick;// 对话框类的成员变量,初始化为FALSE
CRect rc(0,0,::GetSystemMetrics(SM_CXFRAME),::GetSystemMetrics(SM_CYFRAME)); // 保存对话的屏蔽坐标区域

// 鼠标左键双击消息WM_LBUTTONDBLCLK消息响应函数
void CDvrClientPreviewDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

CDialog::OnLButtonDblClk(nFlags, point);
bClick = !bClick;
if(bClick)
{
ModifyStyle(WS_CAPTION, 0);
CRect rect(0,0,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN));
MoveWindow(&rect,TRUE);
}
else
{
ModifyStyle(WS_CAPTION, 0);
MoveWindow(&rc, FALSE);
}

}



void CDvrClientPreviewDlg::OnEnChangeEditpassword()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialog::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。

// TODO: 在此添加控件通知处理程序代码
}

void CDvrClientPreviewDlg::OnEnChangeEdituser()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialog::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。

// TODO: 在此添加控件通知处理程序代码
}
timeyg 2012-10-08
  • 打赏
  • 举报
回复
求高手指教

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧