我已经找到了解决这个问题的方法,但只是想知道是否有人知道实际发生了什么导致我看到的问题。我的猜测是它与字符串的可变性有关,但我认为 CString 对象在复制构造函数中解释了这一点。
以下代码导致 mFileName 被覆盖:
class File {
public:
...
CString GetFilename() {return mFileName;}
private:
CString mFileName;
};
class FileContainer {
private: File* mFile;
public:
FileContainer() {
mFile = new File("C:\temp.txt");
}
GetFilename(CString& fileName) {
fileName = mFile->GetFileName();
}
}
void UpdateText() {
FileContainer fileCnt;
CString filePath(L"");
this->fileCnt.GetFilename(filePath);
...
::DrawText(hDC, filePath, -1, &destRect, DT_PATH_ELLIPSIS | DT_MODIFYSTRING | DT_CALCRECT);
}
发生的情况是第一次调用 UpdateText,GetFilename 返回 C:\temp.txt。假设边界矩形导致文本在第一次调用时被截断为“...\temp.txt”,“...\temp.txt”是第二次调用 UpdateText 时从 GetFilename 返回的内容。
更令人困惑的是,这并没有导致 mFileName 被改变:
void UpdateText() {
FileContainer fileCnt;
CString filePath(L"");
this->fileCnt->GetFilename(filePath);
filePath = L"TEST";
}
GetFilename 始终返回 C:\temp.txt。因此,DrawText 函数似乎以某种方式找到了原始 CString 并对其进行了修改。但是怎么做?
更新:我想我会抛出另一个奇怪的代码块,这也会导致 mFileName 被覆盖:
class File {
public:
...
CString GetFilename() {return CString(mFileName);}
private:
CString mFileName;
};
这似乎应该创建一个新对象并返回该新对象。然而,不知何故,DrawText 仍然覆盖了 mFileName。
如果我将代码更改为以下,我没有任何问题:
class File {
public:
...
CString GetFilename() {return CString(mFileName.GetBuffer());}
private:
CString mFileName;
};
似乎可以解决问题的唯一方法是按照我在解决方法中显示的方式构造一个新的 CString。当我通过 DT_MODIFYSTRING 选项时,DrawText 在做什么?