2013年03月28日

RichTextBox を下までスクロール

TextBox(またはRichTextBox)の最後の行までスクロールさせる に書いてある方法でスクロールさせても、スクロールバーをクリックして最下行までスクロールしたようにならず、少しずれる場合がある。自分の環境だけかもしれないが、ある程度 RichTextBox の高さがあるとずれてしまう。Rich ではない TextBox でこの問題があるかどうかは確認していない。

そこで、ScrollToCaret でスクロールさせたあとに Y の値を調整して解決する。

[System.Runtime.InteropServices.DllImport("USER32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wp, out Point lp);
private const int EM_GETSCROLLPOS = 0x04DD;
private const int EM_SETSCROLLPOS = 0x04DE;

this.richTextBox1.SelectionStart = this.richTextBox1.Text.Length;
this.richTextBox1.Focus();
this.richTextBox1.ScrollToCaret();
Point p;
SendMessage(this.richTextBox1.Handle, EM_GETSCROLLPOS, 0, out p);
p.Y += value;
SendMessage(this.richTextBox1.Handle, EM_SETSCROLLPOS, 0, out p);

p.Y に足す value の適切な値については、計算式がわからないので、目で確認している。これはかなり格好が悪いので、計算で出せるようにしたい。

11/14 追記 続き を書いた。

posted by Takenoko at 19:00| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2013年02月15日

AStarアルゴリズムをC#で 続き

AStarアルゴリズムをC#で の続き。

ISearchable[,] に、ISearchable を継承したクラス、仮に Grid として、その多次元配列 Grid[,] を代入できるものだと思っていたが、できないみたい。なので、コードを書き直した。Node.cs は前回と同じなので省略。あと、namespace は削った。

ISearchable.cs


EightDirectionsAStar.cs


interface の使い方が少し分かった気がする。

posted by Takenoko at 15:12| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2013年01月09日

AStarアルゴリズムをC#で

image/_photos_uncategorized_2013_01_09_astar001.png
A* Visualization を参考に、C# で A*アルゴリズムを書いてみた。参考というより、8方向にした以外、ほぼそのままな気もするけど。A*については検索すると色々でてくるが、リンク先のコードは、Flash は Hello World を書いた程度の経験しかない自分でも理解できるくらいわかりやすくて、本当に助かった。

ISearchable.cs
Node.cs

EightDirectionsAStar.cs


Node は他のプロジェクトから見える必要はないので internal にした。初めて使った気がする。

2013/01/13 少しだけコードを書き換えた。ISearchable のプロパティは、以前は通過可能時に true を返していたが、通過不能時に true を返すようにした。

2014/03/24 追記 続きのリンクを忘れていたので追加。

posted by Takenoko at 23:31| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2013年01月05日

ダンジョン自動生成・続き

前回の記事 の続き。

NetHack のダンジョンのサイズと同じ、80×20だとこんな感じ。
80x20_00

通路の曲がり方をもう少し複雑にしたい。他にも、改善の余地は多い。

このプログラムをダウンロードできるようにした。前回省略した部分も含め、ソースファイルも同梱してある。
「MG130105.zip」をダウンロード
使用するには、.NET Framework 3.5 が必要です。

Mgexe
操作に関して説明する必要は無さそうに思うけど、それは作ったのが自分だからかもしれない。

posted by Takenoko at 21:34| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2013年01月03日

ダンジョン自動生成

ローグライクゲーム用に書いたダンジョンを自動生成するコード。C#。ちょうど一年前に書いたと思う。プログラミングの教育を受けた事はないので、全体的に自信がない。コメントの書き方とか。変な部分があれば、教えていただけるとありがたいです。

Grid.cs

Room.cs

Division.cs

Map.cs

XorShift は省略。Random でも代用できるし。GUI部分も省略。

これでダンジョンを生成すると、こんな感じになる。Form の英語も自信がない。
image/_photos_uncategorized_2013_01_03_genedun1.png
マップのサイズが小さいければ、特に違和感はない。部屋を1x1にするとこうなる。
image/_photos_uncategorized_2013_01_03_genedun2.png
マップのサイズを150x150に。
image/_photos_uncategorized_2013_01_03_genedun3.png
極端に長い通路ができたり、かなり不自然になる。さらに300x300。
image/_photos_uncategorized_2013_01_03_genedun4.png
こんなローグライク、プレイしたくない。ついでに部屋を1x1に。
image/_photos_uncategorized_2013_01_03_genedun5.png
こんなダンジョンがあったら発狂しそう。

textarea タグでコードを貼り付けたけど、思った以上に見た目がよくない。なんとかしたいが、どうすればいいのかわからないので、わかったら直そうと思う。

続いた。

posted by Takenoko at 23:32| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2011年03月03日

ToolStripMenuItem を RadioButton のように扱う

タイトルのような事がやりたかったので、ユーザーコントロールを作ってみた。

    public partial class ToolStripExclusiveMenuItem : ToolStripMenuItem
    {

        public ToolStripExclusiveMenuItem()
        {
            InitializeComponent();
        }

        protected override void OnClick(EventArgs e)
        {
            this.SelectCheckedItem(this);
            base.OnClick(e);
        }

        private void SelectCheckedItem(ToolStripExclusiveMenuItem sender)
        {
            for (int i = 0; i < base.Owner.Items.Count; i++)
            {
                if (base.Owner.Items[i].GetType() == typeof(ToolStripExclusiveMenuItem))
                {
                    ((ToolStripExclusiveMenuItem)base.Owner.Items[i]).Checked = base.Owner.Items[i].Equals(sender);
                }
            }
        }
    }

これでRadioButton のようになる。
[C#]MenuStripドロップダウンアイテムのチェック切り替え|Assertion Failed! が参考になった。

追記

以前の記述だと、ToolStrip にこれ以外のコントロールがあるとエラーが出るので、修正した。

posted by Takenoko at 22:55| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2011年02月20日

ブックマークレット

前回 、はてブを表示するブックマークレットを作ったけど、新しいタブで開いたほうが便利だと思ったので、改良してみた。

新しいタブではてブを表示

元のタブに変なメッセージが表示されたりして悩んだが、function() を入れると上手くいった。あと、window.open の二つめの引数は必要なかったようだ。

posted by Takenoko at 22:11| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2011年02月12日

初javascript

C#ばかり使っていたけど、javascript も少しは使えたほうがいいなあと思ったので、試しにブックマークレットを作ってみた。

見ているページのはてなブックマークに移動する
はてブを使っていないけど、見るという人向け。

http://をhttps://に、https://をhttp://に変換して移動
これ役に立たない気がする。ロケーションバーで操作したほうが早いし。

なかなか楽しい。

参考にしたページ

http://www.tohoho-web.com/js/index.htm

http://www.teria.com/~koseki/memo/bookmarklets/tips.html

http://www42.atwiki.jp/tomokazu0525/pages/56.html

http://let.hatelabo.jp/

posted by Takenoko at 22:18| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2011年02月11日

NumericUpDown のカーソル

キャレットを非表示にした けど、それ以外にも、カーソルが TextBox 内で IBeam になるのが気になっていたので、なんとかしてみた。NumericUpDown のプロパティ Controls で TextBox を取得できるようなので、コンストラクタに

this.Controls[1].Cursor = Cursors.Arrow

を記述することでカーソルが変化しないようになった。

posted by Takenoko at 01:16| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

2011年02月03日

NumericUpDown のキャレットを消す

マップエディタを作っていて、マスの倍率を変更するためにNumericUpDown を使うことにした。キャレットがチカチカしてうっとうしいので、キャレットを消す方法を検索していろいろ試してみたが、なかなかうまくいかない。HideCaret を使う方法がいくつか出てくるけど、なぜか消えなかった。そこで、DestroyCaret を使うと消えてくれた。環境によるのだろうか。

public partial class NumericUpDownEx : NumericUpDown
{
    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool DestroyCaret();

    [DefaultValue(true)]
    [Category("動作")]
    public bool CaretVisible { get; set; }

    public NumericUpDownEx()
    {
        InitializeComponent();
    }

    protected override void OnGotFocus(EventArgs e)
    {       
        if (!this.CaretVisible)
        {
            DestroyCaret();
        }
        base.OnGotFocus(e);
    }
}

ここではNumericUpDown を継承しているけど、TextBox 等でもできると思う。

posted by Takenoko at 20:21| Comment(0) | TrackBack(0) | programming | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。