以前做过一段时间MFC,都忘得差不多了,最近又做了一个小界面。发现与vs2005中MFC有许多不同之处。
vs2010的Dialog基类默认选择的是“CDialogEx”。
1. 定时器不跳入OnTimer(UINT_PTR nIDEvent)处理函数的问题:
如果调用CWnd::SetTimer函数时最后一个参数为NULL,则通过WM_TIMER的消息处理函数来处理定时事件。
需要在BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP()直接添加:ON_WM_TIMER(),但是手动添加往往会报错,static_cast的错误。
注意使用类向导来添加,当自己添加的afx_msg 响应不对时,往往类型不对。
添加WM_TIMER消息的处理函数的方法是,在VS2010工程的Class View类视图中找到要添加定时器的类,点击右键,选择Properties,显示其属性页,然后在属性页工具栏上点击Messages按钮,下面列表就列出了所有消息,找到WM_TIMER消息,添加消息处理函数。
2.CComboBoxEx 的使用与 原来的CComboBox不同
添加项时,注意不能直接AddString,只能用InsertItem()来添加COMBOBOXEXITEM类型的。具体看msdnhttp://msdn.microsoft.com/zh-cn/library/cb8f2x66.aspx。下面只给出简单的添加文本的示例:
COMBOBOXEXITEM Item;
Item.mask = CBEIF_TEXT ;
Item.pszText = _T("Text Sample");
Item.iItem = 0;//index
m_comboboxex.InsertItem(&Item);
3.OpenCV 与 Picture控件显示图片的问题
要把opencv的窗口嵌入mfc框架
///@brief 将使用OpenCV生成的窗口嵌入MFC框架 ///详细说明 ///@param[in] pWnd - MFC中显示图片控件的句柄 /// csWndName - OpenCV中生成窗口的名称 用于获取句柄 /// nTarWidth - 目标窗口的宽度 /// nTarHeight - 目标窗口的长度 ///@pre NULL ///@return NULL ///@retval NULL ///@post NULL void DisplayFrame::SetOpenCVWindow(CWnd *pWnd,CString csWndName, int nTarWidth,int nTarHeight) { char *pWndName = csWndName.GetBuffer(); cvNamedWindow(pWndName, 0); HWND hWnd = (HWND)cvGetWindowHandle(pWndName);//显示控件 HWND hParent = ::GetParent(hWnd);//父窗口 ::SetParent(hWnd,pWnd->m_hWnd); ::ShowWindow(hParent,SW_HIDE);//隐藏显示窗口控件 pWnd->SetWindowPos(NULL, 0, 0, nTarWidth, nTarHeight, SWP_NOMOVE | SWP_NOZORDER); cvResizeWindow(pWndName, nTarWidth, nTarHeight); }
///@brief 使用OpenCV中的函数对单张图片进行显示 ///详细说明 ///@param[in] csWndName - 目标显示窗口的名称,需使用OpenCV的中创建时的名称 /// pImg - 待显示图片的指针 ///@pre NULL ///@return NULL ///@retval NULL ///@post NULL void DisplayFrame::ShowPicture(CString csWndName,IplImage *pImg) { char *pWndName = csWndName.GetBuffer(); cvShowImage(pWndName, pImg); }
4.控件的美化问题
之前用的CDialog,要美化界面,需要ps一些位图,设置大小重绘之类的。以为现在的CDialogEx可以直接设置多个样式,查找许久资料后发现,只不过可以设置背景颜色和图片,其他的没什么,要美化界面还是需要之前的操作。
SetBackgroundColor(RGB(0x79,0xcd,0xcd));
SetBackgroundImage()