项目中使用到的MFC技术总结

       本应该是在大学就轻车熟路的东西,结果因为自己的懒惰,浪费了大好青春,对所学的东西一知半解又没有做过什么完整的项目,所以,进入工作的我还处于一边学习一边实践的状态。刚入公司第一话i代码任务是做一个连接设备的客户端,因为需要使用公司的SDK,所以这里只记录所用到的关于MFC的东西,免得下次用的时候又忘记。3周辛苦努力的东西,却有许多已经印象模糊,悲剧,今天整理了一下,下写一些,其他的等想起来了再说吧。

1.  绝对路径与相对路径:绝对路径不用说了,相对路径要写成”..\\abc\\文件名”的形式。

2.  实现子对话框与父对话框通信的方式:有两种,第一种是定义一个父对话框类的全局指针变量g_pMain,在父对话框初始化的时候就将这个指针用this赋值,这样,以后每次调用g_pMain就是对父对话框的调用,通过这个指针可以使用父对话框的成员。第二种是在子对话框要使用父对话框的部分定义一个父对话框指针,  CclientDlg *client = (CclientDlg*)GetParent();这样再使用client就可以调用父对话框的成员。

3.  创建快捷菜单:

CMenu pMenu;

pMenu.LoadMenu(IDR_MENU_CHANNEL);

pMenu.TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this);

这样三条语句就可以创建一个快捷菜单

4.  设置菜单中的菜单项是否可用并是否显示为灰色:

pMenu.GetSubMenu(0)->EnableMenuItem(5,MF_BYPOSITION | MF_ENABLED);这里的pMenu就是3中的pMenu。GetSubMenu函数的作用是活的菜单的句柄。因为这里是快捷菜单,所以参数是0。如果是正常的菜单,那么根据菜单的相对于0的位置填写参数,比如对于word2007来说,要想获取“开始”,则参数为0,“插入”,参数为1,依次类推。之后再调用EnableMenuItem设置,其中的第一个参数为相对于菜单顶部的位置,如。设置问题不可用

pMenu.GetSubMenu(0)->EnableMenuItem(5, MF_BYPOSITION|MF_DISABLED|MF_GRAYED);

5.  在对话框上显示当前时间:先要添加OnTime消息函数

   CTime time = CTime::GetCurrentTime();

    CString sTime = time.Format( _T("%Y年%m月%d日\r\n%H:%M:%S"));

GetDlgItem(IDC_STATIC_TIME)->SetWindowText( sTime);

CDialog::OnTimer(nIDEvent);对于重写的消息函数最好都加入对话框基类的该消息函数。

6.  对于treeCtrol控件的使用。

构建树与插入节点

首先要定义HTREEITEM类型的变量:HTREEITEM hTreeItemDevice;m_tDeviceList是控件的对象。然后hTreeItemDevice = m_tDeviceList.InsertItem(lpctstr,0,0,m_hRoot);这里的m_hRoot也是HTREEITEM类型的变量,也代表以后所要插入的子树要插入到那个节点下,而函数返回值就是插入的节点的HTREEITEM,有了这个值就可以再在这个子树下继续插入子树。第一个参数是代表插入后的显示的文字。不可以直接用CString,可以对CString的对象直接进行强制类型转换。以上是插入节点的工作。如果以后要对树进行操作,也就是说要选择树上的节点,那么要为插入的节点匹配一个值,m_tDeviceList.SetItemData(hTreeItemDevice,m_treeNodeNum);

这里hTreeItemDevice就是这棵树的节点,m_treeNodeNum就是值。插入工作到此结束,可以利用这样的过程层层构建,就可以完成一棵树的构建工作。

选择树的节点:

HTREEITEM hSel = m_tDeviceList.GetSelectedItem();  //取得选项句柄

DWORD cText = m_tDeviceList.GetItemData(hSel);   //取得数据项名

这样就可以得到刚才SetItemData给节点设置的一个值,可以通过这个值知道选择了那个节点,并进行相应操作。。

还可以用另外一种方法:

CPoint pt;

    GetCursorPos(&pt);

    m_tDeviceList.ScreenToClient(&pt);

HTREEITEM hItem = m_tDeviceList.HitTest(pt);

这里hItem就是选择的树节点的HTREEITEM值。这样也可以进行相应的操作。

判断所选择的节点层次:

对树的不同层次可能要做不同的工作,所以要确定选择的层次。第一种是在设置节点对应的值的时候,每个父节点与下一个父节点间的差值比较大,这样就可以通过子节点的值知道它是那一层,同时还知道是那个父节点下的子节点。比如字母(a,b,c),数字(1,2,3)这里可以将“字母”设置为1000,“a”,“b”,“c”分别为1001,1002,1003,“数字”设置为2000,依次类推,这样当GetItemData的返回值是整千时就知道是父节点。

第二种方法效率没有这个高,单对于层次非常多的树比较好用。

根据HitTest()函数返回的值,判断该值处于那一层。这里可以利用m_tDeviceList.GetItemData(hItem)进行。这个函数是得到其父节点的,可以多次获取父节点,知道为NULL,这样获取了几次,就是第一层。当然,这种方式在设置节点值的时候就可以连续设置,值需要知道当前节点的值与其父节点的值,就可以通过这两个值进行差值计算,知道这个节点是其父节点的第几个节点。

7.  分屏问题

所谓分屏,就是在主对话框的一个区域(我用的是一个静态文本框)上,放置几个小的对话框,当然这种应该是无边框的对话框(在对话框的属性中可以设置,并且要将这个对话框的style设置为child否则小的对话框不会随着主对话框移动而移动)。

GetDlgItem(IDC_STATIC_PLAY)->GetWindowRect(&m_cRect);

ScreenToClient(m_cRect); m_cRect就是一个Rect的变量。这个函数是为了将屏幕坐标变为对话框坐标。

然后认为计算每个对话框的大小,再利用MoveWindow函数将对话框放置到指定位置,就完成了分屏。这个分屏与view是不同的,其实并不是严格意义的分屏。

8.  全屏显示

这个全屏显示就是指整个屏幕的显示,而不是某一指定区域的显示,这个其实我还没有搞清楚,但是却实现了功能,很晕。先记录下来再学习。

9.  CListCtrl的使用这里所用到的是report模式,也就是每一行包括多个数据项。先用先用insertItem插入数据项的名称,再用InsertItem插入每一行的第一个元素,接下来才是使用SetItemText将每一行的后面的数据项插入。

10关于“无法定位程序输入点。。。。。。。于动态链接库。。。。。。上”的错误。这个是因为.dll文件不正确造成的。这个错误出现在连接时,编译可以通过。程序先可执行文件所在文件夹,然后查找工程名文件夹下的.dll文件,然后是当前目录文件,再然后是系统文件。因为我的前两个没有找到,所以去查找系统文件,而系统文件的版本又不对,所以不会再去查找path路径,所以错误,只需要将正确的.dll文件放入到可执行文件所在文件夹就可以了。

今天先写到这里,下周又会新的学习任务,早知今日需要在如此压力下学习,当初那么清闲的日子何必让它偷偷流去啊。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值