链接3:文章,总结,代码等

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值