T: | [VC/MFC 基础类]VC编程经验总结 |
Q: | | 在VC的使用过程中,每个人或多或少都会遇到一些麻烦,而这些问题可能其他人也同样遇到过,或许还没能解决。当你发现问题根结所在时,兴奋之余,欢迎你告诉他人同类问题的解决之道。 大家如果有新的发现,请把你的编程经验收藏在这个帖子里吧! 该贴会被放在本版面专题中http://www.csdn.net/Subject/297/index.shtm 奖励办法:对于好的编程经验,贴主可以重新开贴,斑竹会将其加入精华或FAQ,奖励可用分(精华100分)、信誉分(FAQ主要问题解决人信誉分加5) |
A: | 我自己先捧个场:) VC常见入门问题总结 1:fatal error C1010: unexpected end of file while looking for precompiled header directive该如何解决 如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的Settings,选择C/C++选项卡,从Category组合框中选中Precompiled Headers,选择Not Using Precompiled headers。确定 如果发生错误的文件原本是该工程中的,则检查该文件头部有没有#include "stdafx.h"语句,没有的话添加。 如果还不行,也有可能是定义的类或结构体等最后忘了加分号,注意一下。 2:fatal error RC1015: cannot open include file 'afxres.h'.该如何解决 #include "afxres.h"语句是在.rc文件中的,而afxres.h文件在VC的安装目录中的./VC98/MFC/INCLUDE目录中,所以着重查一下Tools菜单中Options对话框中的Directories中的包括文件的路径是否正确,是否在VC的安装路径中,不是的话,改过来,如果这方面没问题,则到其他机器中拷贝afxres.h到相应的目录中 3:Dll分配的内存块,应用程序释放,结果报异常。 用GlobalAlloc()代替new, 用GlobalFree() 代替delete就不会出错了 其实还有一个办法,就是把dll的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL,就可以直接使用new和delete了,没问题 比较规范点的做法一般是DLL分配的内存由DLL释放。在DLL中加一个函数释放内存不是更好吗。 4:发现打印预览的图形明显比屏幕显示图形小,怎么办? 这多半是CDC映射模式的选择引起的,缺省状态下,选择的是MM_TEXT模式,MM_TEXT以设备的像素点为单位,而不同设备的像素点的大小不同,打印机的分辨率比显示器要高很多,所以导致同样图形在打印时候变小。解决之道是统一使用其他定长的映射模式,比如MM_HIMETRIC等等(CDC::SetMapMode()改变映射模式) 5:CString、char*、string、int、_bstr_t、CTime、COleDateTime等等的相互转换,如何判断一个字符串是一个浮点数? #include<string> using namespace std; #include <COMDEF.H> { CString strCString="ABC"; char strchar[256],*pstr; pstr=(LPSTR)(LPCTSTR)strCString; //CString---->char* strcpy(strchar,(LPSTR)(LPCTSTR)strCString); //CString---->char[] _bstr_t strbstr=pstr; //char*---->_bstr_t WCHAR *strWCHAR=strbstr; //b_str_t--->UNICODE strbstr=strWCHAR; pstr=strbstr; //UNICODE---->char* strCString="10"; int istr=atoi((LPSTR)(LPCTSTR)strCString); //CString、char[]、char*------>int strCString.Format("%d",istr); //int----->CString sprintf(strchar,"%d",istr); //int----->char[] pstr=new char[256]; //字符串申请空间 strcpy(pstr,"ABC"); //字符串赋值 delete []pstr; //字符串释放 string strstring="ABC"; pstr=(char*)strstring.c_str(); //string---->char* strCString="2003-10-27 6:24:37"; //CString--->COleDateTime COleVariant vtime(strCString); vtime.ChangeType(VT_DATE); COleDateTime time4=vtime; COleDateTime time1(1977,4,16,2,2,2); //COleDataTime--->CTime SYSTEMTIME systime; VariantTimeToSystemTime(time1, &systime); CTime tm(systime); time_t time2=tm.GetTime(); //CTime--->time_t COleDateTime time3(time2); //time_t--->COleDateTime //判断字符串是否是某种类型 CString sValue("123.1"); COleVariant vValue(sValue); BOOL bStrIsFloat = (SUCCEEDED(VariantChangeType(&vValue, &vValue, 0, VT_R8)) && sValue.Find('.') != -1); if(bStrIsFloat) { AfxMessageBox("浮点"); } } 6:如何建立一个UNICODE应用程序? 建立一个应用程序,打开Alt+F7 settings选项,选择C/C++选项卡,在Preprocessor definenation中加上_UNICODE,在Link选项卡中,在Category选择框中选择Output,在Entry-point symbol编辑框中,添加wWinMainCRTStartup确定。 注意调试UNICODE程序时,需要在安装时VC选择所有选项,否则会缺少动态库和相应的.lib文件 7:ADO操作数据库表,更新出现问题 在打开数据库前,添加如下语句试一下pRecordSet->CursorLocation = adUseClient; |
T: | 急:如何将一个类封装成为dll文件?在def文件中怎么写?:::::在线等待::::: |
Q: | 把一般的函数封装成为dll,这个我会。 但是怎么封装一个类呀? 封装函数的时候,需要在def文件中写导出函数。那封装类的时候呢?是不是也要导出类? 请您指教! 最好有例子,谢谢!!!!!! |
A: | 比如我定义的一个TXTLIB类,在Alt+F7的C/C++的Preprocessor difinitions中加入,TXTLIB_EXPORTS #ifdef TXTLIB_EXPORTS #define TXTLIB_CLASS __declspec(dllexport) #else #define TXTLIB_CLASS __declspec(dllimport) #endif 然后在类的声明前面加TXTLIB_CLASS就可以了,不用在.def中添加 class TXTLIB_CLASS XYZ { public: XYZ(){x=0;y=0;z=0;}; XYZ(int x,int y,int z){this->x=x;this->y=y;this->z=z;}; double x; double y; double z; }; |
T: | 怎么样画一个透明的矩形。(只需要一个边框)。。。 |
Q: | 我想画一个透明的矩形..我用 FrameRect()画但是,怎么样檫去轨迹。。。或者,谁有更好的方法(我想鼠标按下的时候开始画,鼠标弹起就结束。。中间鼠标移动的时候需要有轨迹,但鼠标弹起后,轨迹要檫去,就是只剩下一个透明的矩形框)。。。谢谢提供方法和资料 |
A: | LOGBRUSH LogBrush; LogBrush.lbColor=RGB(0, 0, 0); LogBrush.lbStyle=BS_NULL; int iRop2=pDC->SetROP2(R2_XORPEN); CBrush brush; brush.CreateBrushIndirect(&LogBrush); CBrush* pOldBrush = pDC->SelectObject(&brush); CPen pen(PS_SOLID,1,RGB(255,255,0)); CPen *pPen=pDC->SelectObject(&pen); pDC->Rectangle(0,0,100,100); pDC->Rectangle(0,0,100,100);//试一下注释掉这句话和不注释的区别 pDC->SelectObject(pPen); pDC->SetROP2(iRop2); pDC->SelectObject(pOldBrush); brush.DeleteObject(); 在鼠标按下移动的时候,设置异或模式,用上次点重新画一次,OK |
T: | 请教一个有关UNICODE字符显示的问题 |
Q: | 我的程序已经设置为_UNICODE编译方式 程序中从一个文件读取了一段泰文到WCHAR类型的字串中,在AfxMessageBox()显示也能正确显示,但使用ExtTextOut或ExtTextOutW却不能正确显示。如果WCHAR类型的字串中的是中文,ExtTextOut或ExtTextOutW却能正确显示,为什么????,泰文怎样使用ExtTextOut或ExtTextOutW来显示呢??? |
A: | 很简单,你的设备所选择的字体中不包含泰文字UNICODE字符,看下面程序,哇,好激动,我真聪明:) CFont font; VERIFY(font.CreateFont( 12, // nHeight 0, // nWidth 0, // nEscapement 0, // nOrientation FW_NORMAL, // nWeight FALSE, // bItalic FALSE, // bUnderline 0, // cStrikeOut ANSI_CHARSET, // nCharSet OUT_DEFAULT_PRECIS, // nOutPrecision CLIP_DEFAULT_PRECIS, // nClipPrecision DEFAULT_QUALITY, // nQuality DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily _T("Tahoma"))); // lpszFacename CFont *pOldFont=pDC->SelectObject(&font); WCHAR str[256]; FILE *pFile; pFile=fopen("E://aaa.txt","rb");//aaa.Txt中包含三个泰文字符 int n=fread(str,sizeof(WCHAR),3,pFile); if(n>256) n=255; str[n]=0; pDC->TextOut(0,0,str); pDC->SelectObject(pOldFont); fclose(pFile); |
T: | 关于DLL中导出的问题 |
Q: | 我写了一个WIN32 的DLL,不共巷MFC,如下是导出类的写法 class __declspec(dllexport) CExchange { public: _ConnectionPtr m_ConnectDatabase; //初始化数据库的基本配置 //进行内存分配和数据库连接以及设置导入的表名 BOOL InitConfig(LPCTSTR lpszFileName, LPCTSTR lpszServer, LPCTSTR lpszUser, LPCTSTR lpszPwd, LPCTSTR lpszDatabase, LPCTSTR lpszClassDatabase, LPCTSTR lpszTableName); //释放内存 BOOL ReleaseConfig(); CExchange(); private: BOOL InitDatabase(LPCTSTR bstServer, LPCTSTR bstUser, LPCTSTR bstPwd, LPCTSTR bstDatabase, LPCTSTR szRecordClass); BOOL GetFieldNameFromDatabase(TCHAR szName[], TCHAR szFieldNum[]); private: _bstr_t m_bstTableName; BOOL CreateSqlTable(FIELDINFO *pFieldInfo, int nFieldCount); void ModifyFieldEnd(FIELDINFO *pFieldInfo, int nFieldNum); BOOL InsertField(FIELDINFO *pFielOrg, FIELDINFO *pFieldNew, int *pFieldCount, int nFieldNum); BOOL CreateFieldName(FIELDINFO *pFieldInfo, FIELDINFO *pField, int nFieldCount, int pos); BOOL ModifyFieldName(FIELDINFO *pFieldInfo, TCHAR szName[], TCHAR szOrgName[], int nCount); BOOL IsExistField(FIELDINFO *pFieldOrg, TCHAR szFieldName[], int nFieldCount); void DelMulFileld(FIELDINFO *pFieldInfo, int nFieldNum); _ConnectionPtr m_cnRecordClass; int m_nFileLen; TCHAR *m_pMemory; HANDLE m_hFile; int m_nCurPos; }; 编译后有几个警告,做如下提示 :/2002/convertdll/exchange.h(23) : warning C4251: 'm_ConnectDatabase' : class '_com_ptr_t<class _com_IIID<struct _Connection,&struct __s_GUID _GUID_00000550_0000_0010_8000_00aa006d2ea4> >' needs to have dll-interface to be used by clients of class 'CExchange' d:/2002/convertdll/exchange.h(42) : warning C4251: 'm_bstTableName' : class '_bstr_t' needs to have dll-interface to be used by clients of class 'CExchange' d:/program files/microsoft visual studio/vc98/include/comutil.h(72) : see declaration of '_bstr_t' d:/2002/convertdll/exchange.h(50) : warning C4251: 'm_cnRecordClass' : class '_com_ptr_t<class _com_IIID<struct _Connection,&struct __s_GUID _GUID_00000550_0000_0010_8000_00aa006d2ea4> >' needs to have dll-interface to be used by clients of class ' CExchange' 这个我不知道怎么解决,如果不能解决,会有大问题吗? |
A: | 赫赫你给的分数低 在你的DLL中Alt+F7中有一个C/C++中preprocessor definitions编辑框添加AAA_EXPORTS定义,然后在头文件类定义之前添加 #ifdef AAA_EXPORTS #define AAA_API __declspec(dllexport) #else #define AAA_API __declspec(dllimport) #endif 然后在你的类的声明前添加AAA_API ,就象上面一样,在主工程中包括这个头文件,主工程中在ALT+F7的LINK选项卡(应该是这个选项卡,我这没环境)添加该DLL的.LIB文件。OK http://expert.csdn.net/Expert/topic/2442/2442418.xml?temp=.8923914 |
T: | 关于屏幕坐标和逻辑坐标的问题 高手指点啊 |
Q: | 我如何知道当前显示器屏幕坐标 和逻辑坐标之间的关系 比如1个像数点代表多少毫米? 因为我的程序在两个不同大小的显示器上运行(分辨率相同);程序显示的东西是用逻辑坐标画的(别人dll画的没法改) 导致大的屏幕显示的东西多 小的屏幕显示的东西少 我如何才能让两个屏幕显示的东西一样多呢(我想只要两个显示器一个像素点代表的毫米数一样就好了) 能不能设置一个像数点所代表的毫米数呢? |
A: | //引用bluebohe的说法 1: double pLogHeighty=(double)pDC->GetDeviceCaps(LOGPIXELSY); double pLogHeightx=(double)pDC->GetDeviceCaps(LOGPIXELSX); mPageHeight=(int)((mPhysicalHeight/pLogHeighty)*25.4+0.5); mPageWidth =(int)((mPhysicalWidth/pLogHeightx)*25.4+0.5); 也好像是这个,忘了哪个了 2: dc.LineTo(0,(g_iCustomClipHeight-1)*::GetDeviceCaps(hDC,LOGPIXELSY)/25.4); |