博文
[置顶] 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()'调用该函数:
......
[置顶] 如何在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 混合编程》,内有详细介绍。
......
[置顶] 组合,关联,聚合的区别(转)(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”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合......
[置顶] 怎样衡量一个人的编程能力(2006-11-29 20:36:00)
摘要:十一很快过去了,真快,还没怎么玩好.不过我最高兴的还是在这段时间完成了一个小的矢量图形系统,用VC做的.虽然GIS专业已经有'老大'--ArcGIS,但是我们这些将来的专业人员以后还要从事2次开发的,所以先做2个小程序当作锻炼把.
这个系统没什么大的功能,就是搞搞数字化,单点查询,单源查询,单对查询等等.最好玩的还是单对了.就是查询2点的最短路径.这个的算法有很多,于是我上百度上搜啊搜,没有一个搞的定.最后还是采用了迪杰斯特拉算法,最不好意思的就是这个算法是上学期数据结构中学过的,呵呵.
通过这次实习,我也发现了一个问题.好多人在学习可视化编程的时候,只注重界面设计,并不重视流程控制,功能实现,内部机制等.结果是学了VB忘了C,学了VC忘了C++,其实我认为后者才是最重要的.它是衡量一个人程序设计能力的标准.陈建春在有本书上写的蛮好:
"程序设计者特别是初学者应该认识到,程序设计的最终目的是为了完成具体的任务,所以在应用程序设计中,程序的框架和界面等部分在一个程序中占的比重是最小的,并非程序设计的本质.
程序设计的能力体现在对数据的组织和控制,流程的控制等上面,不同的计算机语言虽然各有特点,但是几乎所有的计算机语言其设计思想是内在相通的,程序设计能力的高低与采用哪种计算机语言没有必然的联系"
上面这段话让我茅塞顿开.不能为了学习一门语言而去学习语言,它是用来与计算机沟通交流的.学了语言就要去应用,这样才能更好的掌握.......
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,
 ......
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......
modf函数(2011-04-28 17:03:00)
摘要:modf ()函数
-
-
modf
语法:
#include <math.h> double modf( double num, double *i );
功能: 函数将参数num 分割为整数和小数,返回小数部分并将整数部分赋给i。
......
获得当前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。
......
无法打开文件"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......
改变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”的多文挡类型的工程。创建完工程后,编译运行该工程,主窗口标题形......