1. FreeLibrary 会释放dll中所申请的所有空间,当然是在使用双指针的情况下,使用双指针可以实现在dll或者函数中 申请空间。
2. cdc于hdc间的转化: cdc到hdc :
hdc = cdc.GetSafeHdc();
cdc.m_hDC
hdc到cdc :
cdc.Attach(hdc);
cdc.FromHandle(hdc)
dc.FromHandle(hDC)产生一个dc,但是是临时的,mfc不保证系统在什么时候删除dc.
dc.Attach(hDC)是永久的,直到这个dc的生命正常结束。
3. 关于memDC.CreateCompatibleDC(&cdc):
memDC.CreateCompatibleDC(&cdc);
bmp.CreateCompatibleBitmap(&cdc,rect.right, rect.bottom);
memDC.SelectObject(&bmp);
......//画图操作
//这样得到的位图的像素位数是由cdc决定的,不管你怎么画图,用多少位画图。
CBitmap *bmpCurr = memDC.GetCurrentBitmap();
//下面这样得到的像素位数一直是24位,这个是固定的。
memDC.GetPixel(int i,int j);
另外用HDC hdc = ::GetDC(0);可以得到屏幕的dc。
4. _T
_T("")是一个宏,定义于tchar.h下。他的作用是让你的程序支持Unicode编码,_T和_L的区别在于,_L不管你是以什么方式编译,一律以UNICODE方式保存。L是表示字符串资源为Unicode的。比如:
wchar_t Str[] = L"Hello World!"; 这个就是双子节存储字符了。_T是一个适配的宏~,当#ifdef _UNICODE的时候,_T就是L。没有#ifdef _UNICODE的时候,_T就是ANSI的。处理LPTSTR或者LPCTSTR 的时候 ,不要用strlen ,而是要用_tcslen,否则在UNICODE的编译条件下,strlen不能处理 wchar_t*的字符串。 T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一种中间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集?编译的时候才决定。
5.delete出错
int *a=new int[10];
......
delete []a;
----------------------------------------------------------
当后面delete []a;出现错误的情况大致有:
1.数组的首地址a被你有意无意更改了,如:a++之类的;
2.变量的作用域问题,如:你是在一个函数体中new的,却在另一个函数体中delete,这时的a变量已经失效了,这时delete会出现a为不认识的标识符的错误;
3.先前已经delete过一次了,不可以delete两次;
4.内存访问越界,VC分配内存,除了分配你需要的内存空间外还会分配一些管理单元,就在你分配空间的上界和下界,比如内存边界标志(0xFDFDFDFD),如果是数组在上界会记录数组元素的个数,你要是修改了这些管理信息,delete的时候就会报错。
6.操作符重装
并不是所有的操作符都能被重载。除了. ,.* ,:: ,? : ,sizeof,typeid这几个运算符不能被重载,其他运算符都能被重载