討論區快速選單
知識庫快速選單
掌握Salesforce雲端管理秘訣 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
CDC::SetBrushOrg的問題
更改我的閱讀文章字型大小
作者 : sunyear() VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/7/31 下午 11:50:23
幫忙找一下Drawcli的問題(也是幫我找問題)
Drawcli是微軟著名的範例之一,我主要是參考它OLE container做法。
有興趣的人可以到這裡來下載:
http://archive.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=vcsamplesmfc&DownloadId=9784
不過,先說明,bug不少。感筧是微軟故意搞的,因為藏得很好:(
今天,想要用pattern brush來填背景,沒搞定,老是View一捲動,畫面就亂了(沒有對花)。
突然想到去看Drawcli的OnDraw如何填景的。
它的程式是有考慮到對花,但卻是用solid brush來填背景(白對花了^^)。
但,沒關係,既然有對花,我只要改一下有花紋的brush就可以了。
結果,試驗的結果,和我的程式一樣沒搞定,View一捲動,花還是沒對好。
我把重程式分析在下面,希望有人可以幫我找到問題所在:

void CDrawView::OnDraw(CDC* pDC)

{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

CDC dc;
CDC* pDrawDC = pDC;
CBitmap bitmap;
CBitmap* pOldBitmap = 0;

// only paint the rect that needs repainting
CRect client;
pDC->GetClipBox(client);//client是重晝矩型的邏輯座標
CRect rect = client;
DocToClient(rect);//rect是重晝矩型的裝置座標
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// draw to offscreen bitmap for fast looking repaints
if (dc.CreateCompatibleDC(pDC))//建立一個相容的DC重畫來加速視覺更新
{
 if (bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()))//為相容DC提供畫布
 {
  OnPrepareDC(&dc, NULL);
  pDrawDC = &dc;//記得pDrawdc==dc就好

  // offset origin more because bitmap is just piece of the whole drawing
  dc.OffsetViewportOrg(-rect.left, -rect.top);//令裝置座標(rect.left, rect.top)位於view視窗的左上角
  pOldBitmap = dc.SelectObject(&bitmap);
  dc.SetBrushOrg(rect.left % 8, rect.top % 8);//設置Brush起點!!這是對花重點!!

  // might as well clip to the same rectangle
  dc.IntersectClipRect(client);
 }
}

// paint background
CBrush brush;
//if (!brush.CreateSolidBrush(pDoc->GetPaperColor()))//<-這是原程式
if (!brush.CreateHatchBrush(HS_DIAGCROSS, RGB(0,0,0)))//我改用有花紋的brush
 return;

brush.UnrealizeObject();//重設brush
pDrawDC->FillRect(client, &brush); //捲動時沒對到花!!
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
}
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/8/1 上午 12:18:46
>dc.SetBrushOrg(rect.left % 8, rect.top % 8);//設置Brush起點!!這是對花重點!!
注意到,程式並沒有用SelectObject選用brush,而最後填背景的是用:
pDrawDC->FillRect(client, &brush);
我的疑點是,FillRect是否有SelectObject的動作?
如果沒有,dc.SetBrushOrg有作用嗎?
可惜FillRect並沒月源碼可以追查。
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.125