博文

改变MFC主窗口的标题(单文档和多文档)(2010-08-24 19:51:00)

摘要: 改变主窗口的标题有两种:

第一种方法:

利用ResourceView打开工程的资源,修改String Table中的IDR_MAINFRAME的值。将原来的“SDITitle\n\nTitle\n\n\nTitle.Document\nTitle Document”改为“标题改变示例\n\nTitle\n\n \nTitle. Document\nTitle Document”。这样改变后,主窗口标题栏的形式就为“((((-标题改变示例”。

第二种方法:

具体改变方法如下:

改变CSDIMainFrame的成员函数PreCreateWindow()为:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
m_strTitle = " 我的标题 ";
return CFrameWnd::PreCreateWindow(cs);
}
这改变后,标题栏的形式就为“((((-我的标题”。
m_strTile是CFrameWnd的保护成员(令人惊奇的是,Visual C++ Books Online 4.0不显示类的保护和私有的成员及函数。所以在m_strTile处按F1键,得不到相应的帮助。要得到m_strTile更详细的信息,请打开\ msdev \ mfc \include \afxwin.h文件)。CSDIMainFrame则是CFrameWnd类的派生类。
在这两种改变方法中,第二种方法优先级高。也就是说,改变了m_strTitle的值后,IDR_MAINFRAME的值就不起作用。

二·对多文档接口(MDI)类型窗口标题的改变

MDI类型窗口标题中,主窗口标题和文档标题的次序,和SDI类型窗口中次序是不同的。结合具体例子说明,用VC的AppWizard创建一个名为“MDITitle”的多文挡类型的工程。创建完工程后,编译运行该工程,主窗口标题形......

阅读全文(10733) | 评论:2

IP切换器(Win7)(2010-08-18 19:17:00)

摘要:移动办公最麻烦的就是每到一个地方就要换一次IP地址啦。比如实验室啦,机房啦,网吧啦,宿舍啦,家里啦等等。每次都要输入IP,DNS等等,烦不胜烦。目前一些厂商有软件支持新建多个IP方案,按照名称进行切换,但是好像与品牌兼容。笔者最近刚用Win7,搜索了一下支持Win7的中文版的IP切换小软件,发现有2款不错。   一个是叫“自由人IP切换器”,名字不错,是吧。呵呵。比较好用。新建方案弹出的界面跟Windows一样,很熟悉,很方便。它会保存用户的设置在当前目录下的app.xml里面,不要删除了哦         另一款就是Win7总管啦。总管就是总管,无意中在【网络设置】下竟然也有IP切换的功能,不错不错,考虑的很全面。     ......

阅读全文(18851) | 评论:11

VS2008 界面 Unicode MultiByte(2010-08-16 20:35:00)

摘要:1、 使用unicode后,编译的窗口风格是XP的风格。而如果用多字节(Multibyte)编译,则窗口的风格是老式的,如Win2000系统那种风格。原因在于stdafx.h中的设置:            其实只需要将:  #ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Control......

阅读全文(6167) | 评论:1

一个结婚七年的男人总结 恋爱不是喜欢就够的(2010-08-16 19:57:00)

摘要: 【转】 一个结婚七年的男人总结 恋爱不是喜欢就够的 来源: 戴淑怡的日志
今年,我和老婆已经认识十年了,三年恋爱,七年婚姻,仍然保持着恋爱的新鲜感,让身边的朋友羡慕不已。许多还在单身的MM和我们接触后,就有想快点找个人嫁的冲动。 许多朋友问我们怎么结婚七年了还这么好?于是开始总结一些婚姻生活中的点点滴滴。每对恋人或夫妇的性格和相处方式其实都不一定相同,以下内容可能适合,可能不适合。祝愿全天下有情人都能找到自己的幸福!   婚后一定要时刻把结婚戒指戴在左手无名指上!佩戴结婚戒指明确表明了你的婚姻状态,同时也明确表明了你拒绝外来诱惑的坚定态度。   两人一起出去参加饭局的时候,看到喜欢的菜又不好意思夹太多次的时候,可以互相夹给对方吃。   经常参加另一半的朋友聚会。这样可以扩大社交圈,也可以增加许多共同的话题。   单独在外要经常把另一半挂在嘴边。   两人吵完架后,可以互换角色再重复一遍刚才吵架的内容,保准你们笑破肚皮!   从很久以前开始,谈话中“我们”出现的次数超过了“我”的次数。   在心爱的女人面前,越贱越快乐!   男人工作再忙也要承担一点家务,这是对家庭的责任。像我,负责洗碗、洗衣服、倒垃圾、锁门、拿报纸这几项常规任务,还有许多临时任务,最多的临时任务就是找东西。许多人都讨厌洗碗,而我特别喜欢洗碗。看着一堆油腻的脏碗逐渐被洗干净很有成就感。   在她洗澡的时候悄悄帮她把拖鞋换个方向,要刷牙的时候帮她把牙膏挤好漱口水倒好,一些平时生活上的举手之劳虽然小,但是能一直让她感到温暖和贴心。   和同事朋友聊天的时候(特别是异性),要经常把另一半挂在嘴边,亲身体会事实证明,可以与桃花绝缘。   有空不妨参与另一半的工作,比如帮忙上网找资料,整理整理东西。一方面可以两人合作做点事情,另一方面了解另一半的工作,可以增加许多话题。   夫妻之间不需要隐私!我们的电子邮件、msn、QQ、阿里旺旺的密码互相都知道,有时需要帮忙收发邮件很方便,手机也经常互相借用。心里坦坦荡荡,有什么不能让对方知道的呢?     副驾驶的位子是老婆的专座......

阅读全文(5011) | 评论:3

AfxGetResourceHandle失败原因(2010-08-15 10:04:00)

摘要:我们都知道在MFC扩展库中创建对话框资源并显示出来,必须用到AfxGetResourceHandle与AfxSetResourceHandle两个函数(具体原因不再详述)。但是前不久在项目中竟然发现这样设置以后,对话框弹出仍然报错。调试发现,竟然是AfxGetReourceHandle失败,让人顿生奇怪。为什么会失败呢?   经过多方查证,终于定位原因是我新建的MFC扩展库是Unicode类型从而导致失败的。不过为什么会这样,只能留到以后去查证了。另外,如果你发现使用CString的时候出现了一大堆编译错误,多半也是这个原因,小心小心。   ......

阅读全文(9179) | 评论:3

lib与dll生成在不同路径(VS2008)(2010-08-14 21:51:00)

摘要:对于动态库,我们一般都知道如何设置dll的生成目录,链接时lib会与dll生成在同一目录下。但是有些项目的工程设置会要求把dll与lib生成在不同的目录下。如果我们每次都从dll目录下拷贝lib到特定目录下,不仅浪费时间,而且经常忘记了去覆盖而导致一些链接错误,因此最好的办法还是分别生成到不同的目录下。   对于VS2008,打开工程属性,选择【Link】-【Advanced】-【Import libraries】设置即可。          关于工程设置,还有一些要注意的。例如在VC6下面设置好的工程路径转为VS2008工程的时候,要了解VC6工程转换过来的信息,除了在基本的一些Output里面之外,还有两个隐蔽的分别在【C/C++】- 【Precompiled Header】与【Output Files】下面和【Linker】- 【Debugging】下面,小心哦......

阅读全文(8681) | 评论:0

SVN监视软件CommitMonitor(2010-07-23 10:11:00)

摘要:最近找到了一款极其好用的软件CommitMonitor,它可以监视SVN的一举一动,Team成员之间再也不用去相互通知是否该更新代码了。     当有更新时,在每个成员的屏幕右下角都会有这样的提示:     官方地址在这里:   http://tools.tortoisesvn.net/   如果有需要其中文操作说明的话,请留下邮箱吧。   (最后庆祝一下编程爱好者博客的文章编辑器终于改版了!值得鼓励!但是从电脑上传图片的功能欠缺)......

阅读全文(5973) | 评论:11

绕给定轴的旋转插值(2010-06-04 17:08:00)

摘要:有些时候希望从一个向量A绕一给定轴旋转到另一个向量B,并对其进行插值(比如动画)。如果给定轴恰好为AB平面的法向量,则以其为旋转轴可以直接构建四元数,取旋转角度步长为1°或者更小即可。最大旋转角为AB向量之间的夹角。当步长累积超过最大旋转角时,停止插值。但是当给定轴是其他时,最大旋转角为多大呢?     如图所示,P为给定轴,现在要对A绕P旋转到B进行插值。实际上这个问题可以看做是PA平面绕P旋转到PB平面的问题。设PA法向量为N1,PB法向量为N2。因此最大旋转角为N1和N2的夹角(两个平面的夹角)。       示例代码如下:   // vCur为当前旋转向量(in/out),dRotateStep为旋转步长,vAxis为给定轴,vOri为起始向量(A),vTar为终止向量(B)     BOOL InpByQuaternion(Vertex3d& vCur,double dRotateStep,Vertex3d& vAxis,Vertex3d& vOri,Vertex3d& vTar) {        Vertex3d vTempCur = vCur;        vTempCur.Normailize();          Vertex3d vTempNormalOri = vAxis ^ vOri;              // 计算N1        Vertex3d vTempNormalTar = vAxis ^ vTar;   // 计算N2      Vertex3d vTempNormalCur = vAxis ^ vTempCur; // 计算当......

阅读全文(5027) | 评论:2

CListBox自绘与刷新(2010-06-03 21:28:00)

摘要:
CListBox自绘的具体步骤就不再详述了,不过还是要留意以下几点:   LBS_OWNERDRAWVARIABLE:允许每一项有不同的长度。要想改变某一项的高度,通过MeasureItem无法做到(宽度可以)。需要用到函数SetItemHeight。   LBS_NOTIFY:只有加入该风格,CListBox才能响应双击等消息。   DrawItem:核心自绘函数。不过并不建议直接使用CListBox的DC来绘制,而是采用双缓冲的方式,可以有效的在Invalidate(FALSE)时减小刷新。   本文主要介绍实际应用中的一种情况。有些时候,当双击CListBox某一项的时候,我们希望它能展开,显示更多的信息;再次双击一下,能够收缩,回到正常状态。功能的具体实现很简单,只需要调用SetItemHeight实时调整大小,在DrawItem判断该项是否为展开项来进行显示。       但是,在刷新显示的时候碰到一个问题。当双击收缩最后一项时,如果调用Invalidate(TRUE),自然会产生轻微的闪烁;本文采用了Invalidate(FALSE)来避免闪烁,却发现最后一项收缩后显示正常,但是刚才扩展的区域,因为未刷新,仍然显示刚才的内容,这种效果显然是不正确的。造成的主要原因是因为DrawItem只会负责绘制该项的区域,如果不实时改变每项的高度,这已经足够了;但是由于每项高度在双击后会改变,因此其有义务维护上一次该项的绘制区域。   因此一个技巧就是在绘制最后一项时,判断其是否因为收缩而需要刷新,如果是,则利用双缓冲绘制时,需要绘制从该项往下整个客户区(或者展开区域);如果不是,则绘制其实时区域。         核心代码如下:         // 如果不是最后一项 绘制其实时区域(展开或者收缩)        if(lpDrawItemStruct->itemID != GetCount() - 1)   &......

阅读全文(8620) | 评论:2

绕不动点旋转(2010-05-21 18:26:00)

摘要:   玩过Google Earth操作的人都知道,其中键操作非常方便。以中键按下的点为不动点,鼠标操作的方向进行旋转,与仅仅绕场景中心旋转的方式要灵活许多。    
    本文主要介绍了简单的几何实现。  
  如图所示,E为视点,C为场景中心,P为中键按下点。此时如果鼠标沿屏幕X方向移动,表示,场景沿水平方向转动;若沿屏幕Y方向移动,场景在CEE’竖直平面内转动。   1、场景沿水平方向转动比较简单,E和C分别以旋转轴为Z轴,以P为旋转中心,转动的角度按照屏幕X方向移动的距离比例计算出来,通过四元数计算新视点和新的场景中心。   2、场景在CEE’竖直平面内的转动要复杂一点。首先我们要计算P在这个平面内的投影P’。此时E和C分别以P’为旋转中心,PP’为旋转轴,转动的角度按照屏幕Y方向移动的距离比例计算出来,通过四元数计算新视点和新的场景中心。        相关代码如下:   void CCamera::RotateScene(double alpha_add, double beta_add,Vertex3d NonMovePoint) {        // 绕不动点旋转        // 用四元数来实现modified by XWP          Vertex3d vZAxis(0,0,1);        Quaternion qq(-alpha_add*3.1415926,vZAxis);          // 先绕平面上的角度转动        Vertex3d curOrient = NonMovePoint - m_Eye; &n......

阅读全文(5355) | 评论:0