お世話になっております。
今回は不具合の詳細が自分でもよく分かってないので長文になってしまいます・・・
環境はmsvc2017、dxlib共に最新です。
・起こっている問題(これを問題Aとする)
DrawKeyInputStringで入力中の全角文字(と変換候補)が全く表示されない
例えば、"aaa[全角切替]あああ"と入力すると、aaaしか表示されず、[enter]を押して確定するとちゃんと"aaaあああ"と表示される
要するに、黄色の背景色が絡んで表示される部分が全く表示されません。
ところが、環境によって再現したりしなかったりしてすごく困っています。
サンプルコード(末尾に添付)の実行結果なのですが、
・新規プロジェクトを作ってサンプルコードを実行した場合(32bit,マルチバイト文字):正常に動作する
・既存プロジェクトのint WINAPI WinMain() 直後にサンプルコードを埋め込んだ場合(32bit,マルチバイト文字):問題Aが発生する
となっていて、再現コードに落とそうとした時点でつまづいてしまいました。
私の考えとしては、
(i)int WINAPI WinMain()よりも前に実行されるもの(グローバル変数のコンストラクタとか)が悪さをしている
(ii)コンパイルオプションの違いで再現しない(少なくとも32bit,マルチバイト文字は共通している)
のどちらかだと思いますがよく分かりません・・・
情報が限られていて解決が非常に難しいと思いますが、なにか心当たりはありませんでしょうか?
よろしくお願いします。
サンプルコード:(HPで配布しているものとほぼ同じ)
#include "DxLib.h"
void init() {
ChangeWindowMode(true); //ウインドウモードにする
SetWindowSize(640, 480);
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return; // エラーが起きたら直ちに終了
}
SetDrawScreen(DX_SCREEN_BACK); //描画先を裏画面に設定
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
init();
char String[256];
int InputHandle;
// キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
InputHandle = MakeKeyInput(255, FALSE, FALSE, FALSE);
// 作成したキー入力ハンドルをアクティブにする
SetActiveKeyInput(InputHandle);
// キー入力終了待ちループ
// (ProcessMessageをループごとに行う)
while (!ProcessMessage()) {
// 入力が終了している場合は終了
if (CheckKeyInput(InputHandle) != 0) break;
// 画面の初期化
ClearDrawScreen();
// 入力モードを描画
DrawKeyInputModeString(640, 480);
// 入力途中の文字列を描画
DrawKeyInputString(0, 0, InputHandle);
// 裏画面の内容を表画面に反映させる
ScreenFlip();
}
// 入力された文字列を取得
GetKeyInputString(String, InputHandle);
// 用済みのインプットハンドルを削除する
DeleteKeyInput(InputHandle);
// 画面の初期化
ClearDrawScreen();
// 入力された文字列を画面に表示する
DrawString(0, 0, "あなたが入力した文字列は", GetColor(255, 255, 255));
DrawString(0, 16, String, GetColor(255, 255, 255));
// 裏画面の内容を表画面に反映させる
ScreenFlip();
// キー入力待ち
WaitKey();
// DXライブラリの使用終了
DxLib_End();
// 終了
return 0;
}