で検索してくる人があまりにも多いのでちょっとした TIPS を紹介。
Win9x/me でも使えるUNICODE 対応のエディットボックスが欲しければ richedit コントロールを使わなきゃいけないんだけど、richedit コントロールだと CString との同期に UpdateData が使えないという不便さが残る。
そこで、UpdateData で CString との同期ができるようにする TIPS を紹介します。
.cpp ファイルに下記を書いておく。
void AFXAPI DDX_TextUni(CDataExchange* pDX, int nIDC, CString& value) { HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC); if (pDX->m_bSaveAndValidate) { HGetWStringRiched( hWndCtrl, value.GetBufferSetLength(1024), 1024 ); value.ReleaseBuffer(); } else { HSetWStringRiched( hWndCtrl, value ); } }
.h ファイルに下記を書いておく。
/** * 指定されたリッチエディットコントロールに、UNICODE 文字列を設定する。 * * @param hRiched_ リッチエディットコントロールのハンドル * @return 設定した UNICODE 文字数(バイト数ではないので注意) */ inline unsigned int HSetWStringRiched( HWND hRiched_, TCHAR* setstr_ ) { SETTEXTEX stex; stex.flags = ST_DEFAULT; stex.codepage = 1200; // UNICODE return unsigned int( ::SendMessage( hRiched_, EM_SETTEXTEX, (WPARAM)&stex, (LPARAM)setstr_ ) ); } /** * 指定されたリッチエディットコントロールから、UNICODE 文字列を取得する。 * * @param hRiched_ リッチエディットコントロールのハンドル * @param obuf_ 取得先バッファ * @param cb_ obuf_ のバイトサイズ * @return 取得した UNICODE 文字数(バイト数ではないので注意) */ inline unsigned int HGetWStringRiched( HWND hRiched_, TCHAR* obuf_, DWORD cb_ ) { GETTEXTEX gtex; gtex.cb = cb_; gtex.flags = GT_USECRLF; // 改行コード変換なし(改行コードは CR のみ) gtex.codepage = 1200; // UNICODE gtex.lpDefaultChar = NULL; // 1200 なので未使用 gtex.lpUsedDefChar = NULL; // 1200 なので未使用 return unsigned int( ::SendMessage( hRiched_, EM_GETTEXTEX, (WPARAM)>ex, (LPARAM)obuf_ ) ); } void AFXAPI DDX_TextUni(CDataExchange* pDX, int nIDC, CString& value);
そして、CString との同期をしたい変数に対してこんなコードを書く。
void CTransDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); ... DDX_TextUni(pDX, IDC_INPUT_EDIT, m_strInput); ... }
おっと PSS で使ってるコードだ。
これで、
m_strInput = _T("ゆにこーどだよ"); UpdateData( FALSE );
なんてことができるようになります。便利ですよね?ね??
1024 文字だと不安かもしれませんが、そこんところは必要に応じて書きかえてくださいませ。