MFCでリッチエディットからUnicode文字列を受け取る方法

このQ&Aのポイント
  • MFCのダイアログベースでプロジェクトを作成し、Unicode文字セットを使用する設定を行います。
  • リッチエディット2.0にUnicode文字を入力しても文字化けする問題が発生し、正常に受け取る方法を探しています。
  • エディットボックスではUnicode文字を受け取ることができるが、リッチエディット2.0では文字化けが発生します。解決方法を教えてください。
回答を見る
  • ベストアンサー

MFC:リッチエディットからUnicode文字列を受け取りたい

MFCのダイアログベースでプロジェクトを作成 ↓ プロジェクトのプロパティで「マルチバイト文字セットを使用する」を「Unicode文字セットを使用する」に変更 ↓ エディットボックスとリッチエディット2.0を適当に配置 ↓ エディットボックスとリッチエディット2.0それぞれにコントロール変数を追加 ↓ InitInstance()内に AfxInitRichEdit2(); を追加 ↓ あとは適当なところでエディットボックスとリッチエディット2.0それぞれにGetWindowText関数を使って、記入内容を取得します。     すると、エディットボックスではUnicodeの文字を入れても文字化けしないのに対し、リッチエディット2.0では文字化けしてしまいます。 例えば“Å”の半角文字を(Unicode紹介サイトからコピペする等して)入力すると、エディットボックスではそのまま“Å”なのに、リッチエディット2.0では“A”になります。   ※入力している段階では“Å”と表示されています。GetWindowText関数で取得すると“A”になってしまいます。     リッチエディット2.0からUnicode文字を正常に受け取れる方法はありませんでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
noname#75489
noname#75489
回答No.1

おそらく、フォントがUnicode1.1に対応していないのだと思います。 ダイアログのフォントに「Arial Unicode MS」などを指定すれば表示されるようになると思います。

参考URL:
http://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF
jeddom
質問者

お礼

ご回答ありがとうございます。また、お礼が遅れて申し訳ありません。   実は自己解決していたのですが、回答者がいない状態では質問を締め切れず、また「自分と同じ悩みを抱えた人がいるかもしれない」という思いから、記事を削除することもできず、半放置状態でした。   以下の方法で解決しました。   //----------------ダイアログの.cppに追加 void AFXAPI CMainDlg::DDX_TextUni(CDataExchange* pDX, int nIDC, CString& value) {  HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);  if(pDX->m_bSaveAndValidate){   GETTEXTEX gtex;   gtex.cb = 1024;   gtex.flags = GT_USECRLF; // 改行コード変換なし(改行コードは CR のみ)   gtex.codepage = 1200; // UNICODE   gtex.lpDefaultChar = NULL; // 1200 なので未使用   gtex.lpUsedDefChar = NULL; // 1200 なので未使用   ::SendMessage( hWndCtrl, EM_GETTEXTEX, (WPARAM)&gtex, (LPARAM)value.GetBufferSetLength(1024) );   value.ReleaseBuffer();  }else{   SETTEXTEX stex;   stex.flags = ST_DEFAULT;   stex.codepage = 1200; // UNICODE   ::SendMessage( hWndCtrl, EM_SETTEXTEX, (WPARAM)&stex, (LPARAM)value.GetBuffer() );  } }   void CMainDlg::DoDataExchange(CDataExchange* pDX) {  CDialog::DoDataExchange(pDX);  (中略)  DDX_TextUni(pDX, IDC_RICHEDIT, m_RichEditVal); //リッチエディットに割り当てた値変数 }   //----------------ダイアログの.hに追加 void AFXAPI DDX_TextUni(CDataExchange* pDX, int nIDC, CString& value);   参考URL:http://d.hatena.ne.jp/halts/20030805   要は、コードページを1200(UNICODE)に設定して、DDXでそれを知らせてやる必要があったわけです。 わざわざご回答いただいたのに失礼かとは思いますが、これにて質問を締め切らせていただきます。

