トップページ > 記事閲覧
入力文字の折り返しについて
名前:Tir 日時: 2019/09/15 00:46

KeyInputStringなどで入力中の文字列の描画が画面外にでると折り返しますが 指定の文字数で最初のx座標から折り返すことは可能でしょうか?
メンテ

Page: 1 |

Re: 入力文字の折り返しについて ( No.1 )
名前:管理人 日時:2019/09/15 12:48

指定の文字数で、というのはありませんが SetDrawArea の範囲内で折り返すように なっていますので、折り返したい範囲を SetDrawArea で指定してみてください m(_ _)m
メンテ
Re: 入力文字の折り返しについて ( No.2 )
名前:Tir 日時:2019/09/15 18:32

SetDrawAreaにこのような効果もあったんですね ただ適当に設定してみたところ普通に見切れた所で折り返してしまい、ぴったりに設定できたとしても半角等が混じるとやっぱり ズレて見切れてしまうのでなにかいい方法はないでしょうか?
メンテ
Re: 入力文字の折り返しについて ( No.3 )
名前:管理人 日時:2019/09/16 03:30

> ただ適当に設定してみたところ普通に見切れた所で折り返してしまい、ぴったりに設定できたとしても半角等が混じるとやっぱり > ズレて見切れてしまうのでなにかいい方法はないでしょうか? 他の方法としては、少し面倒ですが自前で GetDrawStringWidth を使って描画した際の描画幅を取得して区切る位置を決定して、 描画する文字列を行の分だけ区切って何回かの DrawString に分けて描画する方法があります この方法は KeyInputString ではできないので、MakeKeyInput を使う方式にして、 入力中の文字列を GetKeyInputString で取得して文字列を自前で描画します ( ちょっと時間が無くてサンプルは用意できませんでした、すみません… )
メンテ
Re: 入力文字の折り返しについて ( No.4 )
名前:Tir 日時:2019/09/16 21:04

今現在自分で入力描画処理を行っていてまだまだ行うことは沢山ありますが1つ気になることがあったので報告します。 GetIMEInputModeStr関数ですが半角英数時に正常に取得できません。全角ひらがなは取得できます。 またIME入力中に変換した場合は正常に取得できますがIME終了時には元に戻ってしまいますこれは仕様でしょうか? ttps://i.imgur.com/Qicnbuv.jpg ttps://i.imgur.com/cOI5Nf1.jpg ttps://i.imgur.com/yV11Z0l.jpg
メンテ
Re: 入力文字の折り返しについて ( No.5 )
名前:管理人 日時:2019/09/17 06:12

GetIMEInputModeStr は IME入力中の間のみ文字列が取得出来て、IME入力中以外では -1 が返ってきて文字列は 引数に渡したバッファに代入されないようになっていますので、『半角英数時』が IME入力ではない入力状態の ことだとしますと、仕様の通りとなります > またIME入力中に変換した場合は正常に取得できますがIME終了時には元に戻ってしまいますこれは仕様でしょうか? すみません、どのような状態からどのような状態に戻ってしまうのでしょうか?
メンテ
Re: 入力文字の折り返しについて ( No.6 )
名前:Tir 日時:2019/09/18 20:31

> すみません、どのような状態からどのような状態に戻ってしまうのでしょうか? 仕様なら大丈夫です。 しかし当たり前のように使っていた入力の描画ですがいざ自分で作るとなると非常に大変でDXライブラリの基礎機能のありがたみを 改めて再確認しております^^; 詳しくは知りませんがカーソル移動や変換候補、文節の区切り等の描画も全部管理人さんが作ったんですよね?脱帽します。 今は折り返し自体は上手くいったのですがIME中の折り返している状態で文節2つ目以降の区切りの描画をどうしようか悩んでいる最中です。 もしかしたらまた質問するかもしれませんのでそれまで解決は保留にさせて貰います。
メンテ
Re: 入力文字の折り返しについて ( No.7 )
名前:管理人 日時:2019/09/18 23:59

> 詳しくは知りませんがカーソル移動や変換候補、文節の区切り等の描画も全部管理人さんが作ったんですよね?脱帽します。 いえ、現状のレベルまでしかできなかったので片手落ちです (- -;; これ以上進める( 文字単位改行処理まで実装する )と、よくある『句読点が改行直後にある場合はそのひとつ前の文字から改行する』や 『英文では単語の途中で改行されてしまう場合は単語ごと改行する』などの領域に突入すると思い 実装当時そこまで対応する気が起きず現状の方式となっています… (_ _; > 今は折り返し自体は上手くいったのですがIME中の折り返している状態で文節2つ目以降の区切りの描画をどうしようか悩んでいる最中です。 > もしかしたらまた質問するかもしれませんのでそれまで解決は保留にさせて貰います。 はい、何かありましたらご質問ください
メンテ
Re: 入力文字の折り返しについて ( No.8 )
名前:Tir 日時:2019/09/20 22:17

デフォルト入力機能の足元にも及ばない状態ですが形になって来たと思った矢先に完全に割り込み入力の事を忘れていて どうすればいいのかいいのか分からなくなってきたので質問します。 現状では割り込みで入力した場合IME状態では最後尾に描画される状態です。 この状態から入力済みと入力済みの間にIME状態で割り込んで描画することは可能でしょうか? もしもっとスマートなやり方があるのでしたら時間があるときでいいのでサンプルを用意していただけるとありがたいです。 因みにUnicodeです。 #include "DxLib.h" #include<string> using namespace std; int HDVer = 1; typedef class KeyInputTwoLines { public: wstring GetString; int Time;//カウント int InputHandle;//入力ハンドル int FontHandle;//フォントハンドル int X, Y;//ベース座標 int SizeY;//縦のサイズ int DrawArea;//描画する範囲 int MemClauseStrMaxNum;//記録用 int MemClauseStrNum;//記録用 int ClauseNweLine;//改行する文節 int InputStrNum;//入力文字数 int CursolNum;//カーソル bool Cancell;//キャンセルフラグ KeyInputTwoLines(int x, int y, int drawarea, int strnum, int fontno, bool cancell);//コンストラクタ KeyInputTwoLines() {};//コンストラクタ引数無し版 void KeyInputTwoLinesSet(int x, int y, int drawarea, int strnum, int fontno, bool cancell);//ハンドル制作・セット及び初期化 void ActiveHandle() { SetActiveKeyInput(InputHandle); }//キー入力を許可 wstring GetInputString() { return GetString; }//文字列の取得 ~KeyInputTwoLines() { //念のためここでもハンドルを消す DeleteKeyInput(InputHandle); DeleteFontToHandle(FontHandle); } int KeyInputMain(); void DrawKeyInput(); }keyinputtwolins_t; KeyInputTwoLines::KeyInputTwoLines(int x, int y, int drawarea, int strnum, int fontno, bool cancell) { KeyInputTwoLinesSet(x, y, drawarea, strnum, fontno, cancell); } //初期化セット void KeyInputTwoLines::KeyInputTwoLinesSet(int x, int y, int drawarea, int strnum, int fontno, bool cancell) { Time = 0; X = x; Y = y; DrawArea = drawarea; InputStrNum = strnum; Cancell = cancell; MemClauseStrMaxNum = 0; MemClauseStrNum = 0; ClauseNweLine = 0; //ここでフォントを作るついでに縦幅も設定 if (fontno == 0) { FontHandle = CreateFontToHandle(L"MS Gothic", 32 * HDVer, (int)(1.5*HDVer), DX_FONTTYPE_ANTIALIASING_EDGE_4X4, -1, (int)(1.5*HDVer)); SizeY = 40; } //ハンドルを制作 InputHandle = MakeKeyInput(InputStrNum, Cancell, false, false); //フォントを設定 SetKeyInputStringFont(FontHandle); } //キー入力のメインしょり int KeyInputTwoLines::KeyInputMain() { // 作成したキー入力ハンドルをアクティブにする int State = CheckKeyInput(InputHandle); CursolNum = GetKeyInputCursorPosition(InputHandle); if (State != 0) { if (State == 1) { TCHAR Str[128]; GetKeyInputString(Str, InputHandle); GetString = Str; } //ここでハンドルを消す DeleteKeyInput(InputHandle); DeleteFontToHandle(FontHandle); } Time++;//タイマーカウント return State; } void KeyInputTwoLines::DrawKeyInput() { //投稿する際の文字数 //カーソルの座標 int CursorX = 0, CursorY = 0; //入力済み文字を取得 TCHAR Str[128]; GetKeyInputString(Str, InputHandle); //入力済み文字数を取得 int strmaxnum = strlenDx(Str); int strnum = 0;//1行目の文字数 bool Line = false;//改行フラグ //何文字で改行するかを判断するループ for (int i = 0; i < strmaxnum; i++) { //文字の横幅を取得 int length = GetDrawStringWidthToHandle(Str, i + 1, FontHandle); //文字の描画範囲が指定以下ならその文字数を代入 if (length < DrawArea * HDVer) { strnum = i + 1; } else { //描画範囲を超えたら改行フラグをオン Line = true; break; } } //入力済み一行目の描画 DrawNStringToHandle(X * HDVer, (Y)*HDVer, Str, strnum, GetColor(255, 255, 255), FontHandle); //改行済みなら2行目を描画 if (Line) { DrawNStringToHandle(X * HDVer, (Y + SizeY)*HDVer, &Str[strnum], strmaxnum - strnum, GetColor(255, 255, 255), FontHandle); } //カーソルの座標設定 { CursolNum = GetKeyInputCursorPosition(InputHandle); CursorX = GetDrawStringWidthToHandle(Str, CursolNum, FontHandle); //範囲を超えたら2行目 if (CursorX >= (DrawArea - 5) * HDVer) { CursorX = GetDrawStringWidthToHandle(&Str[strnum], CursolNum - strnum, FontHandle); CursorY = 40; } //printfDx(L"%d,calc=%d,X=%d", CursolNum, CursolNum - strnum, CursorX); } //入力中の文字を描画 const IMEINPUTDATA *IMEData; //IME情報取得 IMEData = GetIMEInputData(); if (IMEData != NULL) { //IME入力中の改行判断 int imestrmaxnum = strlenDx(IMEData->InputString); int imestrnum = 0;//1行目の文字数 bool Imeline = false;//IME入力中の改行フラグ //何文字で改行するかを判断するループ for (int i = 0; i < imestrmaxnum; i++) { //文字の横幅を取得(既に入力された文章と合わせる) int length = GetDrawStringWidthToHandle(Str, strnum, FontHandle) + GetDrawStringWidthToHandle(IMEData->InputString, i + 1, FontHandle); //文字の描画範囲が指定以下ならその文字数を代入 if (length < DrawArea * HDVer && !Line) { imestrnum = i + 1; } else { //描画範囲を超えたら改行フラグをオン Imeline = true; break; } } { //文節のボックス if (IMEData->ClauseNum > 0 && IMEData->SelectClause != -1) { //文節の改行判断 int Clausestrmaxnum = IMEData->ClauseData[IMEData->SelectClause].Length;//文節の文字数 int Clausestrnum = 0;//1行目の文字数 bool Clauseline = false; bool Clauseline2 = false; //何文字で改行するかを判断するループ for (int i = 0; i < Clausestrmaxnum; i++) { //文字の横幅を取得 int length = GetDrawStringWidthToHandle(Str, strnum, FontHandle) + GetDrawStringWidthToHandle(IMEData->InputString, IMEData->ClauseData[IMEData->SelectClause].Position + i + 1, FontHandle); //文字の描画範囲が指定以下ならその文字数を代入 if (length < DrawArea * HDVer && !Line) { //文節の文字数 Clausestrnum = i + 1; MemClauseStrNum = Clausestrnum; MemClauseStrMaxNum = IMEData->ClauseData[IMEData->SelectClause].Length; ClauseNweLine = IMEData->SelectClause; } else { //文節の文字が1文字目で2行目にいく場合 if (i == 0) { Clausestrmaxnum = 0;//文字0 Clauseline2 = true; } //描画範囲を超えたら改行フラグをオン Clauseline = true; break; } } //選択された文節の開始位置と終了位置 int sx = (X * HDVer) + GetDrawStringWidthToHandle(Str, strnum, FontHandle) + GetDrawStringWidthToHandle(IMEData->InputString, IMEData->ClauseData[IMEData->SelectClause].Position, FontHandle); int ex = sx + GetDrawNStringWidthToHandle(&IMEData->InputString[IMEData->ClauseData[IMEData->SelectClause].Position], Clausestrnum, FontHandle); //一行目の文節のボックス DrawBox(sx, (Y)*HDVer, ex, (Y + SizeY)*HDVer, GetColor(255, 255, 0), true); //文節が2行目にいったら if (Clauseline) { if (!Line) { //入力済みが2行目に行ってなかったら if (!Clauseline2) { //文節が1行と2行を跨いでいる sx = (X * HDVer); ex = sx + GetDrawStringWidthToHandle(&IMEData->InputString[IMEData->ClauseData[IMEData->SelectClause].Position], Clausestrmaxnum - Clausestrnum, FontHandle); } else { //文節が完全に2行目に移行していたら sx = (X * HDVer) + GetDrawStringWidthToHandle(&Str[strnum], strmaxnum - strnum, FontHandle) + GetDrawStringWidthToHandle(&IMEData->InputString[IMEData->ClauseData[ClauseNweLine].Position], MemClauseStrMaxNum - MemClauseStrNum, FontHandle); for (int i = 0; i < IMEData->SelectClause; i++) { if (ClauseNweLine < i) { sx += GetDrawStringWidthToHandle(&IMEData->InputString[IMEData->ClauseData[i].Position], IMEData->ClauseData[i].Length, FontHandle); } } ex = sx + GetDrawStringWidthToHandle(&IMEData->InputString[IMEData->ClauseData[IMEData->SelectClause].Position], IMEData->ClauseData[IMEData->SelectClause].Length, FontHandle); } } else { //完全に2行目に移行していたら入力済み2行目の長さ sx = (X * HDVer) + GetDrawStringWidthToHandle(&Str[strnum], strmaxnum - strnum, FontHandle); //変換中の文節までの長さを足す for (int i = 0; i < IMEData->SelectClause; i++) { sx += GetDrawStringWidthToHandle(&IMEData->InputString[IMEData->ClauseData[i].Position], IMEData->ClauseData[i].Length, FontHandle); } ex = sx + GetDrawStringWidthToHandle(&IMEData->InputString[IMEData->ClauseData[IMEData->SelectClause].Position], IMEData->ClauseData[IMEData->SelectClause].Length, FontHandle); } //文節の選択ボックス DrawBox(sx, (Y + SizeY)*HDVer, ex, (Y + SizeY + SizeY)*HDVer, GetColor(255, 255, 0), true); } } } //一行目の描画 DrawNStringToHandle((X * HDVer) + GetDrawStringWidthToHandle(Str, strnum, FontHandle), (Y)*HDVer, IMEData->InputString, imestrnum, GetColor(255, 255, 0), FontHandle); if (Imeline) { //二行目なら DrawNStringToHandle((X * HDVer) + GetDrawStringWidthToHandle(&Str[strnum], strmaxnum - strnum, FontHandle), (Y + SizeY)*HDVer, &IMEData->InputString[imestrnum], imestrmaxnum - imestrnum, GetColor(255, 255, 0), FontHandle); } //変換候補を描画 if (IMEData->CandidateNum > 0) { int BaseMenu = IMEData->SelectCandidate / 4; int First = 4 * BaseMenu; int End = 4 + 4 * BaseMenu; if (End >= IMEData->CandidateNum) { First = IMEData->CandidateNum - 4; End = IMEData->CandidateNum; } if (First < 0) { First = 0; } int DrawNum = 0; for (int i = First; i < End; i++) { if (IMEData->SelectCandidate == i) SetDrawBright(255, 255, 0); else SetDrawBright(0, 255, 255); if (!Imeline) DrawStringToHandle((X * HDVer) + GetDrawStringWidthToHandle(Str, strnum, FontHandle), (Y + SizeY + SizeY * DrawNum)*HDVer, IMEData->CandidateList[i], GetColor(255, 255, 255), FontHandle); else DrawStringToHandle((X * HDVer) + GetDrawStringWidthToHandle(&Str[strnum], strmaxnum - strnum, FontHandle), (Y + SizeY + SizeY + SizeY * DrawNum)*HDVer, IMEData->CandidateList[i], GetColor(255, 255, 255), FontHandle); DrawNum++; } } SetDrawBright(255, 255, 255); //IME入力モード wchar_t ImeStr[7]; GetIMEInputModeStr(ImeStr); DrawStringToHandle((960 * HDVer) - GetDrawStringWidthToHandle(ImeStr, 7, FontHandle), (540 - 60)*HDVer, ImeStr, GetColor(255, 255, 255), FontHandle); //IME時のカーソル { CursorX = GetDrawStringWidthToHandle(Str, strnum, FontHandle) + GetDrawStringWidthToHandle(IMEData->InputString, IMEData->CursorPosition, FontHandle); if (CursorX >= (DrawArea - 5) * HDVer) { CursorX = GetDrawStringWidthToHandle(&Str[strnum], strmaxnum - strnum, FontHandle) + GetDrawStringWidthToHandle(IMEData->InputString, IMEData->CursorPosition - imestrnum, FontHandle); CursorY = 40; } } //printfDx(L"%d,X=%d", IMEData->CursorPosition, CursorX); //入力カーソルの描画と点滅 if (Time % 60 < 30) { DrawLine((X + 5) * HDVer + CursorX, (Y)*HDVer + CursorY * HDVer, (X + 5)* HDVer + CursorX, (Y)*HDVer + CursorY * HDVer + SizeY * HDVer, GetColor(255, 0, 0), 2 * HDVer); } } else { //入力カーソルの描画と点滅 if (Time % 60 < 30) { DrawLine((X + 5) * HDVer + CursorX, (Y)*HDVer + CursorY * HDVer, (X + 5) * HDVer + CursorX, (Y)*HDVer + CursorY * HDVer + SizeY * HDVer, GetColor(255, 255, 0), 2 * HDVer); } } SetDrawArea(130 * HDVer, 0, 830 * HDVer, 540 * HDVer); //DrawKeyInputString(130 * HDVer, (WinCenterY + 20)*HDVer,InputKeyHandle); SetDrawArea(0, 0, 960 * HDVer, 540 * HDVer);//描画可能エリアを設定 } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode(true); SetGraphMode( 960*HDVer , 540*HDVer , 32 ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 描画先を裏画面にセット SetDrawScreen( DX_SCREEN_BACK ) ; keyinputtwolins_t Input(130,270,705,40,0,true); Input.ActiveHandle(); // ループ while( ProcessMessage() == 0) { // 画面のクリア ClsDrawScreen(); DrawBox(130*HDVer,270*HDVer,820*HDVer,350*HDVer,GetColor(255,255,255),true); int State = Input.KeyInputMain(); if (State != 0) { break; } Input.DrawKeyInput(); // 裏画面の内容を表画面に反映させる ScreenFlip() ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
メンテ
Re: 入力文字の折り返しについて ( No.9 )
名前:管理人 日時:2019/09/22 02:47

一般的なIME入力は、入力中の文字列がもともと書かれている文字列の上に上書きされる形となっていますので、 こちらでも同様にもともと書かれている文字列の上に上書きする方式で良いのではないでしょうか? 例えば『//カーソルの座標設定』の後に int CursorX2 = CursorX; と、通常描画の際のカーソル位置を保存しておいて、IME描画の //一行目の描画 DrawNStringToHandle((X * HDVer) + GetDrawStringWidthToHandle(Str, strnum, FontHandle), (Y)*HDVer, IMEData->InputString, imestrnum, GetColor(255, 255, 0), FontHandle); こちらの部分を //一行目の描画 DrawBox( (X * HDVer) + CursorX2, (Y)*HDVer, (X * HDVer) + CursorX2 + GetDrawStringWidthToHandle( IMEData->InputString, imestrnum, FontHandle ), (Y)*HDVer + SizeY * HDVer, GetColor( 255,255,255 ), TRUE ) ; DrawNStringToHandle((X * HDVer) + CursorX2, (Y)*HDVer, IMEData->InputString, imestrnum, GetColor(255, 255, 0), FontHandle); こちらのようにすれば文字列の途中に上書き描画できます ( 実際にこの方式で進める場合は変換候補やIME入力中カーソルの描画位置などの位置も変更しなければなりませんが… )
メンテ
Re: 入力文字の折り返しについて ( No.10 )
名前:Tir(解決) 日時:2019/09/23 00:40

管理人さんの方法で試したのですが半角が混じっていたりすると白で塗りつぶした部分からはみ出たりするので 色々アドバイスを貰って申し訳ないんですがやはり多少見切れてもデフォルトの入力機能の方が優れているのでそちらの方を使用したいと思います。
メンテ
Re: 入力文字の折り返しについて ( No.11 )
名前:Tir(解決) 日時:2019/09/23 05:52

DrawObtainsNString_CharClipっていう関数があったんですね… これのおかげでコードも大分スッキリしました 1行目に半角英数が入力された状態でIME状態で行をまたいだ時に表示がズレますが それ以外は上手くいったのでこれで解決にさせて貰います #include "DxLib.h" #include<string> using namespace std; int HDVer = 1; typedef class KeyInputTwoLines { public: wstring GetString; int Time;//カウント int InputHandle;//入力ハンドル int FontHandle;//フォントハンドル int X, Y;//ベース座標 int SizeY;//縦のサイズ int DrawArea;//描画する範囲 int ClauseNweLine;//改行する文節 int LineNum;//一行に入力できる数(2バイト文字で) int InputStrNum;//入力文字数 int CursolNum;//カーソル bool Cancell;//キャンセルフラグ KeyInputTwoLines(int x, int y, int linenum, int strnum, int fontno, bool cancell);//コンストラクタ KeyInputTwoLines() {};//コンストラクタ引数無し版 void KeyInputTwoLinesSet(int x, int y, int drawarea, int strnum, int fontno, bool cancell);//ハンドル制作・セット及び初期化 void ActiveHandle() { SetActiveKeyInput(InputHandle); }//キー入力を許可 wstring GetInputString() { return GetString; }//文字列の取得 ~KeyInputTwoLines() { //念のためここでもハンドルを消す DeleteKeyInput(InputHandle); DeleteFontToHandle(FontHandle); } int KeyInputMain(); void DrawKeyInput(); }keyinputtwolins_t; KeyInputTwoLines::KeyInputTwoLines(int x, int y, int drawarea, int strnum, int fontno, bool cancell) { KeyInputTwoLinesSet(x, y, drawarea, strnum, fontno, cancell); } //初期化セット void KeyInputTwoLines::KeyInputTwoLinesSet(int x, int y, int linenum, int strnum, int fontno, bool cancell) { Time = 0; X = x; Y = y; LineNum = linenum; InputStrNum = strnum; Cancell = cancell; ClauseNweLine = 0; //ここでフォントを作るついでに縦幅も設定 if (fontno == 0) { if(HDVer==1) FontHandle = CreateFontToHandle(L"MS Gothic", 32 , 3, DX_FONTTYPE_ANTIALIASING_EDGE_4X4, -1, 2); else FontHandle = CreateFontToHandle(L"MS Gothic", 32 * HDVer, (int)(1.5*HDVer), DX_FONTTYPE_ANTIALIASING_EDGE_4X4, -1, (int)(1.5*HDVer)); SizeY = 40; } DrawArea = GetDrawStringWidthToHandle(L"あ", 1, FontHandle)*linenum; //ハンドルを制作 InputHandle = MakeKeyInput(InputStrNum, Cancell, false, false); //フォントを設定 SetKeyInputStringFont(FontHandle); } //キー入力のメインしょり int KeyInputTwoLines::KeyInputMain() { // 作成したキー入力ハンドルをアクティブにする int State = CheckKeyInput(InputHandle); CursolNum = GetKeyInputCursorPosition(InputHandle); if (State != 0) { if (State == 1) { TCHAR Str[128]; GetKeyInputString(Str, InputHandle); GetString = Str; } //ここでハンドルを消す DeleteKeyInput(InputHandle); DeleteFontToHandle(FontHandle); } Time++;//タイマーカウント return State; } void KeyInputTwoLines::DrawKeyInput() { DrawBox(X * HDVer, 270 * HDVer, X*HDVer + DrawArea, 350 * HDVer, GetColor(255, 255, 255), true); SetDrawArea(X * HDVer, 0, X*HDVer+DrawArea, 540 * HDVer);//描画可能エリアを設定 TCHAR Str[128]; GetKeyInputString(Str, InputHandle); SetKeyInputStringColor2(DX_KEYINPSTRCOLOR_NORMAL_CURSOR, GetColor(0, 0, 0)); DrawObtainsNString_CharClip(X * HDVer, (Y)*HDVer, SizeY * HDVer, Str, 40, GetColor(255, 255, 255), 0, FontHandle); int sx = X * HDVer; int CorsolX = sx; int CursolNum = GetKeyInputCursorPosition(InputHandle); //入力済み文字数を取得 int strmaxnum = strlenDx(Str); int strnum = 0;//1行目の文字数 //何文字で改行するかを判断するループ for (int i = 0; i < strmaxnum; i++) { //文字の横幅を取得 int length = GetDrawStringWidthToHandle(Str, i + 1, FontHandle); //文字の描画範囲が指定以下ならその文字数を代入 if (length <= DrawArea) { strnum = i + 1; } else { break; } } //入力文字長さ int length = GetDrawNStringWidthToHandle(Str, CursolNum, FontHandle); int remainder = 0, hosei = 0;//補正 int onestri = GetDrawStringWidthToHandle(L"あ", 1, FontHandle); { CorsolX += length;//カーソル DrawLine(CorsolX, (Y)*HDVer, CorsolX, (Y + SizeY)*HDVer, GetColor(0, 0, 0)); if (DrawArea <= length) { remainder = GetDrawNStringWidthToHandle(Str, strnum, FontHandle) % onestri; if (remainder != 0) { hosei += onestri; } CorsolX -= GetDrawNStringWidthToHandle(Str, strnum, FontHandle); DrawLine(CorsolX, (Y + SizeY)*HDVer, CorsolX, (Y + SizeY+ SizeY)*HDVer, GetColor(0, 0, 0)); } } sx += length - remainder + hosei; DrawIMEInputString(sx, (Y)*HDVer, 40); SetDrawArea(0 * HDVer, 0, 960 * HDVer, 540 * HDVer);//描画可能エリアを設定 } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode(true); SetGraphMode( 960*HDVer , 540*HDVer , 32 ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 描画先を裏画面にセット SetDrawScreen( DX_SCREEN_BACK ) ; keyinputtwolins_t Input(130,270,20,40,0,true); Input.ActiveHandle(); // ループ while( ProcessMessage() == 0) { // 画面のクリア ClsDrawScreen(); DrawBox(130*HDVer,270*HDVer,830*HDVer,350*HDVer,GetColor(255,255,255),true); int State = Input.KeyInputMain(); if (State != 0) { break; } Input.DrawKeyInput(); // 裏画面の内容を表画面に反映させる ScreenFlip() ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
メンテ
Re: 入力文字の折り返しについて ( No.12 )
名前:管理人(解決) 日時:2019/09/23 22:15

問題が解決されたようで何よりです そして、すみません、No.10 のお書き込みを拝見して、ご苦労をお掛けした上に デフォルトの見切れる表示で行かれるとのことで申し訳ないと思って デフォルトでも文字が見切れそうになったら改行するようにしました ( 句読点が行の末端にある場合や英単語の途中で改行される場合等の対応はしていませんが… ) が、その後独自に解決されていたということで…間が悪くてすみません… 一応こちらにアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) あと、DrawKeyInputString の描画範囲を SetDrawArea で制限できる旨をお伝えしましたが、 SetDrawArea で制限した場合は変換候補の表示まで SetDrawArea 内に収めようとしてしまうので、 代わりに SetKeyInputDrawArea という、入力文字列のみの描画範囲を設定するための 関数があったのでした( すみません失念していました orz ) // キー入力ハンドルの入力中文字列を描画する際の描画範囲を設定する int SetKeyInputDrawArea( int x1, int y1, int x2, int y2, int InputHandle ) ; 独自の描画をされる場合は不要ですが、もしデフォルトの機能を使用される際は SetDrawArea の代わりに使用してください
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存