縦書きと罫線

[戻る]
Dease 2005/01/10(月) 18:33:17
初めて投稿します。
いろいろ検索しまくったのですが、自分の検索力が未熟な為に
参考になるようなサイトがなかったので質問させていただきます。

今、舞台台本みたいな文書を作るエディタを作ろうと思っています。
具体的に言うと、真ん中より上に罫線が横向きに引かれていて、
上段に役名を書いて、下段にセリフを書く、みたいな感じなのですが、
下段でセリフを書いているときに改行しても次の行の下段の最上部にカーソルがくるように
したいのですが、どうすればいいのか全くわかりません。
どなたかご教授いただけるとうれしいです。
開発環境は、
WindowsXP HomeEdition、VC++.NET、SDKです。

たいちう 2005/01/11(火) 09:41:08
とりあえず下段だけのアプリケーションを作ってみるんですね。
Microsoft Word でも縦書きの機能があるので、
その動作を参考にして、同じようなものを作る。

一行の短い文字列を縦書きで表示することはできますか?
これができれば、後はほとんど手間だけの問題だと思います。
後、スクロールの計算をして、表示範囲を決めるとか。

行き詰ったら、また(次はもっと)具体的に質問してください。

# プログラムの練習の為に作るのでなく、必要だから作るということならば、
# フリーウェアを探したり、Word 等で文書を作成したほうが近道だと思います。

2005/01/11(火) 12:53:50
Windows では漢字かな混じりの日本語フォントで縦書きする場合は CreateFont() や
CreateFontIndirect() やでフォントの指定を行う場合にベースラインを縦書きの向きに
指定するだけでなく、フォント名の先頭に '@' が必要です

細かい事は MSDN ライブラリーの LOGFONT, GreateFont, CreateFontIndirect などで
先ずお調べください

Dease 2005/01/11(火) 18:29:26
書き込みありがとうございます!

>一行の短い文字列を縦書きで表示することはできますか?
すみません。全然できません。エディットコントロールを使うんでしょうか?
その段階からわかりません。

>プログラムの練習の為に作るのでなく、必要だから作るということならば…
プログラムの練習の為に作ろうと思っています。

あと、島さんのおっしゃっていることはよくわかりました!ありがとうございました。

たいちう 2005/01/11(火) 18:53:25
MFCですが参考にしてください。

void CHogeView::OnDraw(CDC* pDC)
{
    CRect   r;
    CFont   f;
    CSize   size;
    int     height;
    CString strText = "縦書きサンプル";
    CString strFontName = "@HG正楷書体-PRO";

    GetWindowRect(r);
    ScreenToClient(r);
    height = r.Width();
        
    do {    
        f.Detach();
        f.CreateFont(height, 0, 2700, 0, FW_BOLD, 0, 0, 0, DEFAULT_CHARSET,
                     OUT_TT_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,
                     DEFAULT_PITCH | FF_DONTCARE, strFontName);
        pDC->SelectObject(&f);
        size = pDC->GetTextExtent(strText);
        height = height * 9 / 10;
        if (height == 0) return;
    } while (size.cy > r.right * 9 / 10 || size.cx > r.bottom * 9 / 10);

    pDC->TextOut((r.right  - size.cy) / 2 + size.cy,
                 (r.bottom - size.cx) / 2, strText);
}

Dease 2005/01/11(火) 21:56:31
たいちうさん、ありがとうございます!
TextOut()を使った文字列の縦書き表示まではわかるのですが、
テキストエディタのようにするにはどんな方法を使うのでしょうか?

たいちう 2005/01/12(水) 10:22:07
表示すべき座標を計算して並べてTextOutすれば良いのではないですか?
カーソルを表示したり点滅させたり、キーボード入力をひろったり、
変換前の文字列を青字にしたり、IMEを呼び出したりと、
地道に1つずつ実装する方法しか私には思いつきません。
プログラムの練習には十分なボリュームでしょう。

もしも、もっと簡単な方法が見つかったら、是非ご報告ください。

PATIO 2005/01/12(水) 13:28:56
自前でテキストエディタを作るのであれば、それ相応の努力が必要になると思います。
ステップ・バイ・ステップで試しながら作る事をお勧めします。
TextOutを使うにしてもDrawTextを使うにしても文字を書くべき位置は自分で一々計算する
必要があります。計算するためには、一行がどれくらいの幅で描画されるのかを保持して
おいて
一行書く毎に次の行の位置を計算しなくてはなりません。
また、表示されている内容をスクロールさせようとするのであれば、
今表示されている部分が文章全体のどのあたりで何処から何処までを表示する必要がある
のかも
保持しておく必要があります。
また、入力位置のカーソルも自前で位置を決めて出さないと駄目です。
行位置を認識して今のカーソル位置が何行目の何文字目なのかを保持しておかないと駄目
でしょう。

まずは、スクロール無しでファイルから読み込んだテキストを改行を意識して縦書きに描
画できるようなテストプログラムの作成から始める事をお勧めします。
一足飛びにエディタを作るのは多分無理なので、まず、土台になる簡単なプログラムを作
成して
そこから機能追加しながら希望の物に育てていくようなやり方の方が良いと思います。

PATIO 2005/01/12(水) 13:42:22
補足。
TextOutだと改行は認識されないので自分で改行文字を見つけてそこで改行されているように
描画しないといけないはずです。また、改行文字を残していると・が表示されると思うので
改行文字を取り除く必要もあったと思います。
DrawTextだと複数行で描画すれば、改行は勝手にやってくれると思います。
ただ、エディタの場合、入力されるたびに画面の更新が必要になるのでDrawTextだけで
処理する事は難しいと思います。四六時中ウインドウ全体を更新するというのは効率が悪
いし、画面のちらつきの原因になるからです。
適宜、TextOutよDrawTextを使い分ける必要があると思います。

PATIO 2005/01/12(水) 13:43:51
訂正。

誤)
適宜、TextOutよDrawTextを使い分ける必要があると思います。

正)
適宜、TextOutとDrawTextを使い分ける必要があると思います。

Dease 2005/01/13(木) 21:30:56
[[解決]]
たくさんのレスありがとうございます!!
いろいろ試行錯誤しながらがんばって作ってみようと思います!
本当に感謝しています。どうもありがとうございました。

Dease 2005/01/13(木) 21:34:30
あ、ひとつ質問し忘れてました。
カーソルの出し方ってどうやるんでしょうか?

たいちう 2005/01/13(木) 21:58:25
ぉぃぉぃ、そこからかよ。
座標を計算して線を引く。タイマーで点滅させれば、立派なカーソルだ。
ちなみに点滅は、黒いペンと白いペンで交互に線を書く。

# 知り合いでも台本用エディタを作ろうかな、と言ってた人がいます。
# 良いものを作って公開したら需要はあるのではないでしょうか。
# 気長に頑張ってください。

dairygoods 2005/01/14(金) 10:55:33
カーソルなら、CreateCaretとか "Caret" の付くAPIを一通り調べましょう。

たいちう 2005/01/14(金) 13:35:36
dairygoods さま、訂正有難うございます。
お詫びを兼ねてサンプルプログラムを探したのですが、
『プログラミングWindows第五版(上)』の第6章に、"Typer.c"というサンプルがありまし
た。
横書きエディタのサンプルですが、カーソルの操作については応用できるでしょう。

Web上でも多分サンプルを見つけることはできるでしょうが、
SDKでプログラムを作るなら、この本は絶対お勧めです。

http://www.amazon.co.jp/exec/obidos/ASIN/4756136001/qid=1105676431/sr=1-
11/ref=sr_1_2_11/249-2911650-4016320

Dease 2005/01/14(金) 23:15:43
[[解決]]
ありがとうございますw
便利なAPIがあってよかったw
あちこちのサンプルを見ながらがんばって作ってみようと思います!
いままでありがとうございました!!

古いスレッドには追加発言できません。