関連するQ&A

  • エディットコントロールへのUnicodeの入力

    VisualStudio2005 C++、マルチバイト文字セットでWindowsアプリ ケーションを作っています。動作環境は、WindowsXP SP3 (x86)。 モーダルダイアログに貼り付けたエディットコントロールでは、 MicrosoftIMEStandard2002で変換確定した文字(例えばハート (U+2665))が表示されるので、GetWindowTextW()でそのユニコード 文字列を取得できるのですが、 モードレスダイアログに貼り付けたエディットコントロールでは、 変換文字列が'?'にコンバートされて表示されてしまいます。 コピー&ペーストでは、Unicode文字も表示できるので、 IMEの変換後の処理がうまくいっていないと思うのですが、 どのようにすれば、変換確定しても'?'にコンバートされずに 文字列が表示できますでしょうか? お教えください。よろしくお願いします。 (むかしつくったアプリのため、Unicodeでビルドするには 修正が多いので、マルチバイトのビルドでやりくりしたいのです。)

  • エディットボックスに入力されている文字列が、スペースだけで構成されているかどうか。

    VC++6.0・Win32APIを用いて、ウィンドウズアプリケーションを作成しています。 エディットボックスに入力されている文字列が、スペース(全角スペース又は半角スペース)のみ (それらの組み合わせでも構わない)で構成されているかどうかを判別するアルゴリズムを教えてください。 ヒントでも構いません。 エディットボックスの作成や、そこからの文字列の取得については理解しています。 あっ、でもよく考えてみたらエディットボックスかどうかは関係ないですね(^_^;) 『ある文字列が・・・』で十分ですね。 お手数をお掛けしますが、よろしくお願いいたします。

  • C言語win32api、エディットボックスから文字列を取得しメッセージ

    C言語win32api、エディットボックスから文字列を取得しメッセージボックスへ出力 質問1 エディットボックスからフォーカスが外れると その中の文字列を取得しメッセージボックスに出力したいのですが 思った通りに出力されません。 フォーカスが外れるとメッセージボックス自体は出てくるのですが エディットボックスに入力した文字列が出力されません。 いろいろ試したんですが文字化けしたり文字列自体が表示されなかったします。 取得と出力の方法を教えていただけませんでしょうか。 kwt[3]=CreateWindowEx(WS_EX_CLIENTEDGE,TEXT("EDIT"), NULL , WS_CHILD | WS_VISIBLE | WS_BORDER |ES_LEFT | ES_AUTOHSCROLL , 90 , 85 , 110 , 25 , hAdd ,(HMENU)EDIT_ID02 ,((LPCREATESTRUCT)(lp))->hInstance , NULL); LPSTR testtex=NULL; LRESULT CALLBACK SubProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { LPSTR testtex=NULL; switch(msg) { case WM_COMMAND: switch(LOWORD(wp)) { case EDIT_ID02: if(HIWORD(wp)==EN_KILLFOCUS) //フォーカスが外れたら次の処理をする。 { strText = (LPSTR)malloc(GetWindowTextLength(hwnd) + 2); //文字数分のメモリを確保 if(testtex) //testtexがゼロでなければ次の処理をする { GetWindowText(hwnd , testtex , GetWindowTextLength(hwnd) + 2); //エディットのテキストを取得。問題個所 MessageBox(hwnd , testtex , TEXT("") , MB_OK); //取得したテキストをメッセージボックスで出力。問題個所 } free(strText); //メモリを解放 return 0; } return 0; } return 0; } return (CallWindowProc(SubP1, hWnd, msg, wp, lp)); } 質問2 エディットボックスに0~9と「.」(ドット)のみを入力できるようにしたいのですが ウインドウスタイルでES_NUMBERを指定すると「.」が入力できなくなってしまいます。 どのように回避したらいいのでしょうか。 質問3 win32apiとは直接関係ありませんが、たとえば計算結果が1000億を超えるような場合 int型とかの変数ではとても入りきれません。 こういった場合どのようにするのでしょう。

  • Win32Apiで書式付リッチエディットの内容をコピーしたい。

    Win32Api(MFCやCLRではない)で書式付リッチエディットの内容をコピーしたいのですがGetWindowText関数を使い、char型の変数に入れてやると文字色やフォントなどの情報がなくなってしまいます。 このような場合書式付の文字を取得する場合どうすればよろしいでしょうか。

  • StrConvでUnicodeに変換出来ない文字

    エクセルのVBAで、StrConv関数を使用して、文字列をUnicodeに変換しようとしているのですが、特定の文字が変換できません。 解決方法をご存知の方は教えてください。 現象:StrConv("マミムメモ",vbUnicode)で変換すると、ムメモが文字化けしてしまう。 確認方法: MsgBox StrConv(StrConv(InputBox("入力"), vbUnicode), vbFromUnicode) で、InputBoxに"マミムメモ"を入力すると、メッセージボックスに"マミ???"と表示されてしまう。

  • 自作ライブラリとプロジェクトの文字セットによる文字化けについて

    お世話になります。 今回自作ライブラリ内にある、ウインドウ作成補助関数をUnicode、マルチバイト文字両対応にするべく作業を進めていたのですが、ある所でどうしても上手く行かず、どうしたものかと困っております。 概要は下記の通りです。 1. Unicode用関数とマルチバイト用関数は分けれらており、UNICODEマクロの有無によって使用する関数を自動的にわけています。 2. 自作ライブラリをUnicode文字セットでビルドし、ライブラリを使用するプロジェクトをマルチバイト文字セットでビルドした場合、ライブラリ内ウインドウ作成クラスから関数を利用してウインドウを作成すると、どうしてもタイトルバーのタイトルに文字化けが起こってしまう。 以下に要点だけをまとめたソースを記載させていただきます。 文字数の関係で、リンクとなってしまい申し訳ありません。 http://blog-imgs-26.fc2.com/b/a/l/balmysoft/CreateWindow.txt プロジェクトでの使用法は INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow) { CCreateWindow cw; cw.SimpleCreateWindow( _T("HelloWorld"), その他いろいろ... ); // その後の処理 // } このような形です。 ライブラリとの文字セットとの違いを考慮し、関数を分けて使い分けているのですが、実際にウインドウが作成されてみると、タイトルバーのタイトルが文字化けをしてしまっています。 また、関数内でもそれぞれの文字セット用の関数を呼び出しているつもりなのですが、これだけでは至らないのでしょうか? もちろんプロジェクト側の文字セットをUnicodeにすれば大丈夫です。 また、ライブラリ側をマルチバイト文字セット、プロジェクト側をUnicodeにすると、先頭の一文字だけがタイトルバーに表示されます。 今回の場合は H  だけとなります。 これはワイド文字だからその通りの結果だと思うのですが、今回疑問に思っているのは。 WindowsAPI である CreateWindowA や CreateWindowW を使い分けても、実際はそのプロジェクトの文字設定によって影響されてしまうのか。 ということです。また、これを避ける手立てはあるのでしょうか? 長くなってしまい、大変申し訳ありません。 もしよろしければ、どなたか御教示頂けませんでしょうか。 宜しくお願い致します。

  • Win32 API エディットボックス内文字列の色変更

    Win32 APIについて質問です。 (Microsoft Visual Studio .NET 2002、XP、API) エディットコントロールに表示されている文字列の 色(またはフォント)を変更したいと思っています。 エディットボックスに「0」という数字を入力し その後「更新ボタン」をクリックすると、「0」の 文字色が赤色(または赤太文字)へ変更される という具合です。 Win32 APIを始めて間もない者(Cも始めて間もないです) なので、かなり苦戦しております。 「SendMessage() 」みたいな関数を使用しエディット ボックスのハンドルへメッセージを送ることで 実現させるのかなぁ程度しか理解しておりません。 ご存じの方すいませんがよろしくお願いします。

  • VC++ マルチバイト文字とUniCode文字??

    VC++のプロジェクトプロパティには文字セット指定があります 『マルチバイト文字セット』『UniCode文字セット』の2者が選択出来ますが、これらの選択の優劣は何処にありますか? この選択の適否が分からない私は参考にしているサンプルがマルチバイトである時にはマルチバイトを、またUniCodeで書かれたサンプルを見ている際にはUniCodeを指定しており、恥ずかしいかぎりです 選択の判断基準を如何すれば良いのかご指導をお願い申し上げます 更に恥ずかしい質問】なぜC#には文字セット指定が見当たらないのでしようか???

  • エディットボックスの文字列制限のテストを簡単にする方法はない?

    例えばエディットボックスの文字数が250文字まで。 という仕様のテストですが ”0123456789”という文字列のを繰り返し入力して250文字分入力するのは面倒だし、わかりにくいです。 もっといいテスト方法はありませんでしょうか? ツールなどがあったら最高です。

  • VC++のエディットボックスの非表示

    VC++で、ダイアログを作りました。 エディットボックスを置いているのですが、 このエディットボックスは始めは非表示(入力を受け付けない)にするため、 このエディットボックスのプロパティにある "Disable"をtrueにして"Visible"もtrueにしました。 そこまではよかったのですが、 「入力」ボタンを押すと、エディットボックスが白く表示され、入力を受け付けるというようにしたいのですが、 エディットボックスのプロパティを変更する関数というのはあるのでしょうか? いろいろ検索などをしているのですが、方法がわかりません。よろしくお願いします。

専門家に質問してみよう