C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[18]: DrawStringで描画した文字色を反転させ


(過去ログ 33 を表示中)

[トピック内 34 記事 (1 - 20 表示)]  << 0 | 1 >>

■15569 / inTopicNo.1)  DrawStringで描画した文字色を反転させる方法
  
□投稿者/ のぶ (19回)-(2008/03/16(Sun) 02:42:38)

分類:[.NET 全般] 

いつもお世話になっています。

早速、質問させていただきます。

私は今C#2008でテキストエディタを作成しているのですが
DrawString で描画した文字を簡単に反転させる方法ってありますでしょうか?

範囲選択した際に、簡単に色を反転させたいです。

現在は、範囲選択した時に、文字も色を変えて描画しなおしています。

内部処理をもっとシンプルにしたいです。
(透過させる方法はいろいろなところで記事になっていますが、反転の方法が見つかりませんでした。)


ついでにもうひとつ、(^^;
テキストエディタを作ろうとした場合、DrawStringじゃ通用しないんですかねぇ・・??
1文字ずつ描画しているってのもあって、かなり遅いです。orz
ただ、APIのTextOutつかってみたら、もっと遅かった。orz(多分、内部的な処理に問題あり)
C#だから遅いのかと思いきや、C#で作成された AlpTextBox ってのをダウンロードして
使ってみたら、むちゃくちゃ早かったです。

どうやってやってるんだろう・・・???

よろしくお願いいたします。

引用返信 編集キー/
■15570 / inTopicNo.2)  Re[1]: DrawStringで描画した文字色を反転させる方法
□投稿者/ 通りすがっちゃった (2回)-(2008/03/16(Sun) 05:03:38)
単純にテキストエディタが作りたいなら、FormにTextBox(またはRichTextBox)置いてオシマイでは駄目なんでしょうか?
DrawStringを使ってるのは何でなんでしょうか?


引用返信 編集キー/
■15571 / inTopicNo.3)  Re[1]: DrawStringで描画した文字色を反転させる方法
□投稿者/ やじゅ (248回)-(2008/03/16(Sun) 07:40:32)
やじゅ さんの Web サイト
No15569 (のぶ さん) に返信
> DrawString で描画した文字を簡単に反転させる方法ってありますでしょうか?
> 範囲選択した際に、簡単に色を反転させたいです。
> 現在は、範囲選択した時に、文字も色を変えて描画しなおしています。
>

範囲選択の表示としては、今の方法でいいかな思います。

一応、「DrawReversibleFrame」って指定範囲をXOR描画する関数がありますが
意図したものと違うものになるかなと。
引用返信 編集キー/
■15591 / inTopicNo.4)  Re[2]: DrawStringで描画した文字色を反転させる方法
□投稿者/ のぶ (20回)-(2008/03/17(Mon) 01:05:31)
No15570 (通りすがっちゃった さん) に返信
> 単純にテキストエディタが作りたいなら、FormにTextBox(またはRichTextBox)置いてオシマイでは駄目なんでしょうか?
> DrawStringを使ってるのは何でなんでしょうか?

コメントありがとうございます。

まず、テキストボックスを使わない理由ですが、
1.色を変えれない。(検索条件にヒットした文字とかキーワードに色をつけたりとか)
2.行番号の表示が出来ない。(他のコントロールで行番号のエリアを設けたとしても、同期を取るのが難しい・・(できない?))
3.矩形選択ができない。
  などなど・・・

RichTextBoxについては、一応色の指定は出来ますが、色を変えたい場所を選択状態にしてからじゃないと出来なかったりします。
あと、行番号の表示もできないし、矩形選択もできないです。

RichTextBoxがもっと強力だったらなぁ・・・

引用返信 編集キー/
■15593 / inTopicNo.5)  Re[2]: DrawStringで描画した文字色を反転させる方法
□投稿者/ のぶ (21回)-(2008/03/17(Mon) 01:21:38)
No15571 (やじゅ さん) に返信
> ■No15569 (のぶ さん) に返信
>>DrawString で描画した文字を簡単に反転させる方法ってありますでしょうか?
>>範囲選択した際に、簡単に色を反転させたいです。
>>現在は、範囲選択した時に、文字も色を変えて描画しなおしています。
>>
> 範囲選択の表示としては、今の方法でいいかな思います。
>
> 一応、「DrawReversibleFrame」って指定範囲をXOR描画する関数がありますが
> 意図したものと違うものになるかなと。

コメントありがとうございます。

FillReversibleFreme だと枠だけになってしまったので
FillReversibleRectangle こんなのを使ってみました(^^;

「おぉ!これだっ!」って思ったんですけど、
OnPaint に記述すると、なぜか一回四角く塗りつぶされた後に消えてしまうんですね・・・orz
あと、Graphics.Clip も使えないから Region で塗りつぶすエリアのしてとかも出来なさそうですね・・・orz

やはり、やじゅさんのおっしゃるとおり、今のままで行きたいと思います。

ありがとうございました。

解決済み
引用返信 編集キー/
■15595 / inTopicNo.6)  Re[3]: DrawStringで描画した文字色を反転させる方法
□投稿者/ 倉田 有大 (152回)-(2008/03/17(Mon) 01:44:17)
No15593 (のぶ さん) に返信
> ■No15571 (やじゅ さん) に返信
>>■No15569 (のぶ さん) に返信
> >>DrawString で描画した文字を簡単に反転させる方法ってありますでしょうか?
> >>範囲選択した際に、簡単に色を反転させたいです。
> >>現在は、範囲選択した時に、文字も色を変えて描画しなおしています。
> >>
>>範囲選択の表示としては、今の方法でいいかな思います。
>>
>>一応、「DrawReversibleFrame」って指定範囲をXOR描画する関数がありますが
>>意図したものと違うものになるかなと。
>
> コメントありがとうございます。
>
> FillReversibleFreme だと枠だけになってしまったので
> FillReversibleRectangle こんなのを使ってみました(^^;
>
> 「おぉ!これだっ!」って思ったんですけど、
> OnPaint に記述すると、なぜか一回四角く塗りつぶされた後に消えてしまうんですね・・・orz
> あと、Graphics.Clip も使えないから Region で塗りつぶすエリアのしてとかも出来なさそうですね・・・orz
>
> やはり、やじゅさんのおっしゃるとおり、今のままで行きたいと思います。
>
> ありがとうございました。
>

完成がたのしみですね。
わたしはIMEと実際のテキストがうまくかさなってくれずそこでざせつしました。
解決済み
引用返信 編集キー/
■15665 / inTopicNo.7)  Re[4]: DrawStringで描画した文字色を反転させる方法
□投稿者/ のぶ (22回)-(2008/03/18(Tue) 01:27:48)
No15595 (倉田 有大 さん) に返信
> ■No15593 (のぶ さん) に返信
>>■No15571 (やじゅ さん) に返信
> >>■No15569 (のぶ さん) に返信
>>>>DrawString で描画した文字を簡単に反転させる方法ってありますでしょうか?
>>>>範囲選択した際に、簡単に色を反転させたいです。
>>>>現在は、範囲選択した時に、文字も色を変えて描画しなおしています。
>>>>
> >>範囲選択の表示としては、今の方法でいいかな思います。
> >>
> >>一応、「DrawReversibleFrame」って指定範囲をXOR描画する関数がありますが
> >>意図したものと違うものになるかなと。
>>
>>コメントありがとうございます。
>>
>>FillReversibleFreme だと枠だけになってしまったので
>>FillReversibleRectangle こんなのを使ってみました(^^;
>>
>>「おぉ!これだっ!」って思ったんですけど、
>>OnPaint に記述すると、なぜか一回四角く塗りつぶされた後に消えてしまうんですね・・・orz
>>あと、Graphics.Clip も使えないから Region で塗りつぶすエリアのしてとかも出来なさそうですね・・・orz
>>
>>やはり、やじゅさんのおっしゃるとおり、今のままで行きたいと思います。
>>
>>ありがとうございました。
> >
>
> 完成がたのしみですね。
> わたしはIMEと実際のテキストがうまくかさなってくれずそこでざせつしました。

--------------------------------------------------------------------------

[DllImport("imm32.dll")]
private static extern IntPtr ImmGetDefaultIMEWnd(IntPtr hWnd);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private class LOGFONT
{
public Int32 lfHeight;
public Int32 lfWidth;
public Int32 lfEscapement;
public Int32 lfOrientation;
public Int32 lfWeight;
public byte lfItalic;
public byte lfUnderline;
public byte lfStrikeOut;
public byte lfCharSet;
public byte lfOutPrecision;
public byte lfClipPrecision;
public byte lfQuality;
public byte lfPitchAndFamily;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string lfFaceName;
}

private const int WM_IME_CONTROL = 643;

private Control _Control; おーなーこんとろーる
private IntPtr _ImeHandle;  imeのはんどる


_ImeHandle = ImmGetDefaultIMEWnd(this._Control.Handle);

↑imeのハンドルを取得
確かオーナーコントロールのコンストラクタで取得すると正しく取得できなかったはず・・・
コンストラクタの外でやると、うまく取得できました。

↓カーソルが動いたときにこれを呼びます
private void SetImePos(int x, int y) {
LOGFONT logfnt = new LOGFONT();
_Control.Font.ToLogFont(logfnt);
logfnt.lfFaceName = this._Control.Font.Name;
SendMessage(_ImeHandle, WM_IME_CONTROL, IMC_SETCOMPOSITIONFONT, logfnt);

COMPOSITIONFORM lParam = new COMPOSITIONFORM();
lParam.dwStyle = CFS_POINT;
lParam.ptCurrentPos.X = x;
lParam.ptCurrentPos.Y = y;
lParam.rcArea = new RECT();

SendMessage(_ImeHandle, WM_IME_CONTROL, IMC_SETCOMPOSITIONWINDOW, lParam);
}
----------------------------------------------------------------------------------------
こんな感じでうまく動いてます。

今は取り合えず、処理速度には問題ありですが、
範囲選択(矩形選択も含む)、キーワードで色分け(Pascal,C,VB,PL/SQLに対応)
検索(通常検索、一括検索、インクリメンタルサーチ、置換、一括置換、範囲選択置換)
ブックマーク、検索文字の強調表示(色付け)、画面分割、選択範囲コメント化、
大文字/小文字/2バイト文字/1バイト文字 変換、補完(われながらいいでき(^^;;)
などを実装しました。
あと、エディタとしては最低限Undoが必要ですが、地味に難しい・・・orz

今後は、ツーリービューで関数一覧を出して、
関数内で呼び出している関数を子ノードとして表示したり、
クラスまたは構造体の変数名の後にピリオドを打ったときに、
候補一覧を出す様にしたいと考えています。

がんばります!

引用返信 編集キー/
■15776 / inTopicNo.8)  Re[5]: DrawStringで描画した文字色を反転させ
□投稿者/ PATIO (46回)-(2008/03/21(Fri) 15:40:56)
2008/03/21(Fri) 15:43:02 編集(投稿者)

No15665 (のぶ さん) に返信
>
> テキストエディタを作ろうとした場合、DrawStringじゃ通用しないんですかねぇ・・??
> 1文字ずつ描画しているってのもあって、かなり遅いです。orz
> ただ、APIのTextOutつかってみたら、もっと遅かった。orz(多分、内部的な処理に問題あり)
> C#だから遅いのかと思いきや、C#で作成された AlpTextBox ってのをダウンロードして
> 使ってみたら、むちゃくちゃ早かったです。
>
> どうやってやってるんだろう・・・???

思うにかなり細かい制御を自分やっているんじゃなかろうかと。
基本的に画面上に表示されている文字の量と言うのは知れているので
出来る限り描画する量が少なくなるようにするのが一番一般的な方法かと思います。
スクロールにしても既に書いてある内容を極力使って必要な部分だけの描画にすれば
スピードを稼ぐことは可能でしょう。
あとは、ダブルバッファリングとか常套手段ですよね。

パフォーマンスを稼ぐ為にはフレームワークに任せてしまっている部分を
自分でやるように変更して出来る限り無駄な処理をしないようにすると思います。
いわゆる、地道な処理とか、泥臭い処理とかと言う部分ですね。
現状の描画が何処までパフォーマンスを意識してチューニングされているのかが
わかりませんので何とも言いかねますけれど。(^^;

ちなみに解決が消えているけれど、
これは意図してやっているのかなぁ?
わからないのでこのままにしておきます。

引用返信 編集キー/
■15788 / inTopicNo.9)  Re[5]: DrawStringで描画した文字色を反転させ
□投稿者/ 倉田 有大 (160回)-(2008/03/21(Fri) 22:22:26)
2008/03/22(Sat) 00:25:19 編集(投稿者)

>>完成がたのしみですね。
>>わたしはIMEと実際のテキストがうまくかさなってくれずそこでざせつしました。
>
> --------------------------------------------------------------------------
>
> [DllImport("imm32.dll")]
> private static extern IntPtr ImmGetDefaultIMEWnd(IntPtr hWnd);
> [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
> private class LOGFONT
> {
> public Int32 lfHeight;
> public Int32 lfWidth;
> public Int32 lfEscapement;
> public Int32 lfOrientation;
> public Int32 lfWeight;
> public byte lfItalic;
> public byte lfUnderline;
> public byte lfStrikeOut;
> public byte lfCharSet;
> public byte lfOutPrecision;
> public byte lfClipPrecision;
> public byte lfQuality;
> public byte lfPitchAndFamily;
> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
> public string lfFaceName;
> }
>
> private const int WM_IME_CONTROL = 643;
>
> private Control _Control; おーなーこんとろーる
> private IntPtr _ImeHandle;  imeのはんどる
>
>
> _ImeHandle = ImmGetDefaultIMEWnd(this._Control.Handle);
>
> ↑imeのハンドルを取得
> 確かオーナーコントロールのコンストラクタで取得すると正しく取得できなかったはず・・・
> コンストラクタの外でやると、うまく取得できました。
>
> ↓カーソルが動いたときにこれを呼びます
> private void SetImePos(int x, int y) {
> LOGFONT logfnt = new LOGFONT();
> _Control.Font.ToLogFont(logfnt);
> logfnt.lfFaceName = this._Control.Font.Name;
> SendMessage(_ImeHandle, WM_IME_CONTROL, IMC_SETCOMPOSITIONFONT, logfnt);
>
> COMPOSITIONFORM lParam = new COMPOSITIONFORM();
> lParam.dwStyle = CFS_POINT;
> lParam.ptCurrentPos.X = x;
> lParam.ptCurrentPos.Y = y;
> lParam.rcArea = new RECT();
>
> SendMessage(_ImeHandle, WM_IME_CONTROL, IMC_SETCOMPOSITIONWINDOW, lParam);
> }
> ----------------------------------------------------------------------------------------
> こんな感じでうまく動いてます。

どうも、ソースありがとうございます。
IMEの最初の表示場所は、このソースと同じような方法で、指定することはできたのですが、
IMEで文字を入力すると、DrawStringで書き込んだソースとうまく重なってくれなかったんですよ^^;
もう一度挑戦したくなってきました。

> 今は取り合えず、処理速度には問題ありですが、
> 範囲選択(矩形選択も含む)、キーワードで色分け(Pascal,C,VB,PL/SQLに対応)
> 検索(通常検索、一括検索、インクリメンタルサーチ、置換、一括置換、範囲選択置換)
> ブックマーク、検索文字の強調表示(色付け)、画面分割、選択範囲コメント化、
> 大文字/小文字/2バイト文字/1バイト文字 変換、補完(われながらいいでき(^^;;)
> などを実装しました。
> あと、エディタとしては最低限Undoが必要ですが、地味に難しい・・・orz

Undo,Redoですね〜がんばってください。


で、久しぶりに挑戦しましたが。
ああ、DrawStringの勝手な余白をつける処理のせいで、やっぱりずれるなあ。
まず、文字の前に5ドットぐらいの余白と、文字と文字の間に余白がIME入力中の文字と比べると入ってしまいます。
引用返信 編集キー/
■15816 / inTopicNo.10)  Re[6]: DrawStringで描画した文字色を反転させ
□投稿者/ のぶ (23回)-(2008/03/23(Sun) 05:19:51)
No15776 (PATIO さん) に返信
> 2008/03/21(Fri) 15:43:02 編集(投稿者)
>
> 思うにかなり細かい制御を自分やっているんじゃなかろうかと。
> 基本的に画面上に表示されている文字の量と言うのは知れているので
> 出来る限り描画する量が少なくなるようにするのが一番一般的な方法かと思います。
> スクロールにしても既に書いてある内容を極力使って必要な部分だけの描画にすれば
> スピードを稼ぐことは可能でしょう。
> あとは、ダブルバッファリングとか常套手段ですよね。
>
> パフォーマンスを稼ぐ為にはフレームワークに任せてしまっている部分を
> 自分でやるように変更して出来る限り無駄な処理をしないようにすると思います。
> いわゆる、地道な処理とか、泥臭い処理とかと言う部分ですね。
> 現状の描画が何処までパフォーマンスを意識してチューニングされているのかが
> わかりませんので何とも言いかねますけれど。(^^;

今は以下のような事をやってます。
まず、行数文のBitmapを作成しています。
で、そのBitmapはListで管理していて、縦スクロール時には一番上のBitmap下にもっていって(またはその逆)
スクロール分だけDrawするようにしています。
1行縦スクロールは、そこそこ早いかもしれないですが、PageDownだと小細工が効かないので遅いです。

で、横スクロールは、差分をDrawImageで移動して差分のみの文字を描画するようにしています。
(ひとつのBitmapで画像を移動させる方法がわからなかったので、同じサイズのワーク用のBitmapに差分を加味して転送し、ListのBitmapと差し替えてます)
しかし、これがやたらめったら遅いです・・・orz
DrawImageが遅いのかなぁ・・・

あと、工夫としては、スペース文字を「・」で表示しているのですが、全部の文字を描画すると時間がかかるので
一番初めにカラム数分の「・」を描画したBitmapを1つ用意して、Clipプロパティーを使用し、スペース部分を一発で描画するようにしました。
これがそこそこ効果があって結構早くなりました。
ただ、文字列がずら〜〜〜〜〜っと並んだテキストだとやはり遅いです・・orz

あと、Brushとかは毎回 new すると遅くなると思ったので、一番初めに全ての色のブラシを生成し、それを使用しています。

描画もそうですが、エディタとなると Byte単位の場所とかも必要となるので
いろんなところで Encoding.GetEncoding("Shift_JIS").GetByteCount(value) こんな事もやってるので
この辺をもっと効率化できれば、もう少し稼げるかなぁとは思っているのですけど・・・

あと、Col位置が2バイト文字の真ん中にカーソルが来ないように shift jis に直して文字列の最初から順に文字コードを調べたりとか。

ちなみに、13000行ある delphi ソースコードをスクロールする時にかかった時間を計測すると以下のようになりました。
(PageDown押しっぱなし)

私Editor -> 22秒
AlpTextBox -> 7秒
桜エディタ -> 12秒
SharpDeverop -> 65秒 (勝った(笑))

あと、私はコメント行はバックカラーを緑にしたい人なので、バックカラーを設定する処理を入れているのですが
それを外して、かつスペースを何も表示しないようにすると(「・」を表示しない)18秒でした。

C#で作成されているのにもかかわらず、AlpTextBoxの早さには驚きです(桜エディタより全然早いし)

> ちなみに解決が消えているけれど、
> これは意図してやっているのかなぁ?
あっ、発言しなおすと、また解決にチェックつけないといけないんですね・・・
でも、もう少し外したままにしておこうかなぁ・・・


引用返信 編集キー/
■15817 / inTopicNo.11)  Re[6]: DrawStringで描画した文字色を反転させ
□投稿者/ のぶ (24回)-(2008/03/23(Sun) 05:33:19)
No15788 (倉田 有大 さん) に返信
> 2008/03/22(Sat) 00:25:19 編集(投稿者)
>
> どうも、ソースありがとうございます。
> IMEの最初の表示場所は、このソースと同じような方法で、指定することはできたのですが、
> IMEで文字を入力すると、DrawStringで書き込んだソースとうまく重なってくれなかったんですよ^^;
すみません、お恥ずかしいことを書き込んでしまいました。(^^;;
私、最初の表示位置があって状態で満足しているみたいです(^^;;

> もう一度挑戦したくなってきました。
是非、高速エディタを作成して、技を伝授してください(笑)

> Undo,Redoですね〜がんばってください。
Undo ・・・ 後回しにします(^^;

> で、久しぶりに挑戦しましたが。
> ああ、DrawStringの勝手な余白をつける処理のせいで、やっぱりずれるなあ。
> まず、文字の前に5ドットぐらいの余白と、文字と文字の間に余白がIME入力中の文字と比べると入ってしまいます。
なんか、いろんなところに書かれてますけど GDI+ 不具合があるんですね・・・orz
文字列の一番最後に − (だったかな??)があると表示されないとか??

高速スクロールさせるために、何か有益な情報があるかと思い「C#ゲームプログラミング」って本を購入しましたが
あまり、私にとっては有益ではありませんでした・・・orz
(regionの使い方(存在)を覚えただけでも意味はあったと言えばあったけど)

引用返信 編集キー/
■15818 / inTopicNo.12)  Re[7]: DrawStringで描画した文字色を反転させ
□投稿者/ のぶ (25回)-(2008/03/23(Sun) 05:37:37)
あぁ。誤字脱字が・・・
引用返信 編集キー/
■15819 / inTopicNo.13)  Re[7]: DrawStringで描画した文字色を反転させ
□投稿者/ 渋木宏明(ひどり) (680回)-(2008/03/23(Sun) 08:05:40)
渋木宏明(ひどり) さんの Web サイト
> 高速スクロールさせるために、何か有益な情報があるかと思い「C#ゲームプログラミング」って本を購入しましたが
> あまり、私にとっては有益ではありませんでした・・・orz

前に少しだけこの掲示板で話題になりましたけど、それも役に立ちませんでした?
引用返信 編集キー/
■15848 / inTopicNo.14)  Re[8]: DrawStringで描画した文字色を反転させ
□投稿者/ のぶ (26回)-(2008/03/24(Mon) 00:42:52)
コメントありがとうございます。
他の掲示板でも、よく拝見しております。

No15819 (渋木宏明(ひどり) さん) に返信
>>高速スクロールさせるために、何か有益な情報があるかと思い「C#ゲームプログラミング」って本を購入しましたが
>>あまり、私にとっては有益ではありませんでした・・・orz
>
> 前に少しだけこの掲示板で話題になりましたけど、それも役に立ちませんでした?

ここの掲示板の検索機能で検索してみたのですが、それらしきものがヒットしませんでした・・・
検索のキーワードを教えていただけないでしょうか?

あっ、そう言えば誤解されるとまずいので補足しておきます。↓↓↓
>>高速スクロールさせるために、何か有益な情報があるかと思い「C#ゲームプログラミング」って本を購入しましたが
>>あまり、私にとっては有益ではありませんでした・・・orz
と言ったのは、購入した本の内容が良くなかったと言う意味ではありませんので・・・
ゲームを作る上では有益な情報が沢山書かれていると思います。(念のため(^^;;)

引用返信 編集キー/
■15857 / inTopicNo.15)  Re[9]: DrawStringで描画した文字色を反転させ
□投稿者/ PATIO (47回)-(2008/03/24(Mon) 11:44:11)
2008/03/24(Mon) 11:45:39 編集(投稿者)


かなり色々検討されているようなので感じたことをちょっとだけ書きます。

現状の処理のボトルネックを見つける事がやはり肝心かと思います。
以前にチープなWindowsCEの環境で出来る限り描画を早くしたいと言う
試みをやった事がありますが、最終的にはプロファイルを取って
ボトルネックになっている処理を如何に速くするかと言う戦いになりました。
現状の処理で何が足を引っ張っているかを把握する事はとても大事だと
思います。

行毎のイメージをリスト化して保持し、転送していると言う話ですが、
場合によってはイメージ転送の関数が重くて呼び出し回数が多い分だけ
不利になると言うケースも考えられると思います。
一枚のビットマップ上で出来る限り処理してしまい、
転送を一度にしてしまったら遅くなるでしょうか?
その辺も検討した方が良いかもしれません。

引用返信 編集キー/
■15889 / inTopicNo.16)  Re[7]: DrawStringで描画した文字色を反転させ
□投稿者/ 倉田 有大 (164回)-(2008/03/25(Tue) 00:33:28)
>>で、久しぶりに挑戦しましたが。
>>ああ、DrawStringの勝手な余白をつける処理のせいで、やっぱりずれるなあ。
>>まず、文字の前に5ドットぐらいの余白と、文字と文字の間に余白がIME入力中の文字と比べると入ってしまいます。
> なんか、いろんなところに書かれてますけど GDI+ 不具合があるんですね・・・orz
> 文字列の一番最後に − (だったかな??)があると表示されないとか??

うーん、IMEの表示と同じく表示させようと思ったら、DrawStringで一文字一文字、書くしかないんでしょうかねえ。
まとめて書くと文字間に空白いれてくれやがりますし。
なんか、代わりに書いてくれるAPIとかないんかいな???
引用返信 編集キー/
■15892 / inTopicNo.17)  Re[10]: DrawStringで描画した文字色を反転させ
□投稿者/ のぶ (27回)-(2008/03/25(Tue) 03:22:11)
No15857 (PATIO さん) に返信
> 2008/03/24(Mon) 11:45:39 編集(投稿者)

> 現状の処理のボトルネックを見つける事がやはり肝心かと思います。
> 以前にチープなWindowsCEの環境で出来る限り描画を早くしたいと言う
> 試みをやった事がありますが、最終的にはプロファイルを取って
> ボトルネックになっている処理を如何に速くするかと言う戦いになりました。
> 現状の処理で何が足を引っ張っているかを把握する事はとても大事だと
> 思います。

描画している部分を全てコメントにして、描画以外の処理でどれくらいかかっているか計測してみると

通常   → 20秒
描画なし → 13秒
(描画なしでも、桜エディタ、AlpTextBox に負けてる・・・orz)

描画以外でも結構時間かかってました・・・
う〜ん、こまった。。。
もうちょっと詳しく検証してみたいと思います。

ちなみに、今計測しているのは自宅のパソコンなんですけど、自宅のパソコンではそれほどストレスは感じないんです。
ただ会社にあるパソコンだとスペックが悪くて、かなりストレスを感じます。

> 行毎のイメージをリスト化して保持し、転送していると言う話ですが、
> 場合によってはイメージ転送の関数が重くて呼び出し回数が多い分だけ
> 不利になると言うケースも考えられると思います。
> 一枚のビットマップ上で出来る限り処理してしまい、
> 転送を一度にしてしまったら遅くなるでしょうか?

一度試してみたことがあります。
Bitmapをひとつにしてしまうと、PageDown の時は多少早くなりましたが、
1行スクロールさせた時に、今と比べて格段に遅くなってしまいました。
あ、でもその時、1行スクロールの時も画像を転送しないで全描画してましたね。。。(^^;;
(転送することを試す前に行単位のBitmapにする事を思いついてしまったことを思い出しました)
今度、もう1度試してみます。

あと、Bitmap を使用せずに OnPaint の時に直接描画する方法も試してみましたが
Bitmapをひとつにした時と同様に、スクロールがかなり遅くなってしまいました。
(多分、うまくやれば早くなるとは思うんですが・・・)

アドバイスありがとうございました。
もうちょっと根気強くいろいろやって見ようと思います。

引用返信 編集キー/
■15893 / inTopicNo.18)  Re[8]: DrawStringで描画した文字色を反転させ
□投稿者/ のぶ (28回)-(2008/03/25(Tue) 03:48:39)
No15889 (倉田 有大 さん) に返信
> うーん、IMEの表示と同じく表示させようと思ったら、DrawStringで一文字一文字、書くしかないんでしょうかねえ。
> まとめて書くと文字間に空白いれてくれやがりますし。
> なんか、代わりに書いてくれるAPIとかないんかいな???

