如何列印豐富編輯控件的內容
本節包含如何列印豐富編輯控件內容的相關信息。
您需要知道的事項
技術
必要條件
- C/C++
- Windows 使用者介面程序設計
指示
使用列印預覽
若要在豐富的編輯控件中格式化文字,因為它會出現在目標裝置上(通常是列印的頁面),請傳送 EM_SETTARGETDEVICE 訊息,將句柄傳入目標裝置的裝置內容和所需的線條寬度。 通常您會呼叫 目標 HDC 的 GetDeviceCaps 來取得線條寬度。
格式化特定裝置的列印
若要格式化特定裝置之豐富編輯控件內容的一部分,請傳送 EM_FORMATRANGE 訊息。 與這個訊息搭配使用的 FORMATRANGE 結構會指定要格式化的文字範圍,以及目標裝置的 HDC。 或者,此訊息也會將文字傳送至印表機。
使用帶狀
帶狀是使用一或多個個別矩形或帶狀來產生單一輸出頁面的程式。 當所有頻帶都放在頁面上時,就會產生完整的影像結果。 點陣印表機通常使用此方法,這些印表機沒有足夠記憶體或一次能夠影像整頁。
若要實作帶狀,請使用 EM_DISPLAYBAND 訊息將豐富編輯控件內容的後續部分傳送至裝置。 此訊息會列印到先前呼叫 EM_FORMATRANGE中指定的裝置。 當然,EM_FORMATRANGE訊息的 wParam 參數應該是零,因此不會由該訊息起始列印。
PrintRTF 程式代碼範例
下列範例程式代碼會將豐富編輯控件的內容列印至指定的印表機。
// 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;
}
相關主題