2009-05-08 12 views
0

オブジェクトをコンテナ内に積み重ねるGUIを作成するように求められました。ユーザは、上から下の視点からボックスを見ることになる。彼らはまた何が内部に積み重なっているのかを見ることができるようにしたいと考えています。これを解決するための私の最初の考えは、透明性でした。透明性に関する記事の一部を読んだことがありますが、両方の画像の問題を解決したものは見つからず、積み重ねられているかどうかを両方見ることができました。スタッキングコントロール(Winforms C#)(透明)

他のコントロールを上に置いて透明にするにはどうすればよいですか?これが本当に可能でない場合。この問題に対するより良いアプローチは何ですか?

私はカスタムコントロール(パブリック部分クラスMyControl:Control)を使用して問題を解決しています。私はついにコントロール上のイメージを透明にしました。親フォームに描画されたものはすべて画像を通して表示されます(親には楕円と四角形をペイントするためにonPaintを使用しています)。しかし、その上に配置された他のコントロールは透明ではありません。

私はこれを達成するために使用しているコードは以下の通りです:

public Image Image 
    { 
    get { return m_Image; } 
    set { m_Image = value; } 
    } 
private void GridControl_Paint(object sender, PaintEventArgs e) 
    { 
    if (Image != null) 
    { 

     Graphics g = e.Graphics; 
     Bitmap bitMap = new Bitmap(Image); 

     //This is not working... the color array always comes back empty 
     //This is how I would rather making things transparent... 
     Color[] colorArray = bitMap.Palette.Entries; 

     if (colorArray.Length > 0) 
     { 

      ColorMap[] colorMap = new ColorMap[colorArray.Length]; 

      for (int index = 0; index < colorArray.Length; index++) 
      { 
       colorMap[index] = new ColorMap(); 
       colorMap[index].OldColor = colorArray[index]; 
       colorMap[index].NewColor = Color.Transparent; 
      } 

     } 

     //Ok fine so the above is not working... let me force it. 
     //Get each pixel in the image and change the color. 
     else 
     { 
      for (int x = 0; x < bitMap.Width; x++) 
      { 
       for (int y = 0; y < bitMap.Height; y++) 
       { 
       Color pixelColor = bitMap.GetPixel(x, y); 
       Color newColor = Color.FromArgb(100, pixelColor); 

       bitMap.SetPixel(x, y, newColor); 
       } 
      } 
     } 

     bitMap.MakeTransparent(); 

     g.DrawImage(bitMap, this.ClientRectangle); 
    } 

    } 

答えて

0

:ここで私はその操作32ビットのビットマップの周りに横たわっていたいくつかの古いコードは(ここで、青、緑、赤とアルファがバイトしている)です。私がこれを行うために見つけた唯一の方法は、カスタムコントロールを作成し、多くのカスタムコードを使用することです(まだ完全には機能していません)。このスレッドを閉じるには、答えが:

このフォーラムでは答えが複雑すぎます。

1

あなたはリサイズを使用してにロックされていますか?あなたが説明するような、やや厄介なグラフィックスを行う必要があり、それを回避するためにアプリケーションを再設計することができない場合は、WPFに飛躍することができます。

私はGDI +グラフィックでプレイしましたので、それはので、ここで考えです、しばらくしている(ただし、コードが;)):

あなたの積み重ねられたコントロールが実際に動作する必要がありますか?そうでない場合は、その外観をビットマップにコピーして非表示にしてから、独自のペイントルーチンでビットマップを使用することができます。コントロールが動作する必要があるときは、それを再表示することができます。

ところで、bitmap.GetPixelまたはSetPixelを使用するのは非常に遅いです。私はこの問題に良い解決策を見つけることができませんでした

BitmapData bmpData = bitmap.LockBits(pixelRect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); 

unsafe 
{ 
    byte* bytes = (byte*)bmpData.Scan0; 
    for (int row = 0; row < pixelRect.Height; row++) 
    { 
     for (int col = 0; col < pixelRect.Width * 4;) // * 4: 4 bytes per pixel 
     { 
      bytes[row * bmpData.Stride + col++] = blue; 
      bytes[row * bmpData.Stride + col++] = green; 
      bytes[row * bmpData.Stride + col++] = red; 
      bytes[row * bmpData.Stride + col++] = alpha; 
     } 
    } 
} 

// Unlock the bits. 
bitmap.UnlockBits(bmpData); 
+0

WinFormsからWPFに移行したいのですが、このプロジェクトではオプションではありません:-( スタックコントロールが必要です。左クリック、他を右クリックしてリストから選択)、適切な場所を移動したり、移動したりする必要があります。 コードをありがとうございます!これはWinFormsで可能であることを証明しようとしているだけです。 – Billy

関連する問題