随笔分类 -  c++!

摘要:#define offsetof(s, m) (size_t)&(((s*)0)->m)注意:"&"这里是取地址符的意思,而不是位运算的与,害的我郁闷了很长时间。。说到底,一种欺骗战术。offsetof 求某个结构体的特定成员在结构体里面的偏移量(s *)0 是骗编译器说有一个指向类(或结构)s的指针,其值为0 &((s *)0)->m 是要取得类s中成员变量m的地址 由于这个类(或结构)的基址为0,这时m的地址当然就是m在s中的偏移了(s *)0 是把0地址转换为s指针类型,然后从这个指针上“取”m成员再取址,而m成员的地址转换后结果就 阅读全文
posted @ 2013-12-05 10:15 Tup 阅读(278) 评论(0) 推荐(0)
摘要:DLL搜索顺序:当前进程的可执行模块所在的目录。当前目录。Windows系统目录。GetSystemDirectory函数检索此目录的路径。Windows目录。GetWindowsDirectory函数检索此目录的路径。PATH环境变量中列出的目录。因此,放到以上任意一个目录下都可以。最简单的是第1个,放到exe文件所在的目录下 阅读全文
posted @ 2013-12-03 11:57 Tup 阅读(2053) 评论(0) 推荐(0)
摘要:问题:在父窗口中调用CTabCtrl控件的接口SetItemSel()不起作用。原因:调试发现,获取GetClientRect不起作用 因为窗口还没创建 要么说用CDialogImpl啊 有个OnInitDialog函数好办些这个时候只能给一些成员变量 复制 而不能调用函数(例如GetClientRect) 而且就算使用CDialogImpl 也可能出现这种情况解决方法:把设置当前选中的item接口分为内部(SetItemSel)、外部(SetCurSelItem)两种。 内部还负责重绘之类的,外部只负责传值。然后再OnPaint里面最后再调用一下内部的SetItemSel即可。当然内部这个接 阅读全文
posted @ 2013-12-02 14:49 Tup 阅读(394) 评论(0) 推荐(0)
摘要:所在项目中的定位是一个外观为圆角矩形的TabBtn控件,绘制圆角矩形部分的实现:void CTabBtn::DoPaint(CDCHandle dc)//继承了CDoubleBufferImpl{ Graphics graphics(dc); DrawTabBtn(&graphics);}void CTabBtn::DrawTabBtn(Graphics* graphics){ RECT rect; ::GetClientRect(m_hWnd, &rect); int nItemCount = m_arrItems.size(); int nItemWid... 阅读全文
posted @ 2013-12-02 10:47 Tup 阅读(1390) 评论(0) 推荐(0)
摘要:最近在写一个控件CMenuButton,初衷是提供设置偏移量的接口,可是ASSERT总是中断,调试发现::GetClientRect()返回的rect都是0值。Google了一下,原来:Q:“为何在OnCreate调用取出的就是0 呢 ?在OnInitialUpdate中是可以调用的,返回数据也是正确的 ”A:“OnCreate时还没创建出客户区 ”void CMenuButton::SetOffset(int OffsetL, int OffsetR, int OffsetTop, int OffsetBottom){ //if out of client bound, then hold 阅读全文
posted @ 2013-11-26 12:23 Tup 阅读(696) 评论(0) 推荐(0)
摘要:看这段代码:... map mapAllVolumes; vector vecCheckedVolumes; CString cstrVolDesc; for(int i = 'c'; i (toupper(i), label)); //key using UpperCase }...结果:map里面所有key对应的都是最后一个插入的value再看下一段代码: CString str1; str1 = "C::::::::::"; mapAllVolumes.insert(map::value_type('C', str1.GetBuffer 阅读全文
posted @ 2013-11-20 19:25 Tup 阅读(2459) 评论(0) 推荐(0)
摘要:wcscpy_s是对应于wcscpy的安全版本。CString cstrVolDesc;wchar_t* label = new wchar_t[100];....//wcscpy_s(label, cstrVolDesc.GetLength(), cstrVolDesc.GetString());//error:"Buffer too small"wcscpy_s(label, cstrVolDesc.GetLength()+1, cstrVolDesc.GetString());..可见,使用wcscpy_s一定要保证目标字符串的大小一定要比源字符串大,而且第二个参数指 阅读全文
posted @ 2013-11-20 19:10 Tup 阅读(2008) 评论(0) 推荐(0)
摘要:memcpy是物理层次的复制 不管你类型是否统一 我就给你复制了^0^这里探讨下常见的情况:实例1: (LPCWSTR-->LPWSTR) ... LPCWSTR strConst = L"ABCDEFGHIJKLMNOPQRSTUVWXYZ"; LPWSTR strNormal = new WCHAR[50]; memcpy(strNormal, strConst, 10);//乱码 ... 这说明:从小的size复制到大的size,只复制少部分字符,是不行的。实例2: (LPCWSTR-->LPWSTR) ... LPCWSTR strConst = L&q 阅读全文
posted @ 2013-11-20 19:03 Tup 阅读(370) 评论(0) 推荐(0)
摘要:CString是微软程序员的偏爱,用不好也会让你很头疼,又爱又恨啊。主要实现在三个文件中atlstr.h cstringt.h atlsimpstr.h, atlsimpstr.h负责最基本的设计,cstringt.h则负责一些高级函数的实现,atlstr.h负责最后的封装。如果在非MFC工程中使用CString的,主要#include 就足够了。看到这段代码,挺有意思^0^templateclass ChTraitsBase{public: typedef char XCHAR; typedef LPSTR PXSTR; typedef LPCSTR PCXSTR; typedef wch. 阅读全文
posted @ 2013-11-20 16:04 Tup 阅读(714) 评论(0) 推荐(0)
摘要://#include "stdafx.h" //不使用预编译头#include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv[]){ CString str1; str1.Format(L"Who R U ? NO.%d", 999); cout<<str1<<endl;//以常规方式输出 wcout<<str1<<endl;//直接输出CString wcout<<str1.GetBuffer() 阅读全文
posted @ 2013-11-18 19:00 Tup 阅读(561) 评论(0) 推荐(0)
摘要:GetTextExtentPoint32 函数功能:计算指定的正文字符串的宽度和高度 函数原型:BOOL GetTextExtentPoint32(HDC hdc,LPCTSTR lpString,int cbString,LPSIZE lpSize); 参数: hdc: 设备环境句柄 lpString:指向正文字符串的指针,此字符串不必以\0结束,因为cbString指定了字符串的长度 cbString:要纳入计算的字符串的字符数 lpSize: 指向SIZE结构的指针,该结构中字符串的尺寸将被返回。 返回值:如果函数调用成功,返回值是非零值;调用失败,返回0 Windows NT:... 阅读全文
posted @ 2013-11-18 18:38 Tup 阅读(2073) 评论(0) 推荐(1)
摘要:1.求字符串的长度:(string.h wchar.h) size_t __cdecl strlen(const char*); size_t __cdecl wcslen(const wchar_t*)2. 打印字符串: printf wprintf你所熟悉的含字符串参数的C运行期函数都有相对应的宽字符处理方法。 阅读全文
posted @ 2013-11-18 18:30 Tup 阅读(184) 评论(0) 推荐(0)