本文共 2509 字,大约阅读时间需要 8 分钟。
这几天在用MFC做ui的时候遇到一个看起来很简单的问题,但是折腾了好久,最后在同门和老师的帮助下解决了这个问题,对MFC有了更深的理解,特此记录一下。
实现功能:右边添加车型对话框可以选择车型,不同车型有不同的坡度(车型属性)。单击选择键,实现左边视图窗口车型改变为左边选择的车型,同时将坡度属性也传递到左边的视图类。
说明:
public: double slope; CString vehiclename;
方法1:MFC消息映射机制
消息映射机制:把指定的消息交给指定的函数进行处理的方法,这样就形成了一个<消息,处理函数>对。消息映射可以在本类中实现,也可以跨类实现。
下面是是将消息映射添加到一个类中所做的全部工作:本类和跨类的区别在于跨类需要一个投递消息的函数,如PostMessage()或者SendMessage(),函数投递出去的消息由消息响应函数接收。::PostMessage()函数参数:
BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
思路:
类向导添加自定义消息和消息处理程序
获取车辆信息视图窗口(左)的句柄;
利用::PostMessage()函数发送消息,由左侧视图窗口类的OnAddVehicle()函数响应。注:m_vehicle为左侧窗口里的Group Box控件的变量,SetWindowText()改变车型名字;
afx_msg LRESULT VehicleFormView::OnAddVehicle(WPARAM wParam, LPARAM lParam){ //CImageGridDoc* m_pDoc = (CImageGridDoc*)GetDocument(); pDoc = (CImageGridDoc*)GetDocument(); m_vehicle.SetWindowText(pDoc->vehiclename); return 0;}
错误:
调试后没有出现错误,点击选择按钮没有任何变化,消息响应函数没有被调用。Debug后发现获取句柄出错,并没有获取到窗口的句柄。方法二:跨类调用函数
思路:
两个类互相包含头文件,在添加车型窗口里面new一个车辆信息的对象,利用成员函数实现改变。 错误: 此方法出现了各种内存错误,没有一次通过编译。本人能力有限,并没有解决这些问题,而且感觉这个方法也不太好,随即放弃了这条路。方法三:利用Doc类
参考博客: 此博客提供了一个很好的方法,但是中间还是遇到了问题。问题:
对话框窗口类没有m_pDocument成员变量,无法直接获取Doc类的指针。中间想把对话框改为CFormView模拟对话框,但是老师给我提供了 一个新的方法,后面会详细说明。方法一:
CMainFrame *pMwnd = (CMainFrame*)AfxGetMainWnd(); VehicleFormView *vehicle =(VehicleFormView*)pMwnd->m_treespliter.GetPane(1, 0); //CWnd *pGroupBox = vehicle->GetDlgItem(IDC_STATIC_VEHICLE); //pGroupBox->SetWindowTextW(vechiclename); ::PostMessage(vehicle->GetSafeHwnd(), WM_ADDVEHICLE, (WPARAM)WM_ADDVEHICLE, (LPARAM)0);
此方法利用了主窗口的指针作为中介,找到之前划分窗口得到的指针,用CSplitterWnd类的CWnd* GetPane( int row, int col )函数获取窗口指针,再用GetSafeHwnd()获取句柄。
此方法奏效后,又尝试直接在对话框类(右)直接设置视图窗口(左)控件名字,方法是利用GetDlgItem()获取控件的指针,然后直接使用SetWindowText()函数,代码为注释掉的那部分。方法二:
未解决
方法三:
还是利用MainFrame作为中介,获取Doc类的指针
参考CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd(); //获取MAIN指针 CImageGridDoc* pDoc = (CImageGridDoc*)pMainFrame->GetActiveDocument(); int index = m_combo.GetCurSel(); m_combo.GetLBText(index, pDoc->vehiclename); //获取车型 pDoc->slope = m_slope; //获取坡度
具体如何调用函数的,在走通了方法一后,我没有再去尝试了。后面解决这个问题为的是可以实现数据在Doc类中共享。
通过解决这些问题,对MFC有了更深些的理解。总结下来:
感谢老师和同门对我的帮助,第一次些博客,如有错误,请多多指导!
转载地址:http://wcavi.baihongyu.com/