不管構(gòu)圖如何,單來看硬傷:
1。曝光不準(zhǔn)確
2。片子太肉
解決的方式為:
1。多拍片,練習(xí)
2。上個三腳架
- 構(gòu)架的目的是為了解決問題,而不是“構(gòu)架”;即我們是為了解決問題而做的構(gòu)架,而不是為了構(gòu)架而做的構(gòu)架
構(gòu)架是在思考如何解決問題的過程中,做出的一系列設(shè)計;這些設(shè)計可能考慮比較全面,可能不全面,可能擴(kuò)展性強(qiáng),也可能很弱;這些設(shè)計綜合起來,就是構(gòu)架;把他們文檔化,以自然語言、圖表的形式描述清楚,就是構(gòu)架文檔或者叫做設(shè)計文檔
- 在設(shè)計的過程中,可能會做一些實驗型的編碼甚至是實質(zhì)性的編碼,也可能不做;前者,可以認(rèn)為是一邊設(shè)計一邊編碼;后者可以認(rèn)為是純設(shè)計。個人認(rèn)為后者需要對代碼的極高駕馭能力,代碼存在于心中。至于前者,如果由開發(fā)人員來做,就是一邊構(gòu)架一邊編碼;若由設(shè)計人員來做,那就是等設(shè)計完以后,文檔化,開發(fā)人員照著寫。
- 對于3,后一種開發(fā)方式較傳統(tǒng),效率較低,但是協(xié)作、開發(fā)容易規(guī)范;前一種開發(fā)方式開發(fā)中容易走彎路,但是反復(fù)迭代、重構(gòu)(小范圍),開發(fā)效率較高,團(tuán)隊也較緊湊。所以,前者適合一般項目,后者適合大型項目。
- 對于3,前者是敏捷的,后者是傳統(tǒng)的。
- 這些文字是用來安慰自己的。
以前的時候,總看到書上說構(gòu)架應(yīng)該怎樣怎樣,分幾步幾步,怎么做怎么做;可是寫了這么久程序,發(fā)現(xiàn)完全不是這么回事。隨著時間的推移,花在構(gòu)架上的時間越來越少,不知道是不是我退步了,唉
最近有點癡迷用ASP.NET做網(wǎng)站,于是就動手學(xué)著寫一點
感想還是蠻多的,最大的一個感覺就是,很白癡。基本上按照人的思路,去寫代碼就行了,跟自然語言也差不多。感覺很爽,可是總覺得代碼很惡心,少了點編程的樂趣
作為GDI的升級版本的GDI+實在是個好東西,以前要播放GIF什么的,要引入其他輔助庫,或者自己寫GIF的讀取過程。不過有了GDI+,這些事情都不必再操心了。
在GDI+的設(shè)計中,IMAGE本來就是分頁、分幀的;可以說,GDI+的IMAGE的設(shè)計,本身就是考慮到了幾乎目前所有主流圖片格式的共性而設(shè)計出來的。廢話不多說,貼上代碼,看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+中預(yù)定義的一個GIG屬性ID值,表示標(biāo)簽幀數(shù)據(jù)的延遲時間
UINT TotalBuffer = m_pImage->GetPropertyItemSize(PropertyTagFrameDelay);
m_pItem = (PropertyItem*)malloc(TotalBuffer);
m_pImage->GetPropertyItem(PropertyTagFrameDelay,TotalBuffer,m_pItem);
}
接著給出播放的代碼,值得注意的是,播放我選擇了使用WM_TIMER消息,而不是像有些(還比較主流)開源的GIF播放庫那樣,單獨開一個線程來播放,主要是沒必要開線程,系統(tǒng)復(fù)雜度還高一些(個人意見)。需要注意的一點就是,繪制GIF幀之前,需要用SelectActiveFrame把那個幀設(shè)置為當(dāng)前繪制的幀。
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());
好了,就這么多。