设为首页 加入收藏

TOP

1.5 主窗体设计(2)
2013-10-07 00:19:06 来源: 作者: 【 】 浏览:60
Tags:1.5 窗体 设计

1.5  主窗体设计(2)

(10)处理CPreView类的WM_PAINT消息,当窗口关联的视频卡号有信号并处于选中状态时,绘制绿色的边框,并在窗口关联的视频卡号无信号时,绘制一幅位图表示当前无信号。代码如下:

 void CPreView::OnPaint() 
{
CPaintDC dc(this);
CRect rc;
GetClientRect(rc);        //获得控件的客户区域
if (m_Index==m_CurIndex)      //判断预览窗口当前索引是否是本窗口索引
m_Selected = TRUE;       //当前窗口被选中
else
m_Selected = FALSE;       //当前窗口未被选中
if (m_Selected)        //判断是否
{
CPen pen(PS_SOLID,1,RGB(0,255,0));  //设置钢笔
  dc.SelectObject(&pen);            //将画笔选入设备环境
  dc.Rectangle(rc);                   //绘制矩形
}
else
{
CPen pen(PS_SOLID,1,RGB(55,55,55));   //设置钢笔
dc.SelectObject(&pen);              //将钢笔选入设备环境
dc.Rectangle(rc);                   //绘制矩形
}
if (m_ShowImage)         //是否显示图像
{
CBrush brush (RGB(255,0,255));     //设置画笔
dc.SelectObject(&brush);         //将画笔选入设备环境
rc.DeflateRect(1,1,1,1);
dc.FillRect(rc,&brush);
}
else
{
CDC memDC;
memDC.CreateCompatibleDC(&dc);   //创建一个和指定设备环境
相兼容的内存设备环境
memDC.SelectObject(&m_Bitmap);   //将位图选入设备环境
BITMAP bInfo;
m_Bitmap.GetBitmap(&bInfo);     //获取位图信息
int x = bInfo.bmWidth;          //获取图片的宽度
int y = bInfo.bmHeight;          //获取图片的高度
 dc.StretchBlt(1,1,rc.Width()-2,rc.Height()-2,&memDC,1,1,x,y,
SRCCOPY); //将位图绘制到窗口
memDC.DeleteDC();          //释放内存设备环境
}
}

代码贴士

SelectObject:将GDI对象选入设备环境。

Rectangle:根据输入的数据绘制矩形。

语法:

 BOOL Rectangle( int x1, int y1, int x2, int y2 );
BOOL Rectangle( LPCRECT lpRect );

StretchBlt:从指定设备上下文复制位图,大小可以改变。

语法:

BOOL StretchBlt( int x, int y, 
int nWidth, int nHeight, CDC* pSrcDC,
int xSrc, int ySrc, int nSrcWidth,
int nSrcHeight, DWORD dwRop );
(11)处理CPreView类的WM_LBUTTONDOWN消息,当鼠标左键在窗口按下时将当前窗口标记为选中状态(具有绿色的边框)。代码如下:
 void CPreView::OnLButtonDown(UINT nFlags, CPoint point) 
{
int preIndex = m_CurIndex ;
if (m_CurIndex==-1)         //判断是否有预览窗口
preIndex = m_Index;
m_CurIndex = m_Index;
((CPanel*)GetParent())->RefreshWnd(preIndex,m_Index);  //刷新预览窗口
CStatic::OnLButtonDown(nFlags, point);
}
(12)处理CPreView类的WM_SIZE消息,在窗口大小改变时更新视频显示窗口的大小。代码如下:
 void CPreView::OnSize(UINT nType, int cx, int cy) 
{
if (m_ShowImage)          //判断是否显示图片
{
if (!m_Stop)          //判断是否停止预览
{
//更新视频预览窗口
VCAUpdateOverlayWnd(m_hWnd);
VCAUpdateVideoPreview(m_Index,m_hWnd);
}
}
CStatic::OnSize(nType, cx, cy);
}
(13)处理CPreView类的WM_LBUTTONDBLCLK消息,当用户双击某个窗口时,将窗口放大到父窗口的大小或者恢复为窗口的初始大小。代码如下:
 void CPreView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
