過去雑記

旧鯖時代の雑記です。新しいの。リンク切れに注意。


2007: 12345678910
2006: 123456789101112
2005: 123456789101112
2004: 456789101112

過去雑記

2004/7/1(木)

コンテストの要綱が発表されました00:08:23

HSPプログラムコンテスト2004 応募規定が発表されました。大体は去年と同じで、最優秀アプリケーション賞が追加された程度ですか。で、今年もショートで実用に耐えるアプリを、と考えていた私はどうすればいいのでしょうか?一般だとDllが使えるので大体のことはできてしまうため、大賞を狙うのはかな〜り厳しい気がします。

コメントはありません。

VS 2005 Express Edition β17:06:00

VS 2005 Express Edition シリーズのβ版が無償で公開されています。HDDに空きがないのでまだ入れていませんがVisual C# 2005 Express Editionは気になっているので入れる予定。

で、前々からVS.NET 2003のHTMLエディタは使い物にならないと言ってきましたが、HollytownさんでVisual Web Developer 2005 Express Edition Betaインストール記録が公開されていました。コレを見るとテンプレートは HTML 4.0 という謎なもの(注:HTML 4.01を使用すべき)から XHTML1.1 という微妙なもの(注:規格どおりに組むと標準設定のIEで表示できない)になったようです。HTMLエディタの動きを確かめたい気もしますが、今のところASP.NETは使う気がないのでまぁいいかな。

コメントはありません。

みら〜じゅ#15(b10)21:29:10

