第一次是来面试,当时感觉不怎么好,面试的人问了一些问题有些没回答上来,这并不奇怪,c#自己学习了2个月,然后就没怎么用,回答不上我觉得可以理解。没想到还能第二次来到公司,由于对环境还比较陌生,所以今天大概熟悉了一点,成都这边有50多个员工,属于研发中心,主要从事无线微波得较大型的设备的再加工,听同事说以前在北京,但由于北京人力资源太贵所以来到成都,这听起来怎么像是在压榨的感觉啊,没关系,只是来实习而已。
对于今天的第一个小任务,要求:界面、数据压入堆栈、简单冒泡排序实现数据有序输出、堆排序输出。让我快速地熟悉了c#,从界面到后台都得到了加强,此外在实现过程中对用到的冒泡排序和堆排序有了更深的理解,并能用c#熟练的实现。
今天继续昨天的任务,做一个小测试,将现今做的项目所有代码进行整合测试,测试要求是在数据库中配置菜单项,动态添加几项菜单项,在不同点击下动态从dll中加载窗体读取配置文件进行排列,顺利完成。
我们在使用tooltip的时候,有以下几个关键点:
1,创建CToolTipCtrl对象,Create函数实现。
2,使用AddTool函数向这个tooltip中加入tools,这也是绑定tool到某个控件的过程,从中我们可以知道在这个CToolTipCtrl对象中应该存在着不止一个tool,而是一系列的tool,通过函数DelTool实现删除,AddTool实现添加,UpdateTipText实现更新tool的文本。
3,最关键的是我们需要一个触发tooltip的关键点,这个关键点控制着何时显示这个tooltip,一般情况下我们在PreTranslateMessage函数中进行处理,这也是我们拦截WM_MOUSEMOVE的地方,拦截之后,我们调用tooltip的RelayEvent向toolTip对象传递这个消息用以表示tooltip可以被显示或者更新。
静态链接MFC DLL模块的时候,由于MFC总是使用它所练级额的DLL模块状态,所以不存在模块管理的问题。
调试DLL的时候,我们需要exe文件的配合,所以先要生成exe测试文件,然后将DLL工程设置成active ,这时候会出现exe路径提示对话框,我们将测试用的exe路径填入就可以了。
今天对昨天的实例进行了改进和提高,将堆排序和冒泡排序封装在一个动态链接库中,提供函数调用和事件委托。此外加入xml进行配置,在xml中存入相关配置信息,提供一个单独的xmlclass对其进行操作,加深了对xml的理解。为增加程序的性能,采用简单工厂模式对其客户端和算法操作进行分离,有很好的可扩展性,对于c#的动态链接库和xml配置不怎么熟悉,花了很长一段时间看书和网上查资料,才开始动手写代码,不过感觉还是很快,因为自己有编程的能力,可以说掌握了一种快速编程的方法,所以就能驾轻就熟。
由于黎甫对dll的要求发生变化,今天就不断修正dll程序,并验收,再结合group的窗口排列方式对dll中的窗体进行测试。我现在才明白,编写代码是一件很容易的事,但是编写好的代码却是很难的事情,好的代码要有可维护性、可扩展性,这样在修改的话就很简单,可不能像我昨天写得代码,根本谈不上艺术,所以一旦面对客户的要求,改动就很困难,这一点值得我继续学习。
至于可扩展性也是对维护的扩充,因为顾客的要求有可能随时都在改变,我们也得适应客户的要求,如果软件有了可扩展性,那么它的改动就比较小,就能适应顾客的要求。所有上面说的这些都是自己要学习的地方,这样在以后的商业开发中才能游刃有余,应对自如。
今天采用抽象工厂模式对实例进行改进,以达到动态加载算法实例,抽象工厂模式属于设计模式中的内容,自己在学习视频的时候注意到了,所以之前就买了本大话设计模式来学习,可以说了解了大部分设计模式。今天遇到后自己心里也有底,温故一下书就知道怎么做 了,可以说这是我学习的方法。
针对以上,在dll中提供一个接口,两个算法都继承了该接口,对于该dll的操作都通过接口isort进行,此外,修改工厂为抽象工厂,提供一个接口创建算法,在算法中返回isort实例,在主函数中使用该实例进行对应的排序算法操作,充分显示了抽象工厂的作用,本例子将反射和抽象工厂模式结合,增加了程序的可扩展性和可维护性。
CToolTipCtrl 函类中的RelayEvent函数的存在理由,试想当我们的鼠标在一个窗体上滑动的时候,会发生什么情况,如果鼠标下方的窗体是一个子窗体,那么这个子窗体将会收到鼠标的消息,而主窗体的鼠标消息因此被屏蔽,windows是通过这种方式来处理消息的,这里CToolTipCtrl对象也需要受到消息来进行处理,但是这些鼠标消息却不能流向CToolTipCtr对象,这就是问题的关键之所在,如何将消息导向CtoolTipCtrl就成了关键,一般我们会在PretranslateMessage函数中拦截消息之后使之导向CTOOLTipCtrl,这个导向所用的函数就是RelayEvent函数。
有关ToolTip控件的讨论目前还存在疑惑,1当我们使用LPSTR_TEXTCALLBACK的时候,为什么ON_NOTIFY可以得倒响应消息,却会在某个时间点出现Stack run over的错误。
ListCtrl中LVITEM lpara有很广泛的用处,我们可以通过这个参数实现list控件的排序功能,这里需要注意的是使用LVITEM中的LPARAM,但是SetItemData 函数似乎又是对LVITEM 的lPara进行设置的,这里的关系似乎很微妙,但是我们一定要注意 不能混淆。类中的成员函数可以单独的声明为模板函数,但是模板函数的实现要放在头文件中。GDI+中没有提供绘制圆角方的函数,我们需要通过GraphicPath类进行模拟来实现。
鼠标跟踪消息的要点:响应消息WM_MOUSEMOVE WM_MOUSELEAVE WM_MOUSEHOVER 在WM_MOUSEMOVE消息中处__TrackMouseEvent函数。
Can not connect to database! error: Cannot assign requested address |