none
MFC Wordファイルの書き出しでRangeオブジェクトのPhoneticGuideメソッドを複数使うと上手く動かない

    質問

  • VisualStudio2010 C++MFCでソフトを開発しております。

    データをWordファイルで出力しているのですが、複数個所にルビを付けるため、Range.Selectした後Range.PhoneticGuideの設定を複数行うと、2つ目以降がと上手く動きません。
    具体的には RangeオブジェクトのPhoneticGuideメソッドを使った後Range.Selectして属性を変更しても属性が変更されてません。2つ目のRange.Selectが動いてないように思えます。

    ターゲットOfficeは2010ですが、2013でも同様に発生しました。
    (それ以降は所持してないのと、要件はOffice2010からなので最近のOfficeでは試していません)

    この問題の回避方法をご教授お願い致します。

    添付のソースはテスト用に必要部分を抜き出したものです。
    PhoneticGuideの行をコメントアウトすると、 ItalicやBoldは2か所とも上手く設定できますが、PhoneticGuideを使うと1つ目の選択領域(0~2文字目)はItalic/Bold/ルビがうまく設定されてますが、2つ名の選択領域(6~8文字目)はItalic/Bold/ルビが何も設定できません。 

    みなさんよろしくお願いします

    #import "??\microsoft shared\OFFICE14\mso.dll" // フルパスは消しています
    #import "??\Microsoft Shared\VBA\VBA6\VBE6EXT.olb"
    #import "??\Microsoft Office\Office14\msword.olb"
    using namespace Word;

    void CTestApp::OnTest() { Word::_ApplicationPtr wordApp; CComPtr<Word::_Document> wordDoc; CComPtr<Documents> docs; CoInitialize(NULL); wordApp.CreateInstance(L"Word.Application"); wordApp->get_Documents(&docs); TCHAR Buffer[MAX_PATH]; DWORD dwRet; dwRet = GetCurrentDirectory(MAX_PATH, Buffer); CString csMessage = Buffer; csMessage+=L"\\template.dotx"; // Home path + template name. int retVal = PathFileExists(csMessage); if(retVal == 0) { exit(0); } COleVariant tmpVariant( csMessage ); VARIANT variant = tmpVariant.Detach(); wordDoc = docs->Add(&variant); CComPtr<Word::Range> pRange; pRange = wordDoc->Range(); CString strTest = _T("0123456789"); pRange->Text = bstr_t( strTest ); // 1つ目 pRange->SetRange( 0, 2 ); pRange->Select(); pRange->Italic = TRUE; pRange->Bold = TRUE; pRange->PhoneticGuide( _T("ルビ1"), Word::wdPhoneticGuideAlignmentLeft, 0, 0, _T("") ); // 2つ目 pRange->SetRange( 6, 8 ); pRange->Select(); pRange->Italic = TRUE; pRange->Bold = TRUE; pRange->PhoneticGuide( _T("ルビ2"), Word::wdPhoneticGuideAlignmentLeft, 0, 0, _T("") ); COleVariant objVariant( _T("c:\\tmp\\test.docx") ); variant = objVariant.Detach(); wordDoc->SaveAs(&variant); ::VariantClear( &variant ); wordDoc->Close(); CoUninitialize(); }









    2018年1月23日 1:44

回答

  • 自己Resです。

    Renge → PhoneticGuide → Renge → PhoneticGuideでは上手く行かないので
    初めにルビを付ける部分のRageを全部確保して、あとからPhoneticGuideやその他の属性を付けると
    上手く行く事が分かりました。

    こうゆう方法じゃないとダメ という決まり事があるのでしょうか?

    // これだと2目のルビも属性も正しく書き出せる  CComPtr<Word::Range> pRange;
     pRange = wordDoc->Range();
     CString strTest = _T("ABCDEFGHIJKLMNOP0123456789あいうえおかきくけこさしうせそABCDEFGHIJKLMNOP");
    pRange->Text = bstr_t( strTest );

    CComVariant from(1); CComVariant to(4); CComVariant from2(6); CComVariant to2(8); CComPtr<Word::Range> pRange1 = wordDoc->Range( &from, &to ); CComPtr<Word::Range> pRange2 = wordDoc->Range( &from2, &to2 ); // 1つ目 pRange1->Italic = TRUE; pRange1->Bold = TRUE; pRange1->PhoneticGuide( _T("ルビ1"), Word::wdPhoneticGuideAlignmentLeft, 0, 0, _T("") ); // 2つ目 pRange2->Italic = TRUE; pRange2->Bold = TRUE; pRange2->PhoneticGuide( _T("ルビ2"), Word::wdPhoneticGuideAlignmentLeft, 0, 0, _T("") );

     

    2018年1月25日 4:35