スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    BitmapからRegionを作る関数

    たま~に必要になるので、メモ。

    		public static Region CreateRegionFromBitmap(Bitmap bitmap)
    		{
    			if (!(bitmap.PixelFormat == System.Drawing.Imaging.PixelFormat.Format24bppRgb ||
    				bitmap.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb ||
    				bitmap.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppRgb))
    				return null;// 24bitか32bit以外は無理
    
    			//ここの変数もっとまともな名前つけたい
    			int channels = Image.GetPixelFormatSize(bitmap.PixelFormat) / 8;
    			int offset = 0;
    			int count = channels;
    			if (bitmap.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    			{//Format32bppArgbの場合はα値のみを確認する
    				count = 1;
    				offset = 3;
    			}
    
    			//ビットマップから生データを取得
    			Rectangle rectBitmap = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
    			System.Drawing.Imaging.BitmapData data = bitmap.LockBits(rectBitmap,
    				System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat);
    			byte[] values = new byte[data.Height * data.Stride];
    			System.Runtime.InteropServices.Marshal.Copy(data.Scan0, values, 0, data.Height * data.Stride);
    			bitmap.UnlockBits(data);
    
    			//透明にする色を取得
    			byte[] transparent = new byte[count];
    			if (count == 1)
    				transparent[0] = 0;
    			else
    			{
    				for (int i = 0; i < count; ++i)
    					transparent[i] = values[i];
    			}
    
    			//リージョンを構成するパスのインスタンス
    			System.Drawing.Drawing2D.GraphicsPath rgnPath = new System.Drawing.Drawing2D.GraphicsPath();
    
    			Rectangle rect = new Rectangle();
    			for (int y = 0; y < data.Height; ++y)
    			{
    				int offsetY = y * data.Stride;
    				for (int x = 0; x < data.Width; ++x)
    				{
    					for (int c = 0; c < count; ++c)
    					{
    						if (transparent[c] != values[offsetY + x * channels + c + offset])
    						{//透過色ではない
    							rect.X = x;//透過色ではないスタート地点を保存
    							for (++x; x < data.Width; ++x)
    							{
    								for (c = 0; c < count; ++c)
    								{
    									if (transparent[c] != values[offsetY + x * channels + c + offset])
    										goto CONTINUE;	//透過色ではないので続ける
    								}
    								break;	//次の透過色を見つけたので脱出
    							CONTINUE:
    								;
    							}
    							rect.Width = x - rect.X;
    							rect.Y = y;
    							rect.Height = 1;
    
    							//ここでパスにrectを加える
    							rgnPath.AddRectangle(rect);
    							break;
    						}
    					}
    				}
    			}
    
    			//最後にパスからリージョンを作成
    			return new Region(rgnPath);
    		}
    
    スポンサーサイト

    【WPF】リストボックスアイテムの選択

    WPFでリストボックスのアイテムにTextBox等を使ったとき、
    TextBoxにフォーカスが言ってもSelectedItemが設定されない。
    これを回避するには次のスタイルを設定するといい。
            
    

    その代り、入力するときは1回目クリック⇒選択、2回目クリック入力可能 となるので注意

    【C#】Wndows7とかで使っているドでかいアイコンを取得

    Windos7のエキスプローラで扱っているドでかいファイルアイコンを取得したかったので調べたら
    同じように調べた人を発見!

    SyntaxSugar C# ファイル名から特大アイコンを取得

    何かの時に使いたくなるだろうからメモ!

    【C#】メッセージボックスを最前面表示させる方法

    ここのところ、書いていなかったので、久しぶりの記事になります。

    ここ2週間はAndroidづくしでしたが、ここではC#の記事を書きます。
    (そろそろ何か書かなくちゃと思って、見に来たら↓書きが残ってたのでそのまま流用 (^^♪ )

    で、本題です。
    メッセージボックスを最前面表示させたい場合。
     たとえば、新着の通知とかを表示させたい場合で、ポップアップフォーム作るのが面倒なときとかかな・・・。

    以下の方法で最前面表示できます。
    (自分もネットでググってしりましたが、よく思いついたもんですね・・・)
     
    using(Form dummyForm =new Form()){
    	dummyForm.TopMost = True;
    	MessageBox.Show(dummyForm, "MessageBox クラスで SystemModal と同様に表示") ;
    	dummyForm.TopMost = False;
    }
    
    要するに、Topmostにしたダミーフォームを作ってそれを親に設定したメッセージボックスを表示すると最前面になるわけです。
    しかもダミーフォームはShowしていないから表示されない。と。

    なるほどね~

    【android】Android AppWidget 3分メイキング(続)

     前回の続きです。
    というか補足です。

    前回の記載内容で、Widgetをホーム画面に表示するところまでできました。
    では、そのWidgetをタップ(クリック)した時に、動作をするようにするにはどうするか。

    手順は以下の通り
     1.ViewにIntentを関連付ける
     2.そのIntentを受け取れるようにする。
     3.受け取ったIntentを処理する。

    1.ViewにIntentを関連付ける
     AppWidgetProvider継承のクラスにて
     a) RemoteViewsクラスを使って、WidgetのレイアウトからViewを取得します。
     b) Intentクラスを生成し、setActionで任意の名前のアクションを関連付けます。
     c) PendingIntentクラスを生成し、取得したRemoteViewsのsetOnClickPendingIntent
         メソッドでPendingIntentを設定する。
     d) 最後にappWidgetManager.updateAppWidgetを呼んでWidgetを更新する。
     (これらの処理は、onUpdateで書くこと。onEnabledは複数Widget起動しても
      1回しか呼ばれないことに注意)

    2.Intentを受け取れるようにする。
     AndroidManifest.xmlのApplication>Application Nodesにて
     Intent Filterに、1で使用する自作のアクションを追加する。

    3.受け取ったIntentを処理する。
     AppWidgetProvider継承のクラスにて
     onReceiveメソッドをオーバーライドし、引数のintent.getAction()を使って
     Intentごとに処理を書く。

    今回は、コードは特に載せてませんが、まあ、書けばわかるかなと。

    わかるかな~。わかったら 拍手!
     
    プロフィール

    ざっち

    Author:ざっち
    ざっちのーと
    ♪自由なSEのメモ帳です♪

    ざっちのスキル一覧
    ----------------
    上級(手足も同然!)
    ・.net FrameWork
    ・C#
    ・SqlServer
    ・VisualBasic6.0
    ----------------
    中級(だいたいOK!)
    ・WPF(XAML)
    ・Android
    ・WindowsMobile6.5
    ・HTML
    ----------------
    下級(や、やればできるさ!)
    ・PHP
    ・JavaScript
    ・SilverLight
    ・SQLite
    ・Python(だってjetCreaterが・・・)
    ・C++(OpenCVいじってみたくて・・・)
    ----------------
    最近のお気に入り
    ・WPF(XAML)
    ・Android
    ・GoogleAPI
    ----------------

    最近の記事
    月別アーカイブ
    カテゴリー
    夢見る羊さん
    地球の名言Ⅱ

    presented by 地球の名言

    Twitter...A

    Twitter < > Reload

    ブロとも申請フォーム

    この人とブロともになる

    ブログ内検索
    RSSフィード
    リンク
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。