Vs2010 MFC 简单制作过程中的问题

以前做过一段时间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()


 



你可能感兴趣的:(mfc,VS2010,opencv)