if (m_Stop)            //在停止预览时禁止双击
return;
m_Dbled = ! m_Dbled;
//记录原始区域大小
CRect rc,prc;
GetClientRect(rc);          //获得视频窗口的区域大小
this->MapWindowPoints(GetParent(),rc);
 GetParent()->GetClientRect(prc);       //获得父窗口的客户区域大小
int div = ((CPanel*)GetParent())->m_Div;
prc.DeflateRect(div,div,div,div);
if (m_Dbled)
{
((CPanel*)GetParent())->ShowOnly(m_Index);   //显示预览窗口
 SetWindowPos(&wndTop,prc.left,prc.top,prc.Width(),
prc.Height(),SWP_SHOWWINDOW);
Invalidate();          //刷新窗口
if (m_ShowImage)         //是否显示图片
{
//更新视频预览窗口
VCAUpdateOverlayWnd(m_hWnd);
VCAUpdateVideoPreview(m_Index,m_hWnd);
}
}
else
{
((CPanel*)GetParent())->ShowAll();    //显示所有预览窗口
((CPanel*)GetParent())->OnSize(0,0,0);
Invalidate();            //刷新窗口
if (m_ShowImage)         //是否显示图片
{
//更新视频预览窗口
VCAUpdateOverlayWnd(m_hWnd);
VCAUpdateVideoPreview(m_Index,m_hWnd);

}
CStatic::OnLButtonDblClk(nFlags, point);
}

(14)创建一个对话框,作为预览窗口的父窗口。打开对话框属性窗口,将对话框的ID改为IDD_PANEL_DIALOG,修改对话框资源的风格为Child、边框为Thin。为对话框创建一个对话框类CPanel。


(15)向CPanel类中添加成员变量。代码如下:

 CPreView * m_pList;          //预览窗口
UINT     m_Num;           //记录预览窗口的数量
UINT     m_UnitNum;          //m_Num的开平方
UINT     m_Div;            //预览窗口的间隔
CRect     m_PreRC;          //所有预览窗口的显示区域
(16)向CPanel类中添加CreatePreWnd方法,用于创建预览窗口。代码如下:
BOOL CPanel::CreatePreWnd(UINT uNum)
{
if (uNum==0)           //判断是否有预览窗口
return FALSE;
m_UnitNum = uNum;
 m_Num = pow(uNum,2);
m_pList = new CPreView[m_Num ];
CRect rc;
GetClientRect(rc);          //获得父窗口的客户区域
//预览窗口的宽度
int width = (rc.Width()-(uNum+1)*m_Div)/uNum;
//预览窗口的高度
int height = (rc.Height()-(uNum+1)*m_Div)/uNum;
//计算预览窗口的位置
for (int i =0; i<m_Num; i++)
{
int row = i / uNum + 1;             //计算预览窗口的行位置
int col = i % uNum + 1;             //计算预览窗口的列位置
int x = col*m_Div+(col-1)*width;      //计算预览窗口的左上角横坐标
int y = row*m_Div+(row-1)*height;     //计算预览窗口的左上角纵坐标
CRect rect(x,y,x+width,y+height);      //设置预览窗口的显示区域
//创建预览窗口
 m_pList[i].Create("www",WS_CHILD|WS_VISIBLE|SS_BLACKFRAME|SS_NOTIFY,rect,this);
m_pList[i].m_Index = i;        //记录预览窗口索引
}
return TRUE;
}

代码贴士

pow:求x的y次方的值。

Create:用于创建文本窗口,并将创建的文本窗口关联到CStatic对象上。

语法:

BOOL Create( LPCTSTR lpszText, DWORD dwStyle, 
const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.2.1 需求分析 下一篇1.5 主窗体设计(3)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: