トップページ > 過去ログ > 記事閲覧
テキストエディタのルール?で、DxLibで表示するためには?
名前:魚肉 日時: 2012/04/01 18:34

こないだは、高度な技術を、ありがとうございました。 今回も、頼ることになりそうです。 ここのコメント入力欄に文字を打ち込むようなかんじに、 文字を出力したいのです。 とても難しい日本語になりそうな質問内容ですけども。 等幅フォント。 「(”)」、。などの、禁則文字を発見したら、 改行されて続く。 半角英数の単語、または、数字を見つけたら、 その単語や数の頭のところでぶったぎって、改行して続く。 イメージだと、このイラストのようになる予定。 動画はあきらめた。 //ll.la/38.ダブリュウ (ダブリュウは、アルファベット化必須) イメージ的には、ファイルにmondaibunAやBを、ファイルから読み込んで、 それを、4行に分割して、1行が何文字分か計算して、 時間をおって、文字がだんだん見えてくるようにする予定でした。 (1行を1秒の早さで1秒全部見える予定でも、文字数の違いで、1秒より早く、全部見える場合もある)。 できれば、文字描画は、負荷が高い処理だそうなので、 画像化する方法、 1行が、何文字分表示されているかをわかる方法も、 知りたいのでした。 (ドローボックス関数で、描画したフリップを、時間経過とともにめくる方式で表示しようとしてた)。 目的は、問題作成機を作り、 エディタコンポーネントに打ち込んだとおりに、 表示させるのが目的でした。 資料をあさっていたけど、私の技術は未熟なのと、 見つからなかったのでした。

Page: 1 |

Re: テキストエディタのルール?で、DxLibで表示するためには? ( No.1 )
名前:いっち 日時:2012/04/01 22:03

> できれば、文字描画は、負荷が高い処理だそうなので、画像化する方法、 MakeScreen でバッファを作ってそこに1文字ずつ書き出していけば良いと思います。 > 1行が、何文字分表示されているかをわかる方法も、知りたいのでした。 1文字表示するたびにカウントアップしていけばよいのではないでしょうか?
Re: テキストエディタのルール?で、DxLibで表示するためには? ( No.2 )
名前:魚肉 日時:2012/04/03 07:26

・・・調査中、調査中、調査中。 MakeScreen関連は、おお! こんな機能があったのか! と、感動しておりました。 今更ながら、DXライブラリは、intの使い方が特殊ですね。 画像も音声も格納できて、改めてびっくりしてました。 1文字表示するたびにカウントアップについては、 今のところ、やり方考えていました。 まとまった時間がないと、たぶん作れないと思います。 考えてたことの説明が、ちょっと難しくて、 私の考えてたことは何だったのかを、感じ取るのも難しい文だったかもしれません。 問題文を、 テキストエディタのルールに従って、 DXライブラリで表示。 1行(途中で\nが入っていても)のものを、 結果的に、4行に分割表示するので、 分割された1行あたりの文字数を把握するための方法も、模索していました。 時間みつけて、実験結果を、あとで、報告します。
Re: テキストエディタのルール?で、DxLibで表示するためには? ( No.3 )
名前:h2so5 日時:2012/04/03 15:39

> 今更ながら、DXライブラリは、intの使い方が特殊ですね。 > 画像も音声も格納できて、改めてびっくりしてました。 一応、補足をしておきますが int 型は単なる数値データなので画像や音声は入りません。 画像や音声データは別のところにあり、それを参照するための識別番号が入っています。
Re: テキストエディタのルール?で、DxLibで表示するためには? ( No.4 )
名前:いっち 日時:2012/04/04 01:55

魚肉さん> DXライブラリに禁則処理をどうにかするような機能はありません。 C/C++で実装する限り地道に丁寧に1文字ずつチェックしながら処理するより無いと思います。 文字(列)を描画した場合のドット幅は GetDrawStringWidth で調べられます。
Re: テキストエディタのルール?で、DxLibで表示するためには? ( No.5 )
名前:魚肉 日時:2012/04/05 08:32

調査中。土曜日あたりに、まとめて実験したりすると思います。 h2so5さん どうりで、int a;for(;;){a=LoadGraph("123.bmp");}みたいなことをやると、 アプリが申し訳なくなって終了するわけですね。 intの中身を変更すれば、中の画像や音声も変更できると思ってた時代がありました。 いっちさん 調べてたけど、難しかったので、 禁則処理をあきらめないで導入する方向性と、 あきらめたとしたら、代替え案をどうするかの方向性と、 両方考えていました。 おそらく、土曜日以降?、もう少し文字チェックの方法と格闘してみます。
Re: テキストエディタのルール?で、DxLibで表示するためには? ( No.6 )
名前:魚肉 日時:2012/04/08 17:33

今のところの結果報告 改行 OK 禁則 NG 追加してみたい機能 H2SO4(化学式が正確に書けない)や、X2(Xの2乗と書けない)の表記に対応する、ちっさい文字 ドット幅を測るのは考えたけど、 等幅フォントを使えば、ここは解決できると思いましたので、 あえて使いませんでした。 プロポーショナルフォントだったらば、確実に必要になると思います。 改行処理も、文字数で改行するようなヘマはできないし。 とりあえず、実験用に作ったソースさらしてみます。 //問題を表示するテスツ1 #include"DxLib.h" #include<string.h> //グローバルにする意味なし short kazu=0; short gyou=0; //short moji_x=0; 使わなかった //short moji_y=0; char mondai[]="工業用に使われている、純度99.9%の高純度鉄よりも、はるかに高い純度を誇る、99.9999%の超高純度鉄を開発した大学は、宮城県にある、どこの大学?"; char mon_buf[9][41]; //半角の%が表示できないなぜだ //禁則処理に関する文字 //char kinsoku_zen[]="!?)」、。}ー〜”’]1234567890(「{["; //char kinsoku_han[]="\"」、。,.\'!?)]1234567890[(「{"; //char kinsoku_buf[3]; //マクロにしてもいいけど醜くなるからやりたくない short gyouokuri=10; short fontsize=20; int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){ //まどかまぎか ChangeWindowMode(true); //初期化お約束 if(DxLib_Init()==-1)return -1; //ふぉんと関連 ChangeFont("MS ゴシック"); SetFontSize(fontsize); SetFontThickness(5); //仮想画面を作ります int moji_kakikaki; moji_kakikaki=MakeScreen(600,200); //描画先を、仮想画面に指定する SetDrawScreen(moji_kakikaki); for(short i=0;mondai[i]!='\0';i++){ //条件 shift-jis的に、全角かどうかを判定、全角なら2つすすむ if(((unsigned char)mondai[i]>=0x81 && (unsigned char)mondai[i]<=0x9f) || ((unsigned char)mondai[i]>=0xe0 && (unsigned char)mondai[i]<=0xfc)){ //全角 //あふれそうになったら改行処理 if(kazu>=39){ kazu=0; gyou++; } //いちいち1文字ずつ描画 strncpy(&mon_buf[gyou][kazu],&mondai[i],2); i++; kazu+=2; }else{ //半角 //改行判定&処理 作り込めば、htmlのタブみたいなこともできるかも if((unsigned char)mondai[i]=='\n'){ kazu=0; gyou++; i++; } //あふれそうになったら改行処理 if(kazu>=40){ kazu=0; gyou++; } //いちいち1文字ずつ描画 strncpy(&mon_buf[gyou][kazu],&mondai[i],1); kazu+=1; } } //文字バッファにたまった4行分を1行ずつ表示する for(int i=0;i<4;i++){ DrawFormatString(0,(i*fontsize)+(gyouokuri*i),GetColor(255,255,255),_T(&mon_buf[i][0])); } //仮の画面作成だから簡易表示。本番では作り込みが必要 SetDrawScreen(DX_SCREEN_FRONT); DrawBox(0,0,639,479,GetColor(127,127,127),TRUE); DrawGraph(0,0,moji_kakikaki,TRUE); WaitKey(); DxLib_End(); return 0; }
Re: テキストエディタのルール?で、DxLibで表示するためには? ( No.7 )
名前:いっち 日時:2012/04/08 19:12

> //半角の%が表示できないなぜだ 書式用文字と判定されているためではないでしょうか?以下のようにすれば表示されると思います。 > DrawFormatString(0,(i*fontsize)+(gyouokuri*i),GetColor(255,255,255),"%s",_T(&mon_buf[i][0]));
Re: テキストエディタのルール?で、DxLibで表示するためには? ( No.8 )
名前:魚肉 日時:2012/04/08 20:48

いっちさんの方法で、改善できました。 禁則処理のことを調べてみたら、 複雑怪奇なルールすぎました。 //ja.wikipedia.org/wiki/%E7%A6%81%E5%89%87%E5%87%A6%E7%90%86 某早押しクイズも、禁則処理に対応してないっぽいし。 問題作成機を作るとき、テキストエディタのコンポーネントをくっつけて、 それのルールで表示できれば、問題作成が楽できると思って、 無理してでも禁則処理を実装しようとしていました。 とりあえず、ここまでできれば、あとは問題作成の人に、 どのように問題が表示されるかを確認できる方法さえ提示すれば、 作業的には、なんとかなりそうなので、 禁則処理そのものは、まだ解決できなかったけど、 やりたいことの8割は実現できそうです。 皆様、ご協力ありがとうございました。

Page: 1 |