不管构图如何,单来看硬伤:
1。曝光不准确
2。片子太肉
解决的方式为:
1。多拍片,练习
2。上个三脚架
- 构架的目的是为了解决问题,而不是“构架”;即我们是为了解决问题而做的构架,而不是为了构架而做的构架
构架是在思考如何解决问题的过程中,做出的一系列设计;这些设计可能考虑比较全面,可能不全面,可能扩展性强,也可能很弱;这些设计综合起来,就是构架;把他们文档化,以自然语言、图表的形式描述清楚,就是构架文档或者叫做设计文档
- 在设计的过程中,可能会做一些实验型的编码甚至是实质性的编码,也可能不做;前者,可以认为是一边设计一边编码;后者可以认为是纯设计。个人认为后者需要对代码的极高驾驭能力,代码存在于心中。至于前者,如果由开发人员来做,就是一边构架一边编码;若由设计人员来做,那就是等设计完以后,文档化,开发人员照着写。
- 对于3,后一种开发方式较传统,效率较低,但是协作、开发容易规范;前一种开发方式开发中容易走弯路,但是反复迭代、重构(小范围),开发效率较高,团队也较紧凑。所以,前者适合一般项目,后者适合大型项目。
- 对于3,前者是敏捷的,后者是传统的。
- 这些文字是用来安慰自己的。
以前的时候,总看到书上说构架应该怎样怎样,分几步几步,怎么做怎么做;可是写了这么久程序,发现完全不是这么回事。随着时间的推移,花在构架上的时间越来越少,不知道是不是我退步了,唉
最近有点痴迷用ASP.NET做网站,于是就动手学着写一点
感想还是蛮多的,最大的一个感觉就是,很白痴。基本上按照人的思路,去写代码就行了,跟自然语言也差不多。感觉很爽,可是总觉得代码很恶心,少了点编程的乐趣
作为GDI的升级版本的GDI+实在是个好东西,以前要播放GIF什么的,要引入其他辅助库,或者自己写GIF的读取过程。不过有了GDI+,这些事情都不必再操心了。
在GDI+的设计中,IMAGE本来就是分页、分帧的;可以说,GDI+的IMAGE的设计,本身就是考虑到了几乎目前所有主流图片格式的共性而设计出来的。废话不多说,贴上代码,看GDI+是如何播放GIF的
首先是GIF的载入:
void CGIFControl::Load(LPCTSTR sFileName)
{
m_pImage = new Image(sFileName);
UINT count = m_pImage->GetFrameDimensionsCount();
m_pDimensionIDs =new GUID[count];
m_pImage->GetFrameDimensionsList(m_pDimensionIDs, count);
WCHAR strGuid[39];
StringFromGUID2(m_pDimensionIDs[0], strGuid, 39);
m_FrameCount = m_pImage->GetFrameCount(&m_pDimensionIDs[0]);
//PropertyTagFrameDelay是GDI+中预定义的一个GIG属性ID值,表示标签帧数据的延迟时间
UINT TotalBuffer = m_pImage->GetPropertyItemSize(PropertyTagFrameDelay);
m_pItem = (PropertyItem*)malloc(TotalBuffer);
m_pImage->GetPropertyItem(PropertyTagFrameDelay,TotalBuffer,m_pItem);
}
接着给出播放的代码,值得注意的是,播放我选择了使用WM_TIMER消息,而不是像有些(还比较主流)开源的GIF播放库那样,单独开一个线程来播放,主要是没必要开线程,系统复杂度还高一些(个人意见)。需要注意的一点就是,绘制GIF帧之前,需要用SelectActiveFrame把那个帧设置为当前绘制的帧。
void CGIFControl::OnTimer(UINT_PTR nIDEvent)
{
KillTimer(nIDEvent);
GUID Guid = FrameDimensionTime;
m_pImage->SelectActiveFrame(&Guid,m_iCurrentFrame);
SetTimer(1,((UINT*)m_pItem[0].value)[m_iCurrentFrame] * 10,NULL);
m_iCurrentFrame = (++ m_iCurrentFrame) % m_FrameCount;
Invalidate(FALSE);
}
绘制的代码不多说了,地球人都知道
Graphics g(lpDrawItemStruct->hDC);
DrawBorder(g);
CRect rcClient;
GetClientRect(&rcClient);
if(m_bBorderEnable)
{
rcClient.DeflateRect(m_iBorderLineWidth,m_iBorderLineWidth,m_iBorderLineWidth,m_iBorderLineWidth);
}
g.DrawImage(m_pImage,rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height());
好了,就这么多。