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

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

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

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


(過去ログ 33 を表示中)

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

■16101 / inTopicNo.21)  Re[11]: DrawStringで描画した文字色を反転させ
  
□投稿者/ ま (5回)-(2008/03/28(Fri) 00:27:32)
No16095 (のぶ さん) に返信

画面の表示領域分+2行分のオフスクリーンを用意します。
オフスクリーンに着色済みのテキストを表示行数分+上下1行分書き込みます。

スクロールが1行単位の場合、画面に対して、上下どちらか1行オフセットした領域を転送します。
転送後、オフスクリーンを上下1行分ずらします。最下行 or 最上行に新しい行を1行書き込みます。



画面表示4行のオフスクリーンのイメージは
■■■■■■■■■■■■■■■■■■■■■■
□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□
■■■■■■■■■■■■■■■■■■■■■■
こうなります。
■部分上下1行が準備領域(スクロールすると出てくる1行)
□部分4行が表示領域

IMEの編集のときは、画面を直接操作することに
なるのかなぁ。やったことないので分かりません。

BitBltとか使えないのでしょうか?

結構面倒ですが、まじめにやると面白いかもしれ
ません。部分書き換えです。スクロール後の新し
い位置に同じ文字がある場合はそこを書き換えな
いというロジックを入れることになります。
BitMapを操作せず、ロジックだけで検証できるた
め同じ文字がならぶような場合に効果が出てくる
可能性があります。

高速になってきたら半分だけ描画して・・・・て
のはやめたほうがいいかと考えます。止めたとき
に下半分がパタつく可能性が出てきますから。

どうせパタパタするなら全画面パタパタした方が
いかにもスクロールしている、って感じがします。

引用返信 編集キー/
■16176 / inTopicNo.22)  Re[12]: DrawStringで描画した文字色を反転させ
□投稿者/ のぶ (30回)-(2008/03/30(Sun) 05:22:49)
No16101 (ま さん) に返信
> 画面の表示領域分+2行分のオフスクリーンを用意します。
> オフスクリーンに着色済みのテキストを表示行数分+上下1行分書き込みます。
>
> スクロールが1行単位の場合、画面に対して、上下どちらか1行オフセットした領域を転送します。
> 転送後、オフスクリーンを上下1行分ずらします。最下行 or 最上行に新しい行を1行書き込みます。
>
> 画面表示4行のオフスクリーンのイメージは
> ■■■■■■■■■■■■■■■■■■■■■■
> □□□□□□□□□□□□□□□□□□□□□□
> □□□□□□□□□□□□□□□□□□□□□□
> □□□□□□□□□□□□□□□□□□□□□□
> □□□□□□□□□□□□□□□□□□□□□□
> ■■■■■■■■■■■■■■■■■■■■■■
> こうなります。
> ■部分上下1行が準備領域(スクロールすると出てくる1行)
> □部分4行が表示領域
なるほど。
オフスクリーン分は、やっぱり別スレッドの方がいいんですかねぇ・・・
やってみます!

> IMEの編集のときは、画面を直接操作することに
> なるのかなぁ。やったことないので分かりません。
私の場合は、ime入力した時も KeyPress が返ってくるので、
KeyPressから処理してます。
ただ、連続した文字が送られてくると、通常の処理だと毎回描画が走ってしまうので
TimerイベントのIntervalを1にして、タイマーイベントが起動する前に文字が送られてきた時は
ストックして、まとめて処理するようにしてます。

> BitBltとか使えないのでしょうか?
ネットを検索しているとよく見ますが使ったことは無いです・・・
やはり、DrawImageより高速なんでしょうか?
だとしたら、DrawImage の内部処理で初めから BitBlt 呼んでくれればいいのに・・・
なんて、素人はそう思ってしまいます(^^;
次は BitBlt に挑戦してみます。

> 結構面倒ですが、まじめにやると面白いかもしれ
> ません。部分書き換えです。スクロール後の新し
> い位置に同じ文字がある場合はそこを書き換えな
> いというロジックを入れることになります。
> BitMapを操作せず、ロジックだけで検証できるた
> め同じ文字がならぶような場合に効果が出てくる
> 可能性があります。
そうなると、やっぱりBitmapは1つにすべきですね・・・きっと。。
今は行単位にBitmapもった方が早くスクロールできるかと思い、行数分のBitmapを持ってしまいました。orz


今日、1文字ずつ DrawString していたものを 色の区分ごとにまとめて ExtTextOut を使用するよう修正してみました。
すると、20秒から15秒に短縮できました!

まだまだ早くしたいなぁ・・・

引用返信 編集キー/
■16177 / inTopicNo.23)  Re[13]: DrawStringで描画した文字色を反転させ
□投稿者/ 倉田 有大 (167回)-(2008/03/30(Sun) 13:26:37)
> 今日、1文字ずつ DrawString していたものを 色の区分ごとにまとめて ExtTextOut を使用するよう修正してみました。
> すると、20秒から15秒に短縮できました!
>
> まだまだ早くしたいなぁ・・・

ExtTextOutだと、文字の間の空白とかも指定できるのですね。IMEの表示とぴったりかさねられそうですね。
Bitmapに直接書き込めるのかな?サンプルあるかググッてみるか。
引用返信 編集キー/
■16229 / inTopicNo.24)  Re[14]: DrawStringで描画した文字色を反転させ
□投稿者/ のぶ (31回)-(2008/04/01(Tue) 01:37:07)
No16177 (倉田 有大 さん) に返信
>>今日、1文字ずつ DrawString していたものを 色の区分ごとにまとめて ExtTextOut を使用するよう修正してみました。
>>すると、20秒から15秒に短縮できました!
>>
>>まだまだ早くしたいなぁ・・・
>
> ExtTextOutだと、文字の間の空白とかも指定できるのですね。IMEの表示とぴったりかさねられそうですね。
はい。文字単位で指定できるので、自由に間隔を調整できるみたいです。
ばっちりうまくいきました。
ただ、IMEのフォントはMSゴシックを指定していますが、何故か等幅じゃないですね。orz
通常の2バイト文字とかはほぼ合ってるんですけど、「・・・」などと打つと、幅が狭いみたいです。

> Bitmapに直接書き込めるのかな?サンプルあるかググッてみるか。
そんな事出来たりするんですかね?
私はキープレスで取る仕組みを作ったので、そのまま行きたいと思います。


そう言えば、alt を押しながら方向キーを押すと、矩形選択が開始されるように
作っているのですが、 ctrl + alt + 方向キー で単語単位で矩形選択しようと思ったら、
いきなり画面がひっくり返ってビックリしました(笑)
Vistaって、そんな機能ついてたんですね。
ディスプレイ縦置きしたいなぁ・・・

引用返信 編集キー/
■16230 / inTopicNo.25)  Re[15]: DrawStringで描画した文字色を反転さ
□投稿者/ 倉田 有大 (169回)-(2008/04/01(Tue) 03:15:47)
2008/04/01(Tue) 03:42:30 編集(投稿者)
2008/04/01(Tue) 03:42:24 編集(投稿者)

<pre><pre>私も
ExtTextOutで、遊んでみました。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{


public partial class Form1 : Form

{
[DllImport("gdi32.dll", EntryPoint = "SelectObject")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
[DllImport("gdi32.dll")]
static extern bool ExtTextOut(IntPtr hdc, int X, int Y, uint fuOptions,
[In] ref RECT lprc, string lpString, uint cbCount, [In] int [] lpDx);

[Serializable, StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;

public RECT(int left_, int top_, int right_, int bottom_)
{
Left = left_;
Top = top_;
Right = right_;
Bottom = bottom_;
}

public int Height { get { return Bottom - Top; } }
public int Width { get { return Right - Left; } }
public Size Size { get { return new Size(Width, Height); } }

public Point Location { get { return new Point(Left, Top); } }

// Handy method for converting to a System.Drawing.Rectangle
public Rectangle ToRectangle()
{ return Rectangle.FromLTRB(Left, Top, Right, Bottom); }

public static RECT FromRectangle(Rectangle rectangle)
{
return new RECT(rectangle.Left, rectangle.Top, rectangle.Right, rectangle.Bottom);
}

public override int GetHashCode()
{
return Left ^ ((Top << 13) | (Top >> 0x13))
^ ((Width << 0x1a) | (Width >> 6))
^ ((Height << 7) | (Height >> 0x19));
}

#region Operator overloads

public static implicit operator Rectangle(RECT rect)
{
return rect.ToRectangle();
}

public static implicit operator RECT(Rectangle rect)
{
return FromRectangle(rect);
}

#endregion
}

[Flags]
public enum ETOOptions : uint
{
ETO_CLIPPED = 0x4,
ETO_GLYPH_INDEX = 0x10,
ETO_IGNORELANGUAGE = 0x1000,
ETO_NUMERICSLATIN = 0x800,
ETO_NUMERICSLOCAL = 0x400,
ETO_OPAQUE = 0x2,
ETO_PDY = 0x2000,
ETO_RTLREADING = 0x800,
}

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}

private void Form1_Paint(object sender, PaintEventArgs e)
{
this.Font = new Font("MS ゴシック", 20);
RECT r = new RECT();
r.Left = 0;
r.Top = 0;
r.Bottom = 10;
r.Right = 10;
IntPtr hdc = e.Graphics.GetHdc();
SelectObject(hdc, this.Font.ToHfont());
ExtTextOut(hdc, 0, 0, (uint)ETOOptions.ETO_OPAQUE, ref r, "abc", 3, null);
e.Graphics.ReleaseHdc(hdc);
}
}
}

げげ、一度つかうと、APIの嵐になりますね。
ところで、this.Font = new Font("MS ゴシック", 20);
この瞬間に、フォームのサイズが変わりますね。なんでだろ?</pre></pre>
引用返信 編集キー/
■16231 / inTopicNo.26)  Re[16]: DrawStringで描画した文字色を反転さ
□投稿者/ 倉田 有大 (170回)-(2008/04/01(Tue) 03:53:24)
おおう、AutoScaleModeなんてプロパティーあったのか!
しかもデフォルトフォントか、びっくりたまげた。
引用返信 編集キー/
■16232 / inTopicNo.27)  Re[15]: DrawStringで描画した文字色を反転させ
□投稿者/ れい (452回)-(2008/04/01(Tue) 09:28:13)
No16229 (のぶ さん) に返信
> そう言えば、alt を押しながら方向キーを押すと、矩形選択が開始されるように
> 作っているのですが、 ctrl + alt + 方向キー で単語単位で矩形選択しようと思ったら、
> いきなり画面がひっくり返ってビックリしました(笑)
> Vistaって、そんな機能ついてたんですね。

Vistaの機能ではなく、ディスプレイドライバの機能だと思います
引用返信 編集キー/
■16233 / inTopicNo.28)  Re[15]: DrawStringで描画した文字色を反転させ
□投稿者/ 魔界の仮面弁士 (683回)-(2008/04/01(Tue) 09:31:47)
No16229 (のぶ さん) に返信
> 作っているのですが、 ctrl + alt + 方向キー で単語単位で矩形選択しようと思ったら、
> いきなり画面がひっくり返ってビックリしました(笑)

ディスプレイ ドライバの機能じゃ無かったかな?
Intel 82865G とか、NVIDIA GeForce 6 Series あたりのドライバ。

手持ちの DELL 系の PC と HP Compaq 系の PC だと、XP / Vista を問わず、
方向切り替えできていますし。

# 秀丸の古いバージョンだと、常駐秀丸の起動が Ctrl + Alt + ↓ だったりするので
# 微妙に焦る。(最近だと Ctrl + Alt + H が既定のショートカットだけど)
引用返信 編集キー/
■16260 / inTopicNo.29)  Re[16]: DrawStringで描画した文字色を反転させ
□投稿者/ 倉田 有大 (171回)-(2008/04/01(Tue) 22:54:54)
No16233 (魔界の仮面弁士 さん) に返信
> ■No16229 (のぶ さん) に返信
>>作っているのですが、 ctrl + alt + 方向キー で単語単位で矩形選択しようと思ったら、
>>いきなり画面がひっくり返ってビックリしました(笑)
>
> ディスプレイ ドライバの機能じゃ無かったかな?
> Intel 82865G とか、NVIDIA GeForce 6 Series あたりのドライバ。

インテルも出来るんですね。縦シューティングに便利そうw
私もキーボード操作にショートカットを割り当てようとしたら、画面の向きがいきなり、
変わってびっくりしたことがあります。
ATIもできるのかな?
引用返信 編集キー/
■16379 / inTopicNo.30)  Re[16]: DrawStringで描画した文字色を反転さ
□投稿者/ のぶ (32回)-(2008/04/04(Fri) 00:32:00)
No16230 (倉田 有大 さん) に返信
> 2008/04/01(Tue) 03:42:30 編集(投稿者)
> 2008/04/01(Tue) 03:42:24 編集(投稿者)
>
> <pre><pre>私も
> ExtTextOutで、遊んでみました。
>
> using System;
> using System.Collections.Generic;
> using System.ComponentModel;
> using System.Data;
> using System.Drawing;
> using System.Linq;
> using System.Text;
> using System.Windows.Forms;
> using System.Runtime.InteropServices;
>
> namespace WindowsFormsApplication1
> {
>
>
> public partial class Form1 : Form
>
> {
> [DllImport("gdi32.dll", EntryPoint = "SelectObject")]
> public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
> [DllImport("gdi32.dll")]
> static extern bool ExtTextOut(IntPtr hdc, int X, int Y, uint fuOptions,
> [In] ref RECT lprc, string lpString, uint cbCount, [In] int [] lpDx);
>
> [Serializable, StructLayout(LayoutKind.Sequential)]
> public struct RECT
> {
> public int Left;
> public int Top;
> public int Right;
> public int Bottom;
>
> public RECT(int left_, int top_, int right_, int bottom_)
> {
> Left = left_;
> Top = top_;
> Right = right_;
> Bottom = bottom_;
> }
>
> public int Height { get { return Bottom - Top; } }
> public int Width { get { return Right - Left; } }
> public Size Size { get { return new Size(Width, Height); } }
>
> public Point Location { get { return new Point(Left, Top); } }
>
> // Handy method for converting to a System.Drawing.Rectangle
> public Rectangle ToRectangle()
> { return Rectangle.FromLTRB(Left, Top, Right, Bottom); }
>
> public static RECT FromRectangle(Rectangle rectangle)
> {
> return new RECT(rectangle.Left, rectangle.Top, rectangle.Right, rectangle.Bottom);
> }
>
> public override int GetHashCode()
> {
> return Left ^ ((Top << 13) | (Top >> 0x13))
> ^ ((Width << 0x1a) | (Width >> 6))
> ^ ((Height << 7) | (Height >> 0x19));
> }
>
> #region Operator overloads
>
> public static implicit operator Rectangle(RECT rect)
> {
> return rect.ToRectangle();
> }
>
> public static implicit operator RECT(Rectangle rect)
> {
> return FromRectangle(rect);
> }
>
> #endregion
> }
>
> [Flags]
> public enum ETOOptions : uint
> {
> ETO_CLIPPED = 0x4,
> ETO_GLYPH_INDEX = 0x10,
> ETO_IGNORELANGUAGE = 0x1000,
> ETO_NUMERICSLATIN = 0x800,
> ETO_NUMERICSLOCAL = 0x400,
> ETO_OPAQUE = 0x2,
> ETO_PDY = 0x2000,
> ETO_RTLREADING = 0x800,
> }
>
> public Form1()
> {
> InitializeComponent();
> }
>
> private void Form1_Load(object sender, EventArgs e)
> {
>
> }
>
> private void Form1_Paint(object sender, PaintEventArgs e)
> {
> this.Font = new Font("MS ゴシック", 20);
> RECT r = new RECT();
> r.Left = 0;
> r.Top = 0;
> r.Bottom = 10;
> r.Right = 10;
> IntPtr hdc = e.Graphics.GetHdc();
> SelectObject(hdc, this.Font.ToHfont());
> ExtTextOut(hdc, 0, 0, (uint)ETOOptions.ETO_OPAQUE, ref r, "abc", 3, null);
> e.Graphics.ReleaseHdc(hdc);
> }
> }
> }
>
> げげ、一度つかうと、APIの嵐になりますね。
ですね。。
あれ?ふとソース見てみるとC#で ^ ← これ使うんですね(^^;
C++/CLI だと見たことあったんですが・・・(C++/CLI でプログラムを作った経験は無いです)
<< ←こんなのとかも私は使ったこと無いです(^^;
GetHashCode これもピリオド打つと一覧に出てきますけど、意味が分かりません。。
知識なさすぎorz

> ところで、this.Font = new Font("MS ゴシック", 20);
> この瞬間に、フォームのサイズが変わりますね。なんでだろ?</pre></pre>

え???かわります??
私のは大丈夫そうですけど・・・なんでだろう??

引用返信 編集キー/
■16380 / inTopicNo.31)  Re[16]: DrawStringで描画した文字色を反転させ
□投稿者/ のぶ (33回)-(2008/04/04(Fri) 00:36:23)
No16233 (魔界の仮面弁士 さん) に返信
> ■No16229 (のぶ さん) に返信
>>作っているのですが、 ctrl + alt + 方向キー で単語単位で矩形選択しようと思ったら、
>>いきなり画面がひっくり返ってビックリしました(笑)
>
> ディスプレイ ドライバの機能じゃ無かったかな?
> Intel 82865G とか、NVIDIA GeForce 6 Series あたりのドライバ。
>
> 手持ちの DELL 系の PC と HP Compaq 系の PC だと、XP / Vista を問わず、
> 方向切り替えできていますし。
>
> # 秀丸の古いバージョンだと、常駐秀丸の起動が Ctrl + Alt + ↓ だったりするので
> # 微妙に焦る。(最近だと Ctrl + Alt + H が既定のショートカットだけど)

そうでしたか。
会社のXPパソコンではそんなこと起こった事が無かったので、てっきりVistaの新機能かと思ってしまいました。

それにしても、縦表示に出来るのはうれしいけど、勝手にショートカットに割り当てないでほしいなぁ。。。
矩形選択で単語移動が出来ない。orz

引用返信 編集キー/
■16381 / inTopicNo.32)  Re[16]: DrawStringで描画した文字色を反転させ
□投稿者/ のぶ (34回)-(2008/04/04(Fri) 00:37:12)
No16232 (れい さん) に返信
> ■No16229 (のぶ さん) に返信
>>そう言えば、alt を押しながら方向キーを押すと、矩形選択が開始されるように
>>作っているのですが、 ctrl + alt + 方向キー で単語単位で矩形選択しようと思ったら、
>>いきなり画面がひっくり返ってビックリしました(笑)
>>Vistaって、そんな機能ついてたんですね。
>
> Vistaの機能ではなく、ディスプレイドライバの機能だと思います

そうみたいですね。
全然知りませんでした。

引用返信 編集キー/
■16419 / inTopicNo.33)  Re[17]: DrawStringで描画した文字色を反転させ
□投稿者/ 倉田 有大 (176回)-(2008/04/05(Sat) 01:24:14)
No16381 (のぶ さん) に返信
> ■No16232 (れい さん) に返信
>>■No16229 (のぶ さん) に返信
> >>そう言えば、alt を押しながら方向キーを押すと、矩形選択が開始されるように
> >>作っているのですが、 ctrl + alt + 方向キー で単語単位で矩形選択しようと思ったら、
> >>いきなり画面がひっくり返ってビックリしました(笑)
> >>Vistaって、そんな機能ついてたんですね。
>>
>>Vistaの機能ではなく、ディスプレイドライバの機能だと思います
>
> そうみたいですね。
> 全然知りませんでした。

ところで、C++/CLR最近いじってみたのですが、テキストエディターコントロールをつくるならこっちのほうがいいかもしれませんね。
APIつかいまくるのならこっちのほうが親和性たかそうです。
とか誘惑してみたり^^
引用返信 編集キー/
■16481 / inTopicNo.34)  Re[18]: DrawStringで描画した文字色を反転させ
□投稿者/ のぶ (35回)-(2008/04/06(Sun) 23:05:42)
No16419 (倉田 有大 さん) に返信

> ところで、C++/CLR最近いじってみたのですが、テキストエディターコントロールをつくるならこっちのほうがいいかもしれませんね。
> APIつかいまくるのならこっちのほうが親和性たかそうです。
> とか誘惑してみたり^^

私も触るだけ触ってみましたが、エディットコンティニューが出来ないのがつらいです(>_<)
(辛いというか・・・やっぱ出来た方が効率いいかなぁ、なんて)
あと、VC++ってステップ実行しても、カーソル行が色つかないんですね。
ちょっとわかりずらいかも(>_<)

引用返信 編集キー/

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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -