|
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】
|