@ OwnWaterloo
你用的是和atl一样的方式?
将hwnd"替换"为this? 而非"插入"一个this?
是吗?
====================
是的。因为这样才能兼容x64平台:x64前8个参数通过寄存器传递。
@ cexer
SetProp 结合 GUID更理想,而GUID可以用API获取。
以后多交流!期待你的GUI框架下一篇...^_^
================
|||||||||||||||||||||
发现一个类中有6万个指针时,如果指针初始化了,还是占用内存。
没办法,为了降低成本,不能在类中放那么多指针了。
所以,使用bitset来帮忙。
先看消息注册(比原来的难看多了,没找到好方法,详见:
http://topic.csdn.net/u/20091119/15/07d7e755-c733-4195-8cc4-306560d6fbc4.html )
class MainFrm : public Frame
{
public:
MainFrm() : Frame(_T("Test Demo!"), _T("MainFrame")), m_testBtn(_T("Test!"))
{
Add(&m_testBtn);
m_testBtn.Get<EvtLButtonDown>(m_testBtn.IdLButtonDown).Bind(this, &MainFrm::OnLBtnClicked);
Get<EvtCreate>(IdCreate).Bind(this, &MainFrm::OnCreate);
}
~MainFrm()
{
Get<EvtCreate>(IdCreate).UnBind(this, &MainFrm::OnCreate);
}
qpEvt OnCreate(EvtCreate& evt)
{
qpDbgInt(evt.handled);
}
qpEvt OnLBtnClicked(EvtLButtonDown& evt)
{
qpDbgInt(evt.owner);
}
protected:
Button m_testBtn;
};
用bitset + map<short, void*> + enum来降低成本:
#define IMPLEMENT_EVENT(X, Y) \
public: \
template <typename T> \
Event<T>& Get(X id) \
{ \
if (m_evtMap.get() == NULL) \
{ \
qpNewPtrEx(p, EventMap); \
m_evtMap.reset(p); \
} \
if (m_evtFlag[id] == 0) \
{ \
qpNewPtrEx(p, Event<T>); \
if (p != NULL) \
{ \
m_evtFlag[id] = 1; \
m_evtMap->insert(std::make_pair(static_cast<short>(id), p)); \
return *static_cast<Event<T>*>(p); \
} \
} \
else \
{ \
EventMap::iterator it = m_evtMap->find(static_cast<short>(id)); \
if (it != m_evtMap->end()) return *static_cast<Event<T>*>(it->second); \
} \
qpASSERT(false); \
qpNewPtrEx(p, Event<T>); \
return *std::auto_ptr<Event<T>>(p); \
} \
protected: \
typedef std::map<short, void*> EventMap; \
std::auto_ptr<EventMap> m_evtMap; \
std::bitset<Y> m_evtFlag;
std::bitset的使用,可以判断相应消息是否注册,不用每一个消息都进入一次Event了,但由于使用map来查找消息,效率上还是下降了。
没办法:只能用时间换空间!