我重读<<深入浅出MFC>>,发现几个问题。以下页码以电子版为准。
1. part4 P536
CArchive& AFXAPI operator>>(CArchive& ar, CStroke* &pOb)
{ pOb = (CStroke*) ar.ReadObject(RUNTIME_CLASS(CStroke));
return ar; }
好,你看到了,為什麼只改寫operator>>,而沒有改寫operator<<?原因是WriteObject 並
不需要CRuntimeClass 資訊,但ReadObject 需要,因為在讀完檔案後還要做動態生成
的動作。
我改写了DECLARE_SERIAL / IMPLEMENT_SERIAL宏,去掉了operator<<,几个例子都没有问题。
似乎overload后的operator>>根本不会被调用,因为函数重载依据是静态类型,而MFC作为一个
框架根本不可能事先知道用户定义的类.
2. part3 P387
視窗類別名稱怎麼會變成像Afx:b:14ae:6:3e8f 這副奇怪模樣呢?原來是Application
Framework 玩了一些把戲,它把這些視窗類別名稱轉換為Afx:x:y:z:w 的型式,成為獨一
無二的視窗類別名稱:
x: 視窗風格(window style)的hex 值
y: 視窗滑鼠游標的hex 值
z: 視窗背景顏色的hex 值
w: 視窗圖示(icon)的hex 值
这里得到的窗口类名称应该是类似"Afx:400000:8:10011:0:ca40565"这样的,我用的VC++6.0,
而根据书上的图片也应该是这样的.所以格式为Afx:instance_handle:x:y:z:w,另外我觉得用独一无二
似乎不太合适.instance_handle都是40000,y:z:w的值也经常是相同的.所以只要窗口风格相同,则窗口
类名称就经常重复.另外很重要的一点是,转换窗口名称是为了注册完全不同的窗口类,在书中附例
Scribble 4中用Spy++可以看到,既有AfxMDIFrame42d类的窗口,也有Afx:400000:8:10011:0:ca40565类的
窗口,如果如作者所说只是玩个小把戏换下窗口类名称,那么应该告诉读者为什么这样做
以上只是我所想的,难免有不够恰当之处,欢迎大家一起讨论.