0

MS Word のように改ページを挿入する方法を知っている人はいますか? テキストを書き、プログラムが新しいページが必要であると判断すると、より大きな区切りと新しいページが挿入されます。

私はこれを MS 開発者フォーラムで質問しましたが、答えがありましRichEditTextBlocksRichEditTextBlockOverflow。ただし、これは複数ページのテキストを読むための良いアドバイスです。そのようなものはありRichTextBoxますか?

C# で Windows ストア アプリのプログラムを作成しています。しかし、この問題に対する手法は、WPF でも WinForms でも同じだと思います。検索しましたが、解決策が見つかりません。

事前にどうもありがとうございました

4

2 に答える 2

0

フロー ドキュメントを探していると思います。私が思い出したように、フロー ドキュメントは、WPF および Winforms の基本的なコントロール ライブラリで何らかの形でサポートされています。

ここに画像の説明を入力

于 2013-05-30T18:46:47.273 に答える
0

ここで同様の質問への回答を確認してください。

MVP はこれを提案しました:

RTB には「改ページ」というものはありません。改ページは、紙に印刷する場合にのみ関係します。Word などのワード プロセッサが必要です。RTB のコンテンツを印刷する方法については、Google EM_FORMATRANGE を参照してください。

そして、この提案はいくつかの票を獲得しました:

richTextBox1.SelectedRtf = @"{\rtf1 \par \page}";

そして、このコードを含むWindows デスクトップ開発者ガイドからの詳細:

次のコード例では、リッチ エディット コントロールの内容を指定したプリンターに出力します。

// hwnd is the HWND of the rich edit control.
// hdc is the HDC of the printer. This value can be obtained for the 
// default printer as follows:
//
//     PRINTDLG pd = { sizeof(pd) };
//     pd.Flags = PD_RETURNDC | PD_RETURNDEFAULT;
//
//     if (PrintDlg(&pd))
//     {
//        HDC hdc = pd.hDC;
//        ...
//     }

BOOL PrintRTF(HWND hwnd, HDC hdc)
{
    DOCINFO di = { sizeof(di) };

    if (!StartDoc(hdc, &di))
    {
        return FALSE;
    }

    int cxPhysOffset = GetDeviceCaps(hdc, PHYSICALOFFSETX);
    int cyPhysOffset = GetDeviceCaps(hdc, PHYSICALOFFSETY);

    int cxPhys = GetDeviceCaps(hdc, PHYSICALWIDTH);
    int cyPhys = GetDeviceCaps(hdc, PHYSICALHEIGHT);

    // Create "print preview". 
    SendMessage(hwnd, EM_SETTARGETDEVICE, (WPARAM)hdc, cxPhys/2);

    FORMATRANGE fr;

    fr.hdc       = hdc;
    fr.hdcTarget = hdc;

    // Set page rect to physical page size in twips.
    fr.rcPage.top    = 0;  
    fr.rcPage.left   = 0;  
    fr.rcPage.right  = MulDiv(cxPhys, 1440, GetDeviceCaps(hDC, LOGPIXELSX));  
    fr.rcPage.bottom = MulDiv(cyPhys, 1440, GetDeviceCaps(hDC, LOGPIXELSY)); 

    // Set the rendering rectangle to the pintable area of the page.
    fr.rc.left   = cxPhysOffset;
    fr.rc.right  = cxPhysOffset + cxPhys;
    fr.rc.top    = cyPhysOffset;
    fr.rc.bottom = cyPhysOffset + cyPhys;

    SendMessage(hwnd, EM_SETSEL, 0, (LPARAM)-1);          // Select the entire contents.
    SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&fr.chrg);  // Get the selection into a CHARRANGE.

    BOOL fSuccess = TRUE;

    // Use GDI to print successive pages.
    while (fr.chrg.cpMin < fr.chrg.cpMax && fSuccess) 
    {
        fSuccess = StartPage(hdc) > 0;

        if (!fSuccess) break;

        int cpMin = SendMessage(hwnd, EM_FORMATRANGE, TRUE, (LPARAM)&fr);

        if (cpMin <= fr.chrg.cpMin) 
        {
            fSuccess = FALSE;
            break;
        }

        fr.chrg.cpMin = cpMin;
        fSuccess = EndPage(hdc) > 0;
    }

    SendMessage(hwnd, EM_FORMATRANGE, FALSE, 0);

    if (fSuccess)
    {
        EndDoc(hdc);
    } 

    else 

    {
        AbortDoc(hdc);
    }

    return fSuccess;

}
于 2013-05-30T18:51:20.120 に答える