合計 昨日 今日

DxLibの全角テキスト入力の表示について

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

返信する

Advanced BBCode Box 3 :: ヘルプ ページ Advanced BBCode Box 3 (aka ABBC3)  
選択テキストを切り取る (カット) 選択テキストをコピー コピーしたテキストを貼り付け (ペースト) 選択したテキストから全ての BBCode タグを削除します。 箇条書きリスト 連番付き箇条書きリスト リスト項目 水平線 太字 斜体 下線 取り消し線 上付き文字 下付き文字 フェードイン / アウト テキスト グラデーション 正当テキスト 左揃え 中央ぞろえ 右揃え 整形済みテキスト
タブインデント挿入 コード 引用 本題と外れた内容を囲むオフトピックテキストを挿入します。 Web アドレス Eメール 画像を挿入します。 サムネイル画像を挿入します。 Youtube 動画 を挿入します。 ニコニコ動画を挿入します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
トピックのレビュー
このトピックはまだ解決していません
   

展開ビュー トピックのレビュー: DxLibの全角テキスト入力の表示について

Re: DxLibの全角テキスト入力の表示について

投稿記事 by Kinesin » 2017年9月03日(日) 20:50

悩める人 さん返信ありがとうございます。

確かに悩める人さんのアイデアだと全角テキスト入力で一文字ずつ入力することはできそうですが、
それだとひらがなorカタカナの一択になってしまいます。
要するに変換ができなくなってしまうんです……

考えているうちに、
背景を白にして(DrawBox(0,0,640,480,GetColor(255, 255, 255),TRUE);を使います。)
DrawKeyInputStringをDrawStringToHandleの表示する場所に物理的に上書きする
という方法も思いついたのですが、どこかしっくりこないんですよね。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Load.cpp
 
//略
void Load::draw()
{
     if (nameFlag == FALSE)
     {
          // int black = GetColor(0, 0, 0)で定義しときます。
          DrawStringToHandle(80, 380, "↓Please tell me your name, sir.", black, bodyHandle);
          DrawKeyInputString(80, 410, inputHandle);
          DrawStringToHandle(80, 410, charactorName.c_str(), black, bodyHandle);
     }
     else
     {
          // 全角テキスト入力後の描画処理
     }
}


DrawKeyInputStringの描画している部分を、
そのままChar型配列やstringに変換できる関数なんかがあればいいんですけどね。

DrawKeyInputStringの関数を中身を見ようとしたり、
前身のDirectXも調べてみたのですが進展はありませんでした……

何かいい方法はないのでしょうか……

Re: DxLibの全角テキスト入力の表示について

投稿記事 by 悩める人 » 2017年9月03日(日) 19:17

①:GetInputCharWait関数を二回通す。
②:返されたアルファベットの組み合わせで全角文字に直す。
③:①②を繰り返す。

私にはこれくらいの考えしか浮かびませんでした。
すみません。

DxLibの全角テキスト入力の表示について

投稿記事 by Kinesin » 2017年9月02日(土) 17:34

タイトル通り、DxLibの全角文字入力の表示についてです。

[1] 質問文
 [1.1] 自分が今行いたい事は何か
 日本語の全角文字入力時に1文字ずつ表示させること。
 
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
 inputHandleを宣言し、GetKeyInputStringでchar型配列に格納。
 格納したデータをstring型のcharactorNameに代入する。
 代入した文字列をDrawStringToHandleで表示。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
#include <string>
using namespace std;
 
// Load.h
class Load
{
private:
     int inputHandle;
     char nameBuf[16];
     string charactorName;
     bool nameFlag;
     int white;
     int bodyHandle;
public:
     Load::Load();
     Load::~Load() {}
     void initialize();
     void update();
     void draw();
};


コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// Load.cpp
 
#include "Load.h"
#include "DxLib.h"
#include <string>
#include <fstream>
using namespace std;
 
Load::Load()
     : inputHandle(MakeKeyInput(15, FALSE, FALSE, FALSE))
     , nameFlag(FALSE)
     , white(GetColor(255, 255, 255))
     , bodyHandle(CreateFontToHandle("メイリオ", 20, -1))
{
     charactorName.clear();
}
 
void Load::initialize()
{
     SetActiveKeyInput( inputHandle );
}
 
void Load::update()
{
     if (nameFlag == FALSE)
     {
          GetKeyInputString(nameBuf, inputHandle);
          charactorName = string(nameBuf);
 
          if (CheckKeyInput( inputHandle ) != 0)
          {
               nameFlag = TRUE;
               DeleteKeyInput( inputHandle );
          }
     }
     else
     {
          // 全角テキスト入力後の処理
     }
}
 
void Load::draw()
{
     if (nameFlag == FALSE)
     {
          DrawStringToHandle(80, 380, "↓Please tell me your name, sir.", white, bodyHandle);
          DrawStringToHandle(80, 410, charactorName.c_str(), white, bodyHandle);
     }
     else
     {
          // 全角テキスト入力後の描画処理
     }
}


コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Main.cpp
 
#include "DxLib.h"
#include "Load.h"
 
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
     ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
 
     Load L;
     L.initialize();
     
     while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() ==0)
     {
          L.update();
          L.draw();
          if (CheckHitKey( KEY_INPUT_ESCAPE ) != 0) break;
     }
 
     DxLib_End();
     return 0;
}


 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
 半角入力だと問題ないが、全角入力にすると一度Enterキーを入力しないと文字が表示されない。
 1文字ずつ表示するためには1文字ごとにEnterキーを入力しなければならず、
 誤って2回入力してしまうと誤ったテキスト入力になってしまう。

 [1.4] 今何がわからないのか、知りたいのか
 これが改善可能なのか否か。
 もし、改善不可能な仕様であるならば、他の手段を知りたい。

[2] 環境  
 [2.1] OS : Windows, Linux等々
 >>> OS : Windows10

 [2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
 >>> コンパイラ名(?) : Visual Studio 2017

[3] その他
 ・どの程度C言語を理解しているか
 >>> 初歩の初歩程度ならば理解している。

 ・ライブラリを使っている場合は何を使っているか
 >>> Dxライブラリ

長文、乱文で申し訳ないです。
私自身で見直しはしましたが、伝わりにくいところがあると思うので
そこは聞いていただけるとありがたいです。

なにとぞ、よろしくお願いします。

ページトップ