设为首页 加入收藏

TOP

C++沉思录课堂练习另解--消息发送(优化版)(二)
2014-11-24 00:04:12 来源: 作者: 【 】 浏览:39
Tags:沉思 课堂 练习 消息 发送 优化
t m_nWidth;

static int HandleMsg(void* pThis, int nMessage, void* param1, void* param2);
};

int CPicture::HandleMsg(void* pThis, int nMessage, void* param1, void* param2)
{
CPicture* pSelf = (CPicture*)pThis;
switch (nMessage)
{
case PM_WIDTH:
return pSelf->m_nWidth;

case PM_HEIGHT:
return pSelf->m_nCount;
break;

case PM_ROW:
int nRow = (int)param1;
string& sRow = *(string*)param2;
if (nRow >= pSelf->m_nCount)
break;
int i=0;
for (; pSelf->m_pDatas[nRow][i] != 0; i++)
sRow.push_back(pSelf->m_pDatas[nRow][i]);
for (; im_nWidth; i++)
sRow.push_back(' ');
}
return 0;
}


class CFrameDecorater
{
public:
CFrameDecorater(PictureMsg& imp)
{
m_PrevImp = imp;
imp.pThis = this;
imp.proc = HandleMsg;
}

private:
PictureMsg m_PrevImp;
static int HandleMsg(void* pThis, int nMessage, void* param1, void* param2);
};

int CFrameDecorater::HandleMsg(void* pThis, int nMessage, void* param1, void* param2)
{
CFrameDecorater* pSelf = (CFrameDecorater*)pThis;
PictureMsg& prevImp = pSelf->m_PrevImp;
switch (nMessage)
{
case PM_WIDTH:
return prevImp.GetWidth()+2;

case PM_HEIGHT:
return prevImp.GetHeight()+2;

case PM_ROW:
int nRow = (int)param1;
string& sRow = *(string*)param2;
bool bMyRow = nRow == 0 || nRow>prevImp.GetHeight();
if (nRow >= prevImp.GetWidth()+2)
break;
if (nRow == 0 || nRow>prevImp.GetHeight())
{
sRow.push_back('+');
for (int i=0; i sRow.push_back('-');
sRow.push_back('+');
}
else
{
sRow.push_back('|');
prevImp.GetRow(nRow-1, sRow);
sRow.push_back('|');
}
}
return 0;
}


class CHorseDecorater
{
public:
CHorseDecorater(PictureMsg& impLeft, PictureMsg& impRight)
{
m_Left = impLeft;
m_Right = impRight;
impLeft.pThis = this;
impLeft.proc = HandleMsg;
}

private:
PictureMsg m_Left;
PictureMsg m_Right;

static int HandleMsg(void* pThis, int nMessage, void* param1, void* param2);
static void PrintRow(PictureMsg& pict, int nRow, string& sRow)
{
if (nRow < pict.GetHeight())
pict.GetRow(nRow, sRow);
else
{
for (int i=0; i sRow.push_back(' ');
}
}
};

int CHorseDecorater::HandleMsg(void* pThis, int nMessage, void* param1, void* param2)
{
CHorseDecorater* pSelf = (CHorseDecorater*)pThis;
PictureMsg& pictLeft = pSelf->m_Left;
PictureMsg& pictRight = pSelf->m_Right;
switch (nMessage)
{
case PM_WIDTH:
return pictLeft.GetWidth()+pictRight.GetWidth();;

case PM_HEIGHT:
return max(pictLeft.GetHeight(), pictRight.GetHeight());

case PM_ROW:
int nRow = (int)param1;
string& sRow = *(string*)param2;
PrintRow(pictLeft, nRow, sRow);
PrintRow(pictRight, nRow, sRow);
}
return 0;
}

int main()
{
const char* init1[] = {"Paris", "in the", "Spring", "HaHa"};
CPicture pict1(init1, 3);
//cout << pict1;
CFrameDe
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇为什么C语言屹立不倒? 下一篇一种简单的跨平台用户态自旋锁

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: