博文

[置顶] VC程序重定向printf到console窗口(2012-07-26 12:41:00)

摘要: 本方法简单易用,适用于VC6、VC.NET2003 假定你创建的VC应用程序叫做ImageFilter,那么只需添加如下代码即可: [1] 打开ImageFilter.cpp文件,增加 #include <io.h>
#include <fcntl.h> 
void InitConsole()
{
 int hCrt; 
 FILE *hf; 
 AllocConsole(); 
 hCrt = _open_osfhandle( 
  (long)GetStdHandle(STD_OUTPUT_HANDLE), 
  _O_TEXT ); 
 hf = _fdopen( hCrt, "w" ); 
 *stdout = *hf; 
 setvbuf( stdout, NULL, _IONBF, 0 ); 
 printf("InitConsoleWindow OK!\n\n"); 
}   [3] 在函数'BOOL CImageFilterApp::InitInstance()'调用该函数: ......

阅读全文(3276) | 评论:1 | 复制链接

[置顶] 如何在VC2008中调用Fortran?(2012-07-26 10:45:00)

摘要: 两种方法:   (1)直接使用Fortran代码编译出来的obj文件进行链接。使用IVF(Intel Visual Fortran Compiler)进行编译得到obj文件,在VC2008中进行加入其link即可,如test1.obj。   (2)在Fortran函数声明中加入DLLEXPORT项,令其成为导出函数,在VC2008加入test1.lib的link即可。注意不管Fortran中是subroutine还是function,都要加入形参类型的声明,方可导出: double precision function addF(x, y) !DLLEXPORT选项 !DEC$ ATTRIBUTES DLLEXPORT, STDCALL:: addF !形参类型声明 double precision x, y addF = 2 return end function addF   不管上述哪种方法,最后注意在VC2008中调用函数前进行声明,如: extern "C" double __stdcall addf(double x, double y);   如果还有不清晰的地方,请用google搜索文章《基于VS2008 和IVF11 的C/C++和Fortran 混合编程》,内有详细介绍。 ......

阅读全文(2290) | 评论:1 | 复制链接

[置顶] 组合,关联,聚合的区别(转)(2009-06-03 14:48:00)

摘要: 类间关系 在类图中,除了需要描述单独的类的名称、属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造比单独工作更大的语义。在UML类图中,关系用类框之间的连线来表示,连线上和连线端头处的不同修饰符表示不同的关系。类之间的关系有继承(泛化)、关联、聚合和组合。 (1)继承:指的是一个类(称为子类)继承另外的一个类(称为基类)的功能,并增加它自己的新功能的能力,继承是类与类之间最常见的关系。类图中继承的表示方法是从子类拉出一条闭合的、单键头(或三角形)的实线指向基类。例如,图3.2给出了MFC中CObject类和菜单类CMenu的继承关系。 类的继承在C++中呈现为: class B { }  class A : public B{ } (2)关联:指的是模型元素之间的一种语义联系,是类之间的一种很弱的联系。关联可以有方向,可以是单向关联,也可以是双向关联。可以给关联加上关联名来描述关联的作用。关联两端的类也可以以某种角色参与关联,角色可以具有多重性,表示可以有多少个对象参与关联。可以通过关联类进一步描述关联的属性、操作以及其他信息。关联类通过一条虚线与关联连接。对于关联可以加上一些约束,以加强关联的含义。    关联在C++中呈现为: class A{...}  class B{ ...}  A::Function1(B &b) //或A::Function1(B b) //或A::Function1(B *b) 即一个类作为另一个类方法的参数。 (3)聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。 (4)组合:也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。   聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合......

阅读全文(2316) | 评论:1 | 复制链接

[置顶] 怎样衡量一个人的编程能力(2006-11-29 20:36:00)

摘要:十一很快过去了,真快,还没怎么玩好.不过我最高兴的还是在这段时间完成了一个小的矢量图形系统,用VC做的.虽然GIS专业已经有'老大'--ArcGIS,但是我们这些将来的专业人员以后还要从事2次开发的,所以先做2个小程序当作锻炼把. 这个系统没什么大的功能,就是搞搞数字化,单点查询,单源查询,单对查询等等.最好玩的还是单对了.就是查询2点的最短路径.这个的算法有很多,于是我上百度上搜啊搜,没有一个搞的定.最后还是采用了迪杰斯特拉算法,最不好意思的就是这个算法是上学期数据结构中学过的,呵呵. 通过这次实习,我也发现了一个问题.好多人在学习可视化编程的时候,只注重界面设计,并不重视流程控制,功能实现,内部机制等.结果是学了VB忘了C,学了VC忘了C++,其实我认为后者才是最重要的.它是衡量一个人程序设计能力的标准.陈建春在有本书上写的蛮好: "程序设计者特别是初学者应该认识到,程序设计的最终目的是为了完成具体的任务,所以在应用程序设计中,程序的框架和界面等部分在一个程序中占的比重是最小的,并非程序设计的本质. 程序设计的能力体现在对数据的组织和控制,流程的控制等上面,不同的计算机语言虽然各有特点,但是几乎所有的计算机语言其设计思想是内在相通的,程序设计能力的高低与采用哪种计算机语言没有必然的联系" 上面这段话让我茅塞顿开.不能为了学习一门语言而去学习语言,它是用来与计算机沟通交流的.学了语言就要去应用,这样才能更好的掌握.......

阅读全文(6639) | 评论:3 | 复制链接

MFC下多线程UpdateData的使用方法(2011-05-13 23:30:00)

摘要:线程中是不可以调用父窗口的UpdateData,原因如下:   当创建窗口的线程和UpdateData调用所在的线程不是同一线程的时候MFC就会出错。为MFC把部分信息储存在线程的TLS中,这些信息对于MFC的执行非常重要,因此MFC会在很多代码里面检查线程状态是否正确。当在线程中调用父窗口的UpdateData时,相对于UpdateData的线程环境已经改变了,所以就会出错了。 可以使用如下方案:
1,在线程中使用 pDLG->GetDlgItem(ID)->SetWindowText(str)
2,线程向父对话框发送自定义消息,消息响应函数里调用UpDateData,该方案详见: http://blog.csdn.net/zfpnuc/archive/2010/10/15/5944219.aspx   在randomDlg.h  //定义用户消息,不可与系统消息冲突,所以就这样定义   //WM+USER表示用户消息,加100还是加其他值并没多大区别的   #define WM_MYUPDATEDATA WM_USER+100   在线程内 //向主程序框架MainFrm发送消息   //SendMessage第二第三参数可以为其他更多的类型,不局限于此   DWORD RondomLeftThread(CRandomDlg *p)   {         p->SendMessage(WM_MYUPDATEDATA,FALSE);   }   //调用线程的地方   hThread_1=CreateThread(NULL,           0,       ......

阅读全文(7032) | 评论:1 | 复制链接

VC中复制字符串到剪贴板(2011-05-03 10:30:00)

摘要: 保存至剪贴板:
        //定义字符型变量用来保存用户输入的数据
        CString str;
        HGLOBAL hClip;
        //定义一个HGLOBAL句柄变量用来指向分配的内存块
        if (OpenClipboard())
        {
            EmptyClipboard();                            //将剪贴板内容清空
            hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);
            //在堆上分配可移动的内存块,程序返回一个内存句柄
            char * buff; &nb......

阅读全文(3596) | 评论:1 | 复制链接

modf函数(2011-04-28 17:03:00)

摘要:modf ()函数
-
-
 
modf
语法:    #include <math.h>  double modf( double num, double *i ); 功能: 函数将参数num 分割为整数和小数,返回小数部分并将整数部分赋给i。
 ......

阅读全文(1257) | 评论:0 | 复制链接

获得当前dll或者exe路径(2011-01-07 11:32:00)

摘要:代码比较简单: CString CT3D_GetApplicationDir()

 CString   szFileName;  
 GetModuleFileName(g_hInstance,szFileName.GetBuffer(MAX_PATH),MAX_PATH);  
 szFileName.ReleaseBuffer();    char   szDrive[MAX_PATH];  
 char   szDir[MAX_PATH];  
 _tsplitpath(szFileName,szDrive,szDir,NULL,NULL);   szFileName.Format("%s%s",szDrive,szDir);  return szFileName;
} 当g_hInstance为NULL时,表示获得当前进程的路径,也就是exe。 当g_hInstance为dll的地址时,表示获得当前dll的路径。   小知识: handle       是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。      
hmodule       是代表应用程序载入的模块,win32系统下通常是被载入模块的线性地址。      
hinstance       在win32下与hmodule是相同的东西,在win32下还存在主要是因为win16程序使用hinstance来区别task。      
......

阅读全文(4606) | 评论:0 | 复制链接

无法打开文件"LIBC.lib"解决办法(2010-09-30 14:55:00)

摘要:无法打开文件"LIBC.lib"解决办法
用VS05或者08重新编译某个工程的发生了链接错误
现在把这个解决过程分享一下。
错误如下:fatal error LNK1104: 无法打开文件“LIBC.lib” 。
解决如下:项目->属性中->配置属性->链接器->输入->在忽略特定库中写入打不开的文
件的名称LIBC.lib;
方法二:
在stdafx.h   里加上这句吧   
#pragma   comment   (linker,”/NODEFAULTLIB:libc.lib”)   方法三:
下一个libc.lib,或者把VC6.0中的包含进来
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppsl/2008525/117866.html......

阅读全文(5158) | 评论:0 | 复制链接

改变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”的多文挡类型的工程。创建完工程后,编译运行该工程,主窗口标题形......

阅读全文(7559) | 评论:2 | 复制链接