長々と放置するといじった場所を忘れるので早々とリリース。ダウンロード(#15)

みら〜じゅはシンプルな仮想ディスクトップユーティリティです。.NET Framework 1.1 がインストールされた環境で動作します。動作確認は Windows XP のみでととっておりそのほかの環境では知りません。

よーやく多重起動防止処理を実装しました。

ページマネージャの設定ダイアログにD&Dができるようになりました。

コメントはありません。

2004/7/2(金)

VC# 2005 Express Beta1 HTML エディタレビュー21:33:36

4時間くらいかけて VC# 2005 Express Beta1 をインストール、疲れました。

とりあえずHTMLエディタのレビューしようと思った(何故)のですが、VC# だと編集は手打ちだけみたいですね。まぁ私は全部手打ちで行うのでそれはそれでかまわないのですが、デザイナがどの程度変わったのか見たかったので少し残念。

で、このHTMLエディタですがきちんとDOCTYPE宣言を解釈してDTDを読み込みインテリセンスが動きます。この仕様だと不思議マークアップはかなり少なくなると思うので好感が持てます。ただ逆に言えばDTDがないとインテリセンスは動かないわけで、テンプレートにDOCTYPE宣言がないのは(HTMLを理解していない人が多いことを考えると)少しいただけないかと。また、インテリセンスにもいくつか怪しい部分がありXHTML(XML宣言+DOCTYPE宣言)だと <br /> となり問題ないのですが、HTML/XHTML(DOCTYPE宣言のみ)だと <br></br> となるのはバグなのか仕様なのか。。。ほかにもXHTMLだと大丈夫なのにHTMLだと、な部分がいくつか見受けられるのが心配ではあります。

コメントはありません。

VC# 2005 Express Beta1 レビュー 23:33:21

みら〜じゅは普通にコンパイルが通りました。それ関連して調べた範囲で。基本的にメモなので一部文章がおかしかったりしますが、気にしない方向で。

IDEの変更点として Office 2003 スタイル(前のほうがすきなのですが。。。)になったり、文字にアンチエイリアイスがかかったり、キャプションバーをダブルクリックしても最大化しなかったり(改悪ですな)していますが、個人的に大きな変更点としてはToolBoxに読み込んでいるプロジェクトのコンポーネントが表示されるように変更されています。いままでは一々ToolBoxに登録していたり、適当に配置したコントロールをコード編集で変更していたのでこれは便利。

ソリューションエクスプローラ、ツリーアイテムのダブルクリック判定が変わったようです。(私のPCが遅いだけかも)タブレット経由ではダブルクリックが効かなくなりました。

設定は括弧の位置などをかなり詳しく設定できるようになっています。これは口では説明が難しいのでぜひ試してみるべきです。ただ、「Show all settings」をチェックしないと全てのオプションが表示されないというのはやめてほしいような。。。

NotifyIcon の ContextMenu がオーナードローしない問題は修正されているようです。しかし ContextMenu は互換性のために残されており ContexMenuStrip を使ってくれという方針のようで、NotifyIcon.ContextMenu はプロパティに表示されません。このあたり過去の資産を受け継ぐ人にはちょっと。。。といった感じですか。

リストビューのカラムにイメージリストを置けるようになりました。折角作っていたのに。。。

コメント(1)

タイトルバーのダブルクリックはできないのではなくてタブレット経由だと反応しないみたいですね。というかダブルクリック関連全滅。これはマウスを使えということですか?

投稿者: 方位記号 (2004/07/03[Sat] 04:29)

2004/7/3(土)

オーナードローメニュー基本クラス22:06:30

今日は1日中寝ていたためネタがないので不要なコンポーネントをアップしてごまかしてみる。.NET 2.0 では MenuItem は互換のために残っているようなので今回はそれ関連で。

Azumaya.Windows.Forms.OwnerDrawMenuItemBase は オーナードローメニューを扱うための基本クラスです。

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

namespace Azumaya.Windows.Forms {
    /// <summary>
    ///     オーナードローメニュー基本クラスです。
    /// </summary>
    /// <remarks>
    ///     <para><see cref="OwnerDrawMenuItemBase"/> は
    ///     オーナードローメニューを扱う基本クラスです。</para>
    /// </remarks>
    public abstract class OwnerDrawMenuItemBase : System.Windows.Forms.MenuItem {
        private Font      m_font;
        private FontStyle m_fontStyle = FontStyle.Bold;
        public OwnerDrawMenuItemBase() {
            base.OwnerDraw = true;
        }

        /// <summary>
        ///     メニューのフォントを設定します。
        ///     null の場合 <see cref="System.SystemInformation.MenuFont"/>.Windows.Forms
        ///      が使用されます。
        /// </summary>
        public System.Drawing.Font Font {
            get { return this.m_font; }
            set { this.m_font = value; }
        }

        /// <summary>
        ///     <see cref="System.Windows.Forms.MenuItem.DefaultItem"/>
        ///      が true の場合のフォントスタイルを設定します。
        /// </summary>
        public System.Drawing.FontStyle DefultItemFontStyle {
            get { return this.m_fontStyle; }
            set { this.m_fontStyle = value; }
        }

        /// <vlue>
        ///     このアイテムが <see cref="System.Windows.Forms.ContextMenu"/> に
        ///     属するか判定します。
        /// </value>
        protected bool IsContextMenu {
            get { return ((this.Parent as MainMenu) == null); }
        }

        private bool IsShowShortcut() {
            return this.ShowShortcut && (this.Shortcut != Shortcut.None);
        }
        private bool IsShowShortcut( System.Windows.Forms.MenuItem item ) {
            return item.ShowShortcut && (item.Shortcut != Shortcut.None);
        }


        /// <summary>
        ///     標準的なメニューテキストの描画を行います。
        /// </summary>
        protected virtual void DrawMenuText( DrawItemEventArgs e,
            Brush brush, int x, int y )
        {
            int[] textPos = CalcMenuTextWidth( e.Graphics );
            using( System.Drawing.Font font = GetMenuFont() ) {
                StringFormat sf = new StringFormat();
                sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show;
                string tempText = this.Text;
                if( IsShowShortcut() && ShowShortcut && (Shortcut != Shortcut.None) )
                    tempText += Shortcut.ToString();
                string[] text = tempText.Split(new char[] { '¥t' } );
                e.Graphics.DrawString( text[0], font, brush, x, y, sf );
                for( int i=1; i<text.Length; i++ ) {
                    e.Graphics.DrawString( text[i], font, brush,
                        x+textPos[i-1], y, sf );

                }
            }
        }

        #region チェックマーク描画 DrawCheck()
        /// <summary>
        ///     メニューのチェックマークを描画します。
        /// </summary>
        /// <param name="graphics">描画先Graphics</param>
        /// <param name="x">描画位置X</param>
        /// <param name="y">描画位置Y</param>
        /// <param name="width">横幅</param>
        /// <param name="height">縦幅</param>
        protected virtual void DrawCheck( System.Drawing.Graphics graphics,
            int x, int y, int width, int height ) {
            if( !this.Checked ) return;
            // チェックマーク描画
            using( System.Drawing.Bitmap bmp = new Bitmap(width, height) ) {
                using( System.Drawing.Graphics g = Graphics.FromImage(bmp) ) {
                    MenuGlyph menuGlyph = (this.RadioCheck)
                        ? System.Windows.Forms.MenuGlyph.Bullet :
                        System.Windows.Forms.MenuGlyph.Checkmark;
                    System.Windows.Forms.ControlPaint.DrawMenuGlyph(
                        g, 0, 0, bmp.Width, bmp.Height, menuGlyph );
                    bmp.MakeTransparent( bmp.GetPixel(0, 0) );
                    for( int cx=0; cx<bmp.Width; cx++ )
                        for( int cy=0; cy<bmp.Height; cy++ )
                            if( 0xff000000u == (uint)bmp.GetPixel(cx, cy).ToArgb() ) {
                                bmp.SetPixel( cx, cy, SystemColors.WindowText );
                            }
                    graphics.DrawImage( bmp, x, y, bmp.Width, bmp.Height );
                }
            }       
        }
        /// <summary>
        ///     メニューのチェックマークを描画します。
        /// </summary>
        /// <param name="graphics">描画先Graphics</param>
        /// <param name="point">描画座標</param>
        /// <param name="size">描画サイズ</param>
        protected virtual void DrawCheck( System.Drawing.Graphics graphics,
            System.Drawing.Point point, System.Drawing.Size size ) {
            this.DrawCheck( graphics, point.X, point.Y, size.Width, size.Height );
        }
        /// <summary>
        ///     メニューのチェックマークを描画します。
        /// </summary>
        /// <param name="graphics">描画先Graphics</param>
        /// <param name="rect">描画先矩形</param>
        protected virtual void DrawCheck( System.Drawing.Graphics graphics,
            System.Drawing.Rectangle rect )
        {
            this.DrawCheck( graphics, rect.X, rect.Y, rect.Width, rect.Height );
        }
        #endregion

        #region メニューフォント取得 GetMenuFont()
        /// <summary>
        ///     現在のメニューアイテムの情報を元にメニューフォントを取得します。
        /// </summary>
        /// <returns>メニューフォント</returns>
        protected virtual System.Drawing.Font GetMenuFont() {
            return GetMenuFont( (this.DefaultItem) ?
                System.Windows.Forms.DrawItemState.Default : 0 );
        }
        /// <summary>
        ///     System.Windows.Forms.DrawItemState を元にメニューフォントを取得します。
        /// </summary>
        /// <param name="state"></param>
        /// <returns>メニューフォント</returns>
        protected virtual Font GetMenuFont( DrawItemState state ) {
                if( (state & System.Windows.Forms.DrawItemState.Default) != 0 ) {
                return new System.Drawing.Font(
                    SystemInformation.MenuFont,
                    FontStyle.Bold );
            } else {
                return (Font)MenuFont.Clone();
            }
        }
        #endregion

        #region OnMeasureItem 関連
        /// <summary>
        ///     メニューテキストサイズを計算。タブ区切りで計算します。
        /// </summary>
        /// <param name="g">描画対象の Graphics</param>
        /// <returns>タブごとの最大のサイズ</returns>
        private int[] CalcMenuTextWidth( Graphics g ) {
            string text;
            string[] tab_text;
            System.Windows.Forms.Menu menu = this.Parent;
            System.Collections.ArrayList list
                = new System.Collections.ArrayList( 8 );
            list.Add( 0 );  // 0番はあらかじめ埋め込んでおく。
            StringFormat sf = new StringFormat();
            sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show;
            using( System.Drawing.Font font = GetMenuFont() ) {
                for( int i=0; i<menu.MenuItems.Count; i++ ) {
                    MenuItem item = menu.MenuItems[i];
                    text = item.Text + ( IsShowShortcut( item )
                        ? "¥t"+item.Shortcut.ToString() : null );
                    // テキストをタブで区切る
                    tab_text = text.Split( new char[] { '¥t' } );
                    for( int c=0; c<tab_text.Length; c++ ) {
                        // 頭にスペースを付加
                        string tmp_text = tab_text[c] 
                            + ((tab_text.Length == c) ? " " : null);
                        System.Drawing.SizeF size
                            = g.MeasureString( tmp_text, font,
                            tmp_text.Length*font.Height*2, sf );

                        if( list.Count <= c )
                            list.Add( (int)size.Width );
                        else if( (int)list[c] < (int)size.Width )
                            list[c] = (int)size.Width;
                    }
                }
            }
            int[] ret = new int[list.Count];
            for( int i=0; i<list.Count; i++ )
                ret[i] = (int)list[i];
            return ret;
        }
        private int GetItemTextSize( MeasureItemEventArgs e ) {
            using( System.Drawing.Font font = GetMenuFont() ) {
                int ret = 0;
                foreach( int t in CalcMenuTextWidth( e.Graphics ) ) 
                    ret += t;
                return ret+(IsContextMenu ? font.Height : 0);
            }
        }

        /// <summary>一般的なアイテムの長さを返します。</summary>
        protected System.Drawing.Size GetItemSize( MeasureItemEventArgs e ) {
            Size ret;
            base.OnMeasureItem (e);
            if(this.Visible ) {
                using( System.Drawing.Font font = GetMenuFont() ) {
                    string menuText = this.Text;
                    StringFormat sf = new StringFormat();
                    sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show;
                    System.Drawing.SizeF size = e.Graphics.MeasureString(
                        menuText, font, menuText.Length*font.Height*2, sf );

                    ret = new Size(
                        GetItemTextSize( e ),
                        ( this.Text == "-" ) ? 5 : (int)size.Height
                    );
                }
            } else {
                ret = new Size(0, 0);
            }
            return ret;
        }

        protected override void OnMeasureItem(MeasureItemEventArgs e) {
            if( IsContextMenu ) {
                MeasureContectMenuItem( e );
            } else {
                MeasureMainMenuItem( e );
            }
            base.OnMeasureItem (e);
        }
        /// <summary>
        ///     メインメニューアイテムサイズを設定する際に呼ばれます。
        /// </summary>
        protected virtual void MeasureMainMenuItem(MeasureItemEventArgs e) {}
        /// <summary>
        ///     コンテクストメニューアイテムサイズを設定する際に呼ばれます。
        /// </summary>
        protected virtual void MeasureContectMenuItem(MeasureItemEventArgs e) {}
        #endregion

        #region OnDrawItem 関連
        /// <summary>セパレータを描画する際呼ばれます</summary>
        protected virtual void DrawItemSeparator( DrawItemEventArgs e ) {}
        /// <summary>無効なメニューアイテムを描画する際呼ばれます</summary>
        protected virtual void DrawItemDisabled( DrawItemEventArgs e ) {}
        /// <summary>メニューアイテム(ホットトラック)を描画する際呼ばれます
        /// </summary>
        protected virtual void DrawItemHotLight( DrawItemEventArgs e ) {}
        /// <summary>メニューアイテム(選択)を描画する際呼ばれます</summary>
        protected virtual void DrawItemSelected( DrawItemEventArgs e ) {}
        /// <summary>通常のメニューアイテムを描画する際呼ばれます</summary>
        protected virtual void DrawItemCommon( DrawItemEventArgs e ) {}

        protected override void OnDrawItem( DrawItemEventArgs e ) {
            if( this.Text == "-" ) {
                // アイテムはセパレータ。
                DrawItemSeparator( e );
            } else if( (e.State & DrawItemState.Disabled) != 0 ) {
                // アイテムは無効。
                DrawItemDisabled( e );
            } else if( (e.State & DrawItemState.HotLight) != 0 ) {
                // アイテムはホットトラック中
                DrawItemHotLight(e);
            } else if( (e.State & DrawItemState.Selected) != 0 ) {
                // アイテムは選択されている
                DrawItemSelected( e );
            } else {
                // それ以外
                DrawItemCommon( e );
            }
            base.OnDrawItem (e);
        }
        #endregion
    }
}

ライセンスは NYSL です。ご自由に使っていただいてかまいません。使用したアプリを配布する際に使っている旨を示していただければ喜びます。今後メンテの予定はないのでバグ・要望は受け付けはしますが、実際に行うかはわかりません。

コメント(1)

記述ミスがありました。DrawMenuText() 内if( IsShowShortcut() && ShowShortcut && (Shortcut != Shortcut.None) ) tempText += Shortcut.ToString();↓if( IsShowShortcut() && ShowShortcut && (Shortcut != Shortcut.None) ) tempText += "¥t"+Shortcut.ToString();に変更してください。

投稿者: 方位記号 (2004/07/03[Sat] 23:02)

アイコンメニューアイテムクラス22:20:40

Azumaya.Windows.Forms.IconMenuItemはアイコンを持つMenuItemです。使用するにはAzumaya.Windows.Forms.OwnerDrawMenuItemBaseが必要です。

using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
namespace Azumaya.Windows.Forms {
    /// <summary>アイコンを持つメニューアイテムです。</summary>
    public class IconMenuItem : Azumaya.Windows.Forms.OwnerDrawMenuItemBase {
        private System.Drawing.Image m_img;
        public IconMenuItem() : this( null ) {}
        public IconMenuItem( System.Drawing.Image bmp ) {
            m_img = bmp;
        }

        /// <summary>
        ///     メニューに表示するアイコンイメージを取得、または設定します。
        /// </summary>
        [Category("Appearance"), Description("メニューに表示するアイコンイメージ")]
        public System.Drawing.Image IconImage {
            get {
                return this.m_img;
            }
            set {
                this.m_img = value;
            }
        }

        protected override void Dispose(bool disposing) {
            if( this.m_img != null )this.m_img.Dispose();
            base.Dispose (disposing);
        }

        #region MeasureItem
        protected override void MeasureMainMenuItem(MeasureItemEventArgs e) {
            Size size = GetItemSize( e );
            if( this.Visible ) {
                e.ItemWidth  = size.Width;
                e.ItemHeight = size.Height;
            } else {
                e.ItemWidth = e.ItemHeight = 0;
            }
            base.MeasureMainMenuItem (e);
        }
        private int GetMenuImageHeight() {
            int height = SystemInformation.SmallIconSize.Height;
            for( int i=0; i<this.Parent.MenuItems.Count; i++ ) {
                IconMenuItem menu = this.Parent.MenuItems[i] as IconMenuItem;
                if( menu  != null )
                    if( menu.IconImage != null )
                        if( height < menu.IconImage.Height )
                            height = menu.IconImage.Height;
            }
            return height;
        }

        protected override void MeasureContectMenuItem(MeasureItemEventArgs e) {
            Size size = GetItemSize( e );
            if( this.Visible ) {
                int height = GetMenuImageHeight();
                e.ItemWidth  = size.Width+GetMenuImageWidth();
                e.ItemHeight = (this.Text == "-") ? 5 : (height+5);
            } else {
                e.ItemWidth = e.ItemHeight = 0;
            }
            base.MeasureContectMenuItem (e);
        }
        #endregion

        #region OnDrawItem
        private int GetMenuImageWidth() {
            int width = SystemInformation.SmallIconSize.Width;
            for( int i=0; i<this.Parent.MenuItems.Count; i++ ) {
                IconMenuItem menu = this.Parent.MenuItems[i] as IconMenuItem;
                if( menu  != null )
                    if( menu.IconImage != null )
                        if( width < menu.IconImage.Width )
                            width = menu.IconImage.Width;
            }
            return width;
        }
        protected virtual Rectangle GetIconRect( DrawItemEventArgs e ) {
            if( IsContextMenu ) {
                int width = GetMenuImageWidth();
                return new Rectangle( e.Bounds.X, e.Bounds.Y,
                    width+4, e.Bounds.Height );         
            } else {
                return new Rectangle( e.Bounds.X, e.Bounds.Y, 0, 0 );
            }
        }
        protected virtual Rectangle GetTextRect( DrawItemEventArgs e ) {
            Rectangle rect = e.Bounds;
            if( IsContextMenu ) {
                int width = GetMenuImageWidth();
                rect.X = width+4;           
            }
            return rect;
        }

        #region protected virtual method
        /// <summary>背景を描画します。</summary>
        protected virtual void DrawBackGround( DrawItemEventArgs e ) {
            if( this.Text == "-" ) {
                // アイテムはセパレータ
                using( SolidBrush brush = new SolidBrush(SystemColors.Control) ) {
                    e.Graphics.FillRectangle( brush, e.Bounds );
                }
            } else if( (e.State & System.Windows.Forms.DrawItemState.HotLight) != 0 ) {
                // アイテムはホットトラック中
                Brush brush    = new SolidBrush( SystemColors.Control );
                Pen   penLight = new Pen( SystemColors.ControlLightLight );
                Pen   penDarak = new Pen( SystemColors.ControlDark );
                try {
                    int  x = e.Bounds.Left;
                    int  y = e.Bounds.Top;
                    int xx = e.Bounds.Right-1;
                    int yy = e.Bounds.Bottom-1;
                    e.Graphics.FillRectangle( brush, e.Bounds );
                    e.Graphics.DrawLine( penLight, x, y, xx, y );
                    e.Graphics.DrawLine( penLight, x, yy, x, y );
                    e.Graphics.DrawLine( penDarak, xx, y, xx, yy );
                    e.Graphics.DrawLine( penDarak, xx, yy, x, yy );
                }
                finally {
                    brush.Dispose();
                    penLight.Dispose();
                    penDarak.Dispose();
                }
            } else if( ((e.State & DrawItemState.Selected) != 0 )
                && (this.Enabled) )
            {
                // アイテムは選択されている
                if( IsContextMenu ) {
                    using( SolidBrush brush = new SolidBrush(SystemColors.Highlight) ) {
                        e.Graphics.FillRectangle( brush, e.Bounds );
                    }
                } else {
                    Brush brush    = new SolidBrush( SystemColors.Control );
                    Pen   penLight = new Pen( SystemColors.ControlLightLight );
                    Pen   penDarak = new Pen( SystemColors.ControlDark );
                    try {
                        int  x = e.Bounds.Left;
                        int  y = e.Bounds.Top;
                        int xx = e.Bounds.Right-2;
                        int yy = e.Bounds.Bottom-2;
                        e.Graphics.FillRectangle( brush, e.Bounds );
                        e.Graphics.DrawLine( penDarak, x, y, xx, y );
                        e.Graphics.DrawLine( penDarak, x, yy, x, y );
                        e.Graphics.DrawLine( penLight, xx, y, xx, yy );
                        e.Graphics.DrawLine( penLight, xx, yy, x, yy );
                    }
                    finally {
                        brush.Dispose();
                        penLight.Dispose();
                        penDarak.Dispose();
                    }
                }
            } else {
                // それ以外
                using( SolidBrush brush = new SolidBrush(SystemColors.Control) ) {
                    e.Graphics.FillRectangle( brush, e.Bounds );
                }
            }
        }

        private void DrawMenuTextCommon( DrawItemEventArgs e, Brush brush ) {
            using( Font font = GetMenuFont(e.State) ) {
                Rectangle rc = GetTextRect( e );
                base.DrawMenuText( e, brush,rc.X+5,
                    rc.Top+((rc.Bottom-rc.Top)/2)-font.Height/2-1 );
            }
        }
        #endregion

        protected override void DrawItemSeparator(DrawItemEventArgs e) {
            DrawBackGround( e );
            Pen   penLight = new Pen( SystemColors.ControlLight );
            Pen   penDarak = new Pen( SystemColors.ControlDark );
            try {
                int  x = e.Bounds.Left+2;
                int  y = e.Bounds.Top+e.Bounds.Height / 2;
                int xx = e.Bounds.Right-2;
                e.Graphics.DrawLine( penDarak, x, y,   xx, y );
                e.Graphics.DrawLine( penLight, x, y+1, xx, y+1 );
            }
            finally {
                penLight.Dispose();
                penDarak.Dispose();
            }
        }

        protected override void DrawItemDisabled(DrawItemEventArgs e) {
            DrawBackGround( e );
            DrawIcon( e );
            using( SolidBrush brush = new SolidBrush(SystemColors.ControlDark) ) {
                DrawMenuTextCommon( e, brush );
            }
        }

        protected override void DrawItemHotLight(DrawItemEventArgs e) {
            using( SolidBrush brush = new SolidBrush(SystemColors.WindowText) ) {
                DrawBackGround( e );
                DrawIcon( e );
                DrawMenuTextCommon( e, brush );
            }
        }

        protected override void DrawItemSelected(DrawItemEventArgs e) {
            DrawBackGround( e );
            DrawIcon( e );
            SolidBrush brush = new SolidBrush(SystemColors.Window);
            Font font = GetMenuFont( e.State ) ;
            try {
                Rectangle rc = GetTextRect( e );
                int x = rc.Left + 5;
                int y = rc.Top+((rc.Bottom-rc.Top)/2)-font.Height/2;
                if( IsContextMenu ) {
                    brush.Color = SystemColors.Window;
                } else {
                    x++;
                    brush.Color = SystemColors.WindowText;
                }
                base.DrawMenuText( e, brush, x, y );
            }
            finally {
                brush.Dispose();
                font.Dispose();
            }
        }

        protected override void DrawItemCommon(DrawItemEventArgs e) {
            DrawBackGround( e );
            DrawIcon( e );
            using( SolidBrush brush = new SolidBrush(SystemColors.WindowText) ) {
                DrawMenuTextCommon( e, brush );
            }
        }

        private Point GetDrawImagePos(DrawItemEventArgs e) {
            if( this.IconImage != null ) {
                Rectangle rect = GetIconRect( e );
                int x = (rect.Width-this.IconImage.Width)/2;
                int y = (rect.Height-this.IconImage.Height)/2;
                return new Point( e.Bounds.X+x, e.Bounds.Y+y);
            } else {
                return new Point( 0 );
            }
        }
        /// <summary>アイコン描画します。</summary>
        protected virtual void DrawIcon( DrawItemEventArgs e ) {
            if( (this.m_img == null) || (this.Checked) ) {
                Rectangle rect = GetIconRect( e );
                int x = (rect.Width-SystemInformation.SmallIconSize.Width)/2;
                int y = (rect.Height-SystemInformation.SmallIconSize.Height)/2;
                DrawCheck( e.Graphics, e.Bounds.X+2, e.Bounds.Y+2,
                    e.Bounds.Height-4, e.Bounds.Height-4 );
                return;
            }
            using( Bitmap bmp = new Bitmap(this.m_img) ) {
                Point pt = GetDrawImagePos( e );
                if( (e.State & DrawItemState.Disabled) != 0 ) {
                    // アイテムは無効。
                    using( Bitmap disBitmap = (Bitmap)bmp.Clone() ) {
                        bmp.MakeTransparent();
                        disBitmap.MakeTransparent();
                        FillBitmapShadow( disBitmap,
                            SystemColors.ControlDark, true );
                        e.Graphics.DrawImage( disBitmap, pt.X, pt.Y );
                    }
                } else  {
                    e.Graphics.DrawImage( bmp, pt.X, pt.Y );
                }
            }
        }

        private void FillBitmapShadow( Bitmap bmp, Color c, bool isTrance ) {
            Color cor;
            for( int bx=0; bx<bmp.Width; bx++ ) {
                for( int by=0; by<bmp.Height; by++ ) {
                    cor = bmp.GetPixel(bx, by);
                    if( (cor.ToArgb()&0xffffff) != 0 ) {
                        if( (128<cor.R) && (128<cor.G) && (128<cor.B) && isTrance ) {
                            bmp.SetPixel( bx, by, Color.FromArgb(0) );
                        } else {
                            bmp.SetPixel( bx, by, c );
                        }
                    }
                }
            }
        }

        #endregion
    }
}

ライセンスは NYSL です。ご自由に使っていただいてかまいません。使用したアプリを配布する際に使っている旨を示していただければ喜びます。今後メンテの予定はないのでバグ・要望は受け付けはしますが、実際に行うかはわかりません。

スクリーンショットは、Ribbon時代にのっけたからいいですよね?というか実装してないのでやりたくてもできないのですが。

コメントはありません。

2004/7/4(日)

VC# 2005 Express Beta1 スクリーンセーバプロジェクト02:49:48

C#でスクリーンセーバーを〜とtheSpokeのblogに書いている人がいたので、VC# 2005 Express Beta1 のスクリーンセーバプロジェクトを作ってみたのですがなんなのでしょうね、コレ。いきなりひとつのアプリケーションとして完成してるのはサンプルでもないのにやめてほしいです。機能自体も中途半端でプレビューダイアログは作れませんし9xのパスワードにも対応していません。何よりデバッグができないのはいかがなものかと。

需要があるのなら手持ちのスクリーンセーバライブラリでもまたアップしましょうかねぇ。

コメントはありません。

ウィルス沢山20:51:59

昨日から NETSKY が異常にきています。どなたか知りませんがウィルスチェックをお願いします。

コメントはありません。

2004/7/5(月)

Visual Web Developer 2005 Express Edition Beta1 HTMLデザイナはダメ17:34:17

多少デザイナに期待していましたが、見事に期待はずれ。次はDOCTYPEを設定して Visual Web Developer 2005 Express Edition Beta1 のデザイナで書いてみた結果。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//w3c//dtd xhtml 1.0 strict//en"
    "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
<html>
<body>
    <span style="font-family: MS UI Gothic">a</span>

</body>
</html>

見てのとおり body 直下に span が来ています。これは規格上認められない書式です。まだ弄くってみればあらが出てきそうですが、すでにこの時点で使う価値なし状態なので多分しません。

コメントはありません。

VS.NET 2003 C# スクリーンセーバテンプレート#118:54:33

C# でスクリーンセーバを作成するための VS.NET 2003 用テンプレートです。ダウンロード(#1)

ドキュメントは整備中です。まぁ単に作成するだけならサンプル見れば分かると思いますが。

半年以上前のコードを掘り起こして気に入らないところを変更したのでエンバグが存在している可能性があります。

コメントはありません。

2004/7/6(火)

NHK(日本ひきこもり協会)へようこそ#123:30:43

某所で絶賛されていたので買ってみたのですが、うーんイマイチ。イロモノ系ではありますが、私の好みとは方向性が違うかな。

とりあえずヒロインを描いてみたわけですが、似てません。タッチが違う絵を自分流にアレンジして似せるというのはまだ修行が足りないようです。

コメントはありません。

2004/7/7(水)

微妙なサービスな気が23:42:28

 ASAHIネットは、Webサイトの更新情報をメールで通知するサービス「MAILPIA(メールピア)」を7月7日より開始する。

メールで通知されても携帯電話のようにリアルタイムで受信できないと意味がないような。。。

コメント(1)

7/7って今日、ということで見てきました。とりあえず送信先に好きなメールアドレスを設定できるようです。これ以上は使わないので知りません。

投稿者: 方位記号 (2004/07/07[Wed] 23:48)

2004/7/8(木)

VS.NET 2003 C# スクリーンセーバテンプレート#201:31:15

日付変わってしまいました。ダウンロード(#2)

Azumaya.Windows.ScreenSavers.NativeWindow を ScreenSaver のインナークラスに変更。

ドキュメントを加筆中。

サンプルをわりとまともに。

コメントはありません。

2004/7/9(金)

.NET 2.0 Luna Style 周りメモ22:04:39

ドラクエを弟君が人に貸してしまったのでそろそろ復帰したいかなと思います。(ま、最近は別件で更新が投げやりなのであまり変わらないかもしれませんが)

アップダウンコントロールとチェックリストボックスにLunaが適用できるようになりました。.NET のアップダウンは何故だかコモンコントロールではなく自前で実装されているので今まで適用できなかったのは仕様ということになるのでしょうが、ここでようやく対応のようです。

ToolStrip はLuna適用状態(規定、青)だとシステム色ではなく青っぽい色になります。このときコンテナの背景までが青くなってしまい、他との整合性が崩れてしまいます。これはバグ?そもそもこのあたりの色が変えられないのはやめてほしいような。

コメントはありません。

2004/7/10(土)

HSPコンテスト200423:03:41

応募受付を開始しました。今年はメールじゃなくてCGIですか。

コメントはありません。

2004/7/11(日)

.NET で DOM02:18:24

.NET で DOM は使えないのかなーと思ってたのですが、[HOWTO] Visual C# .NET により .NET Framework 内で DOM を使用して XML データにアクセスする方法を発見。ということでそのうちみら〜じゅの設定ファイルはXMLに移行します。

コメントはありません。

2004/7/12(月)

みら〜じゅ#16(b11)02:03:01

次回は中身をいじります。ダウンロード(#16)

みら〜じゅはシンプルな仮想ディスクトップユーティリティです。.NET Framework 1.1 がインストールされた環境で動作します。動作確認は Windows XP のみでととっておりそのほかの環境では知りません。

登録禁止設定にクラス選択ダイアログがつきちょっと親切に。ウィンドウテキストのほうもいりますかねぇ。

登録禁止に正規表現を用いることができるようになりました。

コメントはありません。

2004/7/13(火)

コンテストネタ決定22:33:42

とりあえず、コンテストのネタ決定。ネタが決まっただけでまだ調べてないため、実現できるかは不明でなので詳細は秘密ということで。ただ他所のサイト回ってるとメインのDllをCで組んでUIをHSPで〜なんてのがあるのですがこれってやっていいのですかねぇ。

さしあたっての問題はここ数日の修羅場とspiceのサイト構築が終わってないのでいつになったら取り掛かれるのかという点ですか。

コメントはありません。

2004/7/14(水)

PHP 5.022:18:42

PHP開発チームは13日(米国時間)、Web用スクリプト言語の最新版「PHP 5.0」をリリースした。

非常に微妙なタイミングで登場。まぁXREAさんがいれてくれないことには始まらないのですが、azulogの改修版はどちらで組みますか。。。

コメントはありません。

2004/7/15(木)

世の中金ですか。22:33:39

「これ、クワガタ。」「それ何円で売れる?」

下校中の小学生(たぶん背丈から低学年)の会話です。なんなんでしょうね、最近の小学生って。

コメントはありません。

2004/7/16(金)

修羅場終了23:36:32

と、いうことでぼちぼち復帰したいと思います。さしあたってはspiceのサイト構築ですか。

コメントはありません。

2004/7/17(土)

.NET Framework 2.0 SDK 日本語版00:31:24

.NET Framework 2.0 SDK 日本語版が公開されています。ただ流石にドキュメントは日本語ではありませんでした。たぶんツール類が日本語になったのでせう。←調べろ

ちなみにこれ(Lang pack だけでもよいかも)を VS Express、設定の国際化に日本語が加わり日本語で表示されるようになり(一部まだ翻訳されてません)ますが、これを設定するとプロジェクトが作れなくなる(テンプレートが登録されていない)ので実質無意味です。日本語版β待ちってことですね。

コメントはありません。

サイト構造に関するメモ23:53:41

もう少しまともにしたほうがよいかとリニューアル(たぶん色までは変えない)計画中。で、現在のトップページのアウトライン。

h1:Home
  h2:雑記-日付
    h3:雑記-タイトル
  h2:参加もの

「雑記-日付」と「参加もの」がh2で同列なのはおかしい気が。

h1:Home
  h2:1週間分の雑記
    h3:雑記-日付
      h4:雑記-タイトル
  h2:参加もの

かといってこちらだと冗長すぎな気も。そもそも「参加もの」がとってつけたような扱いなのを何とかしたほうがよい気がしますね。むぅ。

コメントはありません。

2004/7/18(日)

HDDのメンテはマメに22:45:36

増設したHDDに何も考えずにファイルを入れていると空きがなくなっていました。目に付いた不要ファイルを削除すると30G程度あいたのでとりあえずよし、と。

コメントはありません。

PHP5かPHP4か23:45:20

XREAのサポートBBSに今のところ導入予定はない、と書かれているので、とりあえずPHP4で行こうかと思います。

コメントはありません。

2004/7/19(月)

デザインとアクセシビリティと22:53:15

CSSの問題点は柔軟性が乏しいためある程度の見栄えを追及しようとするとどうしても、論理マークアップといえど物理的なマークアップに近いマークアップを行わなければいけない。そこでデータは完全な論理マークアップ、クライアント側でXSLTを用いて物理マークアップに切り替えればそれなりのアクセシビリティとデザインを両立できるのではないか。

というのを考えてみましたが、細かいところ見ると穴ありそう。まぁようするにプログラマブルなスタイルシートが欲しいと。

コメントはありません。

2004/7/20(火)

12歳本効果?22:40:26

最近HSP本家の質問のレベルが下がった気がします。内容じゃなくて質問の仕方のほう。「できません」「わかりません」「教えてください」これだけで「何が分からないのか」「何をやったのか」が曖昧。質問するのだからこれくらい書いてほしいものです。

theSpoke もこうなるのですかねぇ。

コメントはありません。

2004/7/21(水)

ネタがない23:17:03

昨日おさばきアドベンチャーの値段を調べに行ったら発売日が7/29でした。そりゃ売ってない。ジャンル:おさばきアドベンチャーってどこの棚かとしばらく探していたのは秘密です。

コメントはありません。

2004/7/22(木)

ネタ見つかる02:08:56

危ないIEはもう不要? 代替ブラウザーのお勧めリストのなかにIEコンポーネントブラウザが含まれているように見えるのは私の気のせいでしょうか。以前ITmediaに似た記事が上がった際には「外国ではIEコンポーネントブラウザは少ない」みたいな事言ってたので今回もそれなのでしょうけど。

コメントはありません。

2004/7/23(金)

リストビューにプログレスバーを置く22:31:13

theSpoke に投げたリストビューにプログレスバーを置くサンプル。C# 2.0bでコンパイル可能。

using System; using System.Windows.Forms; class MyForm : Form { ListView listView; ProgressBar progBar; Timer timer; public MyForm() { this.listView = new ListView(); this.progBar = new ProgressBar(); this.timer = new Timer(); this.SuspendLayout(); // コントロールの親を設定 this.Controls.Add( this.listView ); this.listView.Controls.Add( this.progBar ); this.listView.View = View.Details; this.listView.Dock = DockStyle.Fill; this.listView.GridLines = true; // アイテムの設定 // ListView.Items[1] に ProgressBar が来る this.listView.Columns.Add( new ColumnHeader() ); this.listView.Columns[0].Text = "Column"; this.listView.Items.Add( new ListViewItem( "Item" ) ); this.listView.Items.Add( new ListViewItem() ); // ListView.Columns サイズ変更の際 ProgressBar のサイズを変更する // このイベントは .NET 2.0 からの実装で 1.x には存在しない this.listView.ColumnWidthChanged += delegate( object sender, ColumnWidthChangedEventArgs e ) { // この時点では ListViewItem.Bounds の値は更新されていない // よって2列目以降のカラムに置く際はこの実装は使えない this.progBar.Width = this.listView.Columns[0].Width; }; // ListView.Items[1] に ProgressBar を置く this.progBar.Bounds = this.listView.Items[1].Bounds; this.progBar.Height--; // 定期的に ProgressBar を更新するためのタイマーを設定 this.timer.Interval = 500; this.timer.Enabled = true; this.timer.Tick += delegate( object sender, EventArgs e ) { int v = this.progBar.Value + 10; this.progBar.Value = (this.progBar.Maximum < v) ? this.progBar.Minimum : v; }; this.ResumeLayout(); } static void Main() { Application.Run( new MyForm() ); } }

コメントはありません。

ウィルス23:47:16

Yahoo! BB のアカウントからのウィルスメールが異常に来ています。メールチェックをお願いします。スパムも最近大量に来ますしこのアドレス潰してほうがよいですかねぇ。。。

コメントはありません。

2004/7/24(土)

「あずまや」検索で2位23:18:43

何故だかgoogle先生で「あずまや」と検索すると2位に来てます。1位の方はSEOで最適化してるっぽいので1位になるのは厳しそう。まぁ1位になったところでなんの意味もないのですが。そんなことよりもっと雑記過去ログなどを補足してほしかったり。

で、Yahooはいつになったら認知していただけるのでしょうか。

コメントはありません。

2004/7/25(日)

ネタがないときの占いもの22:47:21

☆死ぬ間際占い☆やってみた。

方位記号さんは【 墓場 】で死にます! ● 墓場で死んでしまうあなたゎ、 トモダチの命日でお墓に行ったら、トモダチに【一緒に天国へ行こうよ】と道連れにされて死んでしまう、とてもトモダチに想われた死に方をするでしょう。 最後に言う言葉は『牛丼って何円?』です。 ● 方位記号さんの心のふるさとは、カリフォルニアです。

天国にいけた友達オメデトウ(違)

コメントはありません。

2004/7/26(月)

ネタがないときのチェックもの22:56:24

アニメ汚染度チェック!やってみた。

あなたは 42.3% アニメに汚染されています。 汚染度はかなり高いです。 立ち直るのはまず無理にちかいでしょうが、誰も止められません。 でも、家族や友達の意見に耳を傾けて社会復帰する方が 自分で強い気持ちと信念を持てば脱せます。 次の新作アニメを見ようとしているなら止めた方がいいかも。 さらに高いところを目指す根性と気合があるのなら、 あなたのためかも知れません。

週1本でなんで 42.3% ?ていうか200%超えるんですねコレ。

あなたは 227.95% アニメに汚染されています。 あなたはもう人間ではありません。 神かミジンコでしょう。 貴方自身がアニメであり、アニメが貴方であり・・・ 何のために生きているの?と聞いてみたいです。 アニメを見ていると楽しいということもなく、それが当たり前。 秋葉やイベント、家以外に行く場所はないでしょう。 あったとしても怪しい場所ばかり。 ラッキーカラーも良い方角もありません。 それより、友達います?

コメントはありません。

2004/7/27(火)

ネタがないときの、、、23:18:30

ネタないので今日はお休み。というか1日ずれてました。

コメントはありません。

2004/7/28(水)

このサイトも3年目突入です。00:30:23

ということで記念絵:ザクウォーリア(線画,JPEG 39KB)

記念絵なのでくり〜むぱんの人(この設定って公開しましたっけ?)を描こうかと思ったのですが某所でこれを見て路線変更、どのあたりが記念なのか分からない結果に。ジンより後の機体のはずなのに動力ケーブルが露出しているあたりが素敵です。右手に何か持たせようとしたのですが、資料が見つからず断念。

コメントはありません。

NDSどうしよーか21:17:03

 任天堂株式会社は、2004年内の発売を目指している新型携帯ゲーム機「ニンテンドー DS」の正式デザインを公開した。また名称も正式に「ニンテンドー DS (英名表記:NINTENDO DS) 」に決定した。  しかし現状では、発売日はこれまでのアナウンス通り日本と米国で2004年内、欧州で2005年1〜3月を予定している。また価格も未定となっている。

価格はどうなるのでしょうね。20000弱との情報も流れてますが。種ガンダムがなかなかよさげだったので気になるところ。

コメントはありません。

2004/7/29(木)

今日の逸般02:53:02

OS-tan

コメントはありません。

2004/7/30(金)

MC++よくわかりません。22:06:08

かな〜り久々にC++なんぞを弄くったわけですが、バグっぽい挙動を発見したのでメモ。MC++の「アセンブリの参照」で適当なプロジェクトを選択、その参照先プロジェクトの出力ファイル名を変更してもMC++プロジェクトからは旧ファイルを参照したままで再度設定しなおさなくてはいけません。C#は大丈夫だったはずが。。。

コメントはありません。

2004/7/31(土)

XP Visual Style とか おさばきアドベンチャー とか01:55:11

某所向けのバグ潰してたら日付変わってるし。まとめる気力もないので箇条書き。

XP Visual Style は Luna が嫌いなので使ってなかったのですが、VS 2005でサポートされたのでこれを気に導入してみました。いれたのはWatercolor Lite。おおむねいい感じです。

おさばきアドベンチャー近所のショップには売ってませんでした。ソフマップだと特典がつくみたいなので早いうちに見に行きますか。まぁ買うかどうかは微妙なところなのですけど。

コメントはありません。

おさばきアドベンチャー@ソフマップ価格23:06:33

6300程度でした。どうしよーかー。

コメントはありません。

goto Top

Copyright(C)方位記号