none
如何對一個圓形區域染色 RRS feed

  • 問題

  •  

    dear All,

     

    目前開發使用vs2005/mfc/wm5/wm6

     

    想請教

    如果我想對一個dc上的一個圓形區域進行染色(alphablend的效果)

    請問應該如何做?

     

    本來想用clip rgn的方式 使得繪製區域可以鎖定在一個圓形區域

    但是windows mobile不支援non-rectangle的region產生

     

    如果自己去取得圓形區域內的點再染色 應該動作會太慢吧

     

    後來想用hatch brush, 但是也不支援

     

    還請各位先進不吝賜教 謝謝

     

     

    2008年6月25日 上午 02:19

解答

  • OH OH  是 混色喔  

     

    如果沒 GDI+    那只好  改用   Direct Draw

     

     

    SEE   WM6  SAMPLE

     

    Demonstrates how to initialize DirectDraw and create a DirectDraw surface.

    Folder :
    \PocketPC\CPP\win32\Directx\DDraw\DDex1

     

     

    Demonstrates how to add a bitmap. Extends DDex1.

    Folder :
    \PocketPC\CPP\win32\Directx\DDraw\Ddex2

     

    Demonstrates the use of off-screen surfaces.

    Folder :
    \PocketPC\CPP\win32\Directx\DDraw\Ddex3

     

     

    Demonstrates DirectDraw animation using overlays.

    Folder :
    \PocketPC\CPP\win32\Directx\DDraw\Mosquito

     

    ================================

     

    DirectDraw版的AlphaBlend - 小力的博客- 博客園

     

     

     

     

    2008年6月25日 上午 06:03

所有回覆

  • GDI+通過對區域(Region)的支持極大地擴展了GDI。在GDI 中,區域存儲在設備坐標中,可應用於區域的唯一變形是平移。但是在GDI + 中,區域存儲在全局坐標(世界坐標)中,可對區域利用變形矩陣進行變形(旋轉、平移、縮放等)。

     

    Code Snippet

    void CGdiexampleDlg::OnScalableRegion()
    {
     // TODO: Add your command handler code here
     CClientDC dc(this);


     //創建Graphics 物件
     Graphics graphics(dc);


     //創建GraphicsPath
     GraphicsPath path;
     path.AddLine(100, 100, 150, 150);
     path.AddLine(50, 150, 150, 150);
     path.AddLine(50, 150, 100, 100);


     //創建Region
     Region region(&path);


     //填充區域
     graphics.FillRegion(&SolidBrush(Color::Blue), &region);

     


     //區域變形
     Matrix matrix;
     matrix.Rotate(10.0f); //旋轉順時針20度
     matrix.Scale(1.0f, 0.3f); //拉伸
     region.Transform(&matrix); //應用變形


     //填充變形後的區域
     graphics.FillRegion(&SolidBrush(Color::Green), &region);


    }

     

    2008年6月25日 上午 03:26
  •  

    cmf先謝謝你的回覆

     

    日前我也曾經想過用gdi plus

    但是發現在wm6 sdk下的目錄找不到gdiplus.lib or gdiplus.dll

    於是我以為wm5/6 不支援gdi plus

     

    如果mfc under wm5/6的確支援gdiplus

    請問應該如何連結使用?

     

     

     

    2008年6月25日 上午 03:54
  •  

    如果 只是     填滿圓形    

    只要 在 畫圓  之前 選擇 筆刷 即可

     

    Code Snippet
    void CExampleView::OnDraw(CDC *pDC) 
    {  
       pDC->TextOut(0,0,"Hello world!");    
       pDC->SelectStockObject(GRAY_BRUSH);    
       pDC->Ellips(CRect(0,20,10,120));
    }

     

     

     

     

    2008年6月25日 上午 05:24
  •  

    可能我沒有把"染色"的定義說清楚

    其意義是 把source pixel color & destination pixel color 做一定比例的混合

    例如 40% source pixel color 混合 60% destination pixel color

    把得到的color再畫回destination pixel

     

    SelectStockObject只是單純的填上單一色 無法達到我希望的功能

     

     

    2008年6月25日 上午 05:34
  • OH OH  是 混色喔  

     

    如果沒 GDI+    那只好  改用   Direct Draw

     

     

    SEE   WM6  SAMPLE

     

    Demonstrates how to initialize DirectDraw and create a DirectDraw surface.

    Folder :
    \PocketPC\CPP\win32\Directx\DDraw\DDex1

     

     

    Demonstrates how to add a bitmap. Extends DDex1.

    Folder :
    \PocketPC\CPP\win32\Directx\DDraw\Ddex2

     

    Demonstrates the use of off-screen surfaces.

    Folder :
    \PocketPC\CPP\win32\Directx\DDraw\Ddex3

     

     

    Demonstrates DirectDraw animation using overlays.

    Folder :
    \PocketPC\CPP\win32\Directx\DDraw\Mosquito

     

    ================================

     

    DirectDraw版的AlphaBlend - 小力的博客- 博客園

     

     

     

     

    2008年6月25日 上午 06:03