2010-07-17 101 views
3

我在製作an overloaded TableLayoutPanel which draws some fancy borders,但由於某種原因致電Graphics::DrawImage未按預期工作。這似乎淡出了我的1×10像素的源圖像時,我伸出它:爲什麼Graphics :: DrawImage不像預期那樣拉伸圖像?

alt text

這是做渲染功能:

void GTableLayoutPanel::RenderSides(Graphics^ g, array<Drawing::Image^>^ sideImages) 
{ 
    if(sideImages) 
    { 
     if(sideImages->Length < 4) 
     { 
      throw gcnew System::ArgumentException(String::Format("Not enough images supplied to render sides (expected 4 but only got {0})", sideImages->Length)); 
     } 

     int borderSize = sideImages[0]->Height; 
     g->DrawImage(sideImages[0], Rectangle(borderSize, 0, this->Width-borderSize*2, borderSize)); 
     g->DrawImage(sideImages[1], Rectangle(this->Width-borderSize, borderSize, borderSize, this->Height-borderSize*2)); 
     g->DrawImage(sideImages[2], Rectangle(borderSize, this->Height-borderSize, this->Width-borderSize*2, borderSize)); 
     g->DrawImage(sideImages[3], Rectangle(0, borderSize, borderSize, this->Height-borderSize*2)); 
    } 
} 

回答

4

這是插值的副作用,當你使用極端放大。你需要這樣的東西:

g->InterpolationMode = System::Drawing::Drawing2D::InterpolationMode::NearestNeighbor; 
g->PixelOffsetMode = System::Drawing::Drawing2D::PixelOffsetMode::None; 
+1

足夠接近;我發現使用'PixelOffsetMode :: Half'並添加了幾個像素來隱藏發生的毛刺,同時水平地對它進行定標。我開始認爲你在跟蹤我的問題漢斯;-) – 2010-07-17 19:55:12

+0

@Jon,是的,沒有開玩笑。你知道你正在做一些不尋常的事情嗎? Windows窗體編碼在C++/CLI中很少完成。 – 2010-07-17 20:25:59

+0

我在相當經常的基礎上提醒了這個事實;-)但是我的團隊中的其他開發人員喜歡C++而不是C#,所以我們傾向於最終編寫GUI。 – 2010-07-18 11:13:30