(C#)BackgroundImageが描画速度に与える影響

FormにBackGroundImageを設定すると、なんでか知らんがForm上の他のコントロールの描画速度が劇的に遅くなるみたい。

PictureBoxを20個程度並べたFormを作ってたんだけど、FormにBackGroundImageを設定した状態だと、Pictureboxが1個ずつ表示されてた。

けど、BackgroundImageを外したら一瞬で表示されるように。

なんでこんなことになるんだろうな・・・

(C#)PictureBoxを透過させる

まーたドツボにはまったのでメモ。

 

複数のPictureBoxを重ねて、かつ透過させて使いたい場合、

BackColorプロパティをColor.Transparentにするのは当然。

このとき、透けて見えるのはそのPictureBoxの親だということを失念してました。

 

なので、フォームのコンストラクタやLoadイベントなどで、

childPictureBox.Parent = parentPictureBox;

などと設定してやると幸せになれるかも。

(C# & C++/CLI) C++のスタティックライブラリをC#から使う

επιστημηさんの記事

Vista到来。既存C/C++資産の.NET化を始めよう! − @IT

と同じことをVS2012でやろうとしたらちょっとハマったのでメモ。

 

C++/CLIのラッパーライブラリのリンカ設定で、

追加の依存ファイルを設定しないと、リンクエラーになる。

具体的には、C++(ネイティブ)の.libを明示的に指定しないとダメみたい。

 

(C#)フォームを背景色で透過し、透過PNGを表示する

WMPLibを使ってシコシコとプログラム書いてるわけですが。

再生中の動画の上に、任意のタイミングで透過PNGを重ねたいという要望が出まして。

「透過PNGを表示したFormのOpacity下げたらいけるんじゃね?」と軽く考えていたらハマったのでメモ。

「透過PNGを表示したFormのOpacity下げる」と、透過PNGの透過していない部分まで透けちゃうというお粗末なことになりやした。

以下、解決したコード。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Hoge {
    public partial class SukesukeForm : Form {
        public SukesukeForm() {
            InitializeComponent();
        }

        private void
SukesukeForm_Load(object sender, EventArgs e) {
            //背景画像設定
            Bitmap img = new Bitmap("../../img/sukesuke.png");
            img.MakeTransparent();
            this.BackgroundImage = img;

            //フォームを背景色で透過させる
            this.TransparencyKey = BackColor;
            
        }
    }
}

このフォームを動画を再生しているフォームの上に重ねることで達成しました。

めでたしめでたし。

Win8とWebsocket

C#でWebsocketサーバを作りたいんですが、

開発に使っているWin8マシンではどうも上手くいかない。

WCFWebsocketとかSuperWebsocketとか試してみたけど、

クライアントがサーバにメッセージを送ると、サーバが即切断してた。

 

この記事によると、Win8からはWebsocketの扱いが変わった(?)ようで。

結局、C# on Win8でWebsocketサーバを作るときはSystem.Net.WebSocketで。

クライアントはWebsocket4Netがいいみたい。