DrawText引起的崩溃,现象是虚函数调用失败,怀疑编译器bug,结果被Windows sdk坑了
// filename: IRenderTarget.h
// author: enic
// date: 2014-02-12
#pragma once
#include "import_std.h"
namespace elib
{
class IRenerTarget
{
public:
virtual ~IRenerTarget(){}
// !!!这里原先的名字和Windows sdk中的DrawText,结果上当了。表现在基类定义的DrawText接口,派生类始终调用不到
// 正确的class,感觉是虚函数表查的不对,后来发现泥马明明函数名字都是DrawText结果派生类调用DrawTextW编译器都不
// 报错误,然后把基类的改了还居然就正常了,,,
// 最后发现是被windows sdk的UNICODE模式那些×××W ***A的宏忽悠了,然后编译器这边也没能报错出来,导致运行期间找
// 不到正确的虚函数然后傻逼了。
// 解决方案有两个:1.在基类中也引入Windows的头文件,这样大家一起被宏定义,始终是一致的名字。但是感觉不太好,仿
// 佛被绑架了一样,我不喜欢这个感觉。而且不利于跨平台(总觉得编译器不够给力,应该报出来的)。或者是undefine,
// 或者把导致问题的依赖文件移动到cpp中,这样应该报错会明显一点不至于到最后崩溃了无法分析(宏展开才能发现代码问题)
// 2.该名字,果断改了,,,以后windows api中有×××W ***A两个版本的,果断要记得危险,,,
virtual bool DrawString(const estl::u16string& strText, int iX, int iY) = 0;
};
class CBaseRenderTarget : public IRenerTarget
{
public:
virtual bool DrawString(const estl::u16string& strText, int iX, int iY)
{
return false;
}
};
/*
class IRenderTexture
{};*/
}; //~ end of namespace elib
// filename: CDcRenderTarget.h
// author: enic
// date: 2014-02-13
// note:
// @2014-02-14:现在最纠结的事情是,怎么在PaintEvent的时候获取到RenderTarget,目前只能确定一件事:
// 只有从NativeWnd才能获取到DC,才可能创建出真实的RenderTarget,那么创建就只交给NativeWnd
// 然后通过Paint事件传递出去.
// 仔细想想,发现上面说的方式也不行,上面的方式限制了paint的时机,也就是只有发生Paint事件
//
的时候才有可能得到Target然后绘图,貌似不够合理?下午想想有没有别的办法。
#pragma once
#include "../IRenderTarget.h"
#include "CDCT.hpp"
namespace elib
{
// DC渲染目标
class CDcRenerTarget : public CBaseRenderTarget
{
public:
explicit CDcRenerTarget(CDCHandle dc);
virtual ~CDcRenerTarget();
public:
virtual bool DrawString(const estl::u16string& strText, int iX, int iY);
private:
CDCHandle m_dcHandle;
};
}; //~ end of namespace elib