TextRenderer.DrawText ってやると、GDI+ ではなく GDI を使って描画できるみたいです。
私も使ってみましたが、確かに行単位で描画しても文字のずれは起きませんでしたが、
DrawString より遅かったのでやめました。(うまく使えてないだけかもしれませんが・・・)

あと、APIだと

BOOL ExtTextOut(
HDC hdc, // デバイスコンテキストのハンドル
int X, // 開始位置(基準点)の x 座標
int Y, // 開始位置(基準点)の y 座標
UINT fuOptions, // 長方形領域の使い方のオプション
CONST RECT *lprc, // 長方形領域の入った構造体へのポインタ
LPCTSTR lpString, // 文字列
UINT cbCount, // 文字数
CONST INT *lpDx // 文字間隔の入った配列
);

こんなのがあるみたいでして、文字単位で描画位置も細かく指定できるような感じです。
使ってみようかなとも思っているのですが、以前に APIのTextOut を使った時に逆に遅くなったので
なかなか勇気が出ないでいます。
しかも、framework の Font とか使えないので、プロパティーウインドウに出すにはどうすればいいんだろう・・
とか分からないことだらけでして・・・
さらにC#コードでのサンプルもあまり見つからなかったです。(T_T)
(長年VBプログラマだったので C++ のソース見てもさっぱり分かりません(^^;)

いろいろと試して、ようようスピードがでないようだったらチャレンジしてみようとは思ってます。

引用返信 編集キー/
■15894 / inTopicNo.19)  Re[9]: DrawStringで描画した文字色を反転させ
□投稿者/ y4yama (63回)-(2008/03/25(Tue) 08:28:51)
2008/03/25(Tue) 14:24:53 編集(投稿者)

