unicows.dll

で検索してくる人があまりにも多いのでちょっとした 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 文字だと不安かもしれませんが、そこんところは必要に応じて書きかえてくださいませ。