No15893 (のぶ さん) に返信
のぶ さん、こんちは
>ちなみに、13000行ある delphi ソースコードをスクロールする時にかかった時間を計測すると以下のようになりました。
>(PageDown押しっぱなし)
ですが、約600画面が切り替わるとして、13/600=0.021秒 ですね。PageDown押しっぱなしということですが、キーリピート間隔は
PCの設定で変更できますよね (浅はかなカングリかも、知れません)
それも計測したほうが、いいかもです。(別案: キーアップでない間は、とにかく次の画面処理をする?とか)
[追記]
ディスプレイのリフレッシュレートより多く書き換えるのは、意味ない?ですよね。
60Hzとかだったら、1/60=0.017秒ですか。速い・・と言われているSoftは、それ以上?なのか?疑問です・・

PageDown押しっぱなし(を何とか検出して)では、数ページ目からは、1画面を全部は表示しないで、半分描画して
すぐ次の画面に移る(数画面に1度は全部表示もする)・・・とかは有効かも知れません
(イベント駆動というより、描画ルーチンは別スレッドにしたほうが、やりやすいかも? 自作の2D-CADでは成功してます)
シロート感覚ですので、気楽に聞き流してくださいませ・・・
引用返信 編集キー/
■16095 / inTopicNo.20)  Re[10]: DrawStringで描画した文字色を反転させ
 
□投稿者/ のぶ (29回)-(2008/03/27(Thu) 23:04:40)
No15894 (y4yama さん) に返信
> 2008/03/25(Tue) 14:24:53 編集(投稿者)
>
> ■No15893 (のぶ さん) に返信
> のぶ さん、こんちは
> >ちなみに、13000行ある delphi ソースコードをスクロールする時にかかった時間を計測すると以下のようになりました。
> >(PageDown押しっぱなし)
> ですが、約600画面が切り替わるとして、13/600=0.021秒 ですね。PageDown押しっぱなしということですが、キーリピート間隔は
> PCの設定で変更できますよね (浅はかなカングリかも、知れません)
> それも計測したほうが、いいかもです。(別案: キーアップでない間は、とにかく次の画面処理をする?とか)
考えが深いですね(^^;
全然、そこまで考えていませんでした。
すみません、具体的にどうしたらよいのか、いまいち分かってません(^^;;
実は、もっと言えば各エディタのフォントも色の付け具合(キーワードの数)とかも、
デフォルト設定のままでやったので、全然違うかもです。。。

> [追記]
> ディスプレイのリフレッシュレートより多く書き換えるのは、意味ない?ですよね。
> 60Hzとかだったら、1/60=0.017秒ですか。速い・・と言われているSoftは、それ以上?なのか?疑問です・・
すみません、恥ずかしながらリフレッシュレートの意味が分かりません(^^;
ちょっとネットで検索してみます。
Hzとか今まで全然意識したことがありませんでした。
やはり、高速に描画したりするには、そこらへんの知識も必要なんですね。
逐次勉強していきたいと思います。m(__)m

> PageDown押しっぱなし(を何とか検出して)では、数ページ目からは、1画面を全部は表示しないで、半分描画して
> すぐ次の画面に移る(数画面に1度は全部表示もする)・・・とかは有効かも知れません
これは、面白い発想ですね。
全然、考えもしませんでした。
これ、マジでやってみます。
タイマーとか使ってやれば出来そうですね。
(知識は浅はかだけど知らないけど、小細工はそこそこ得意な私です(^^;)

> (イベント駆動というより、描画ルーチンは別スレッドにしたほうが、やりやすいかも? 自作の2D-CADでは成功してます)
> シロート感覚ですので、気楽に聞き流してくださいませ・・・
これは、スレッドを分けたほうがCPUのパワーを効率よくいかせるといった意味でしょうか?


本日、会社のポンコツPC(グラフィックが最悪)で、インチキ計測テストをしたところ
自作エディタは 20秒から56秒になったのに対し、
私お気に入りの桜エディタでは秒数が変わりませんでした。
ウエイトでも入れてるのかなぁ・・・
ポテンシャルかなり高そう。

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -