在VC++中直接呼叫API執行列印任務
介紹: 這一段程式碼,用以演示《如何在VC++中使用API直接列印》。並且該段程式碼可以直接嵌入各種工程中,有實際使用的價值。
用途:在Visual C++中,應用程式通常是使用CView中提供的列印功能,在OnPrint()或OnDraw()中向印表機輸出。但是對於對話方塊中的資料,或基於對話方塊的程式,列印成了一件繁瑣的工作。該段程式碼向用戶提供了PrintListCtrl()函式,用於列印使用者在對話方塊或FormView中的CListCtrl(控制元件必須是Report View 形式的)控制元件中的內容。在列印過程中,根據控制元件中每列標題的寬度計算列印輸出時各列的寬度,並根據資料的行數自動分頁。在本程式碼的基礎上稍作修改,就可以適應各種資料的輸出。
用法:該段程式碼使用Visual C++ 6.0, 使用Windows API來完成所需功能,使用時將本文字作為標頭檔案使用。列印時直接呼叫PrintListCtrl(),函式的引數為所要列印的ListCtrl。
//該結構用於儲存各列的資訊
typedef struct tagColAtt
{
int nColIndex;
CString strColText;
int nPrintX;
int nSubItemIndex;
}COLATT;
BOOL PrintListCtrl(CListCtrl &list)
{
PRINTDLG pd;
pd.lStructSize = sizeof(PRINTDLG);
pd.Flags = PD_RETURNDC;
pd.hDC = NULL;
pd.hwndOwner = NULL;
pd.hInstance = NULL;
pd.nMaxPage = 1;
pd.nMinPage = 1;
pd.nFromPage = 1;
pd.nToPage = 1;
pd.nCopies = 1;
pd.hDevMode = NULL;
pd.hDevNames = NULL;
//顯示列印對話方塊,由使用者來設定紙張大小等。
if(!PrintDlg(&pd)) return FALSE;
ASSERT(pd.hDC!=NULL);
int nHorRes = GetDeviceCaps(pd.hDC, HORZRES);
int nVerRes = GetDeviceCaps(pd.hDC, VERTRES);
int nXMargin = 2;
int nYMargin = 2;
TEXTMETRIC tm;
GetTextMetrics(pd.hDC, &tm);
int nCharHeight = tm.tmHeight;
int nCharWidth = tm.tmAveCharWidth;
CHeaderCtrl* pHeader = list.GetHeaderCtrl();
//獲得行,列的個數
int nColCount = pHeader->GetItemCount();
int nLineCount = list.GetItemCount();
int ColOrderArray[100];
COLATT ca[100];
list.GetColumnOrderArray(ColOrderArray, nColCount);
int nColX =nXMargin*nCharWidth;
//檢索各列的資訊,確定列標題的內容長度。
for(int i =0 ; i< nColCount; i++)
{
ca[i].nColIndex = ColOrderArray[i];
LVCOLUMN lvc;
char text[100];
lvc.mask = LVCF_TEXT|LVCF_SUBITEM;
lvc.pszText = text;
lvc.cchTextMax = 100;
list.GetColumn(ca[i].nColIndex, &lvc);
ca[i].strColText = lvc.pszText;
ca[i].nSubItemIndex = lvc.iSubItem;
ca[i].nPrintX = nColX;
nColX += nCharWidth * strlen(ca[i].strColText);
if(nColX > nHorRes)
{
DeleteDC(pd.hDC);
AfxMessageBox("欄位太多,無法單行列印,用較大的紙,或橫向列印。");
return FALSE;
}
}
DOCINFO di;
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "ListCtrl Data Printing";
di.lpszOutput = (LPTSTR) NULL;
di.lpszDatatype = (LPTSTR) NULL;
di.fwType = 0;
StartDoc(pd.hDC, &di);
StartPage(pd.hDC);
//調整各列的寬度,以使各列在後面的列印輸出時更均勻的列印在紙上。
int space = (nHorRes-nXMargin*nCharWidth-nColX) / (nColCount -1);
for(i =1; i<nColCount; i++)
{
ca[i].nPrintX += i*space;
}
//輸出列標題
for(i =0; i<nColCount; i++)
TextOut(pd.hDC, ca[i].nPrintX, nYMargin,
ca[i].strColText, strlen(ca[i].strColText));
int nMaxLinePerPage = nVerRes/nCharHeight -3;
int nCurPage =1;
//輸出各列的資料
for(i =0; i<nLineCount; i++)
{
for(int j =0; j<nColCount; j++)
{
if(i+1-(nCurPage-1)*nMaxLinePerPage > nMaxLinePerPage)
{
//新的一頁
EndPage(pd.hDC);
StartPage(pd.hDC);
nCurPage ++;
}
CString subitem = list.GetItemText(i, ca[j].nSubItemIndex);
TextOut(pd.hDC, ca[j].nPrintX,
nYMargin+(i+1-(nCurPage-1)*nMaxLinePerPage)*nCharHeight,
subitem, strlen(subitem));
}
}
EndPage(pd.hDC);
EndDoc(pd.hDC);
//列印結束
DeleteDC(pd.hDC);
return TRUE;
}
轉自:http://wenku.baidu.com/view/3f555b260722192e4536f641.html
相關推薦
在VC++中直接呼叫API執行列印任務
介紹: 這一段程式碼,用以演示《如何在VC++中使用API直接列印》。並且該段程式碼可以直接嵌入各種工程中,有實際使用的價值。 用途:在Visual C++中,應用程式通常是使用CView中提供的列印功能,在OnPrint()或OnDraw()中向印表機輸出。但是對於對話方塊中的資料,或基於對話方塊的程式,
JDBC工具類(JDBC工具類,封裝方法(公共的、靜態的)進行與資料庫的連線及執行sql命令,在需要使用的類中直接呼叫。)
JDBC工具類,封裝方法(公共的、靜態的)進行與資料庫的連線及執行sql命令,在需要使用的類中直接呼叫。 package com.offcn.util; import java.io.IOException; import java.io.InputStrea
VC中如何呼叫其他的可執行程式
Q: 如何開啟一個應用程式 ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW ); 或 ShellExecute(this->m_hWnd,"open","notepad.exe","c:\\MyLog.log","",SW_SH
java直接呼叫並執行sql指令碼
直接上程式碼 package com.qfx.test; import java.io.File; import java.io.FileReader; import java.io.Reader; import java.nio.charset.Charset; import java.sql
java中直接呼叫groovy的類.
how directly call groovy class in java 如何在java中呼叫groovy的類. java和groovy如何互動,傳送資料. 類似: java 呼叫 python http://www.cnblogs.com/lmyhao/p/336
alpine linux中如何使用crontab執行定時任務
首先alpine內嵌的是BusyBox,使用alpine的crontab實際就是使用BusyBox的crond服務,那麼下來就簡單介紹下如何使用吧,網上教程還是比較多的: 配置檔案存放位置: 配
在Solaris 10中設定開機自動執行的任務
進入對應目錄: # cd /etc/rc3.d 建立一個S??(S開頭加兩位數字)的獨立檔案,把許可權chmod 744,檔案賬戶屬性chown root:sys,然後在檔案中輸入相應內容: # vi S88dhcpv6 ifconfig e1000g
node+ejs【封裝ejs模板中直接呼叫js方法】
封裝全域性函式 var myFunction = {}; /* * 字串擷取 * @str 擷取字串 * @start 開始擷取位置 * @end 結束擷取位置 */ myFu
Android中如何實現後臺執行定時任務
Android中的定時任務一般有兩種實現方式,一種是使用Java API裡的Timer類,另一種是使用Android的Alarm機制。 這兩種方式在多數情況下都能實現類似的效果,但Timer有一個明顯的短板,它並不太適用與那些需要長期在後臺執行的定時任務。As
7zip壓縮與解壓縮在vc++中的呼叫方法例子
最近在做關於壓縮與解壓縮的程式,在網上找了很長時間,很多的文章都很難理解,經過大半天的嘗試終於找到一種解決辦法,現在以其中的一種壓縮和解壓縮的方式的例子給大家呈現: 首先要有7zip的可執行檔案7z.exe,假設已經將該可執行檔案放自己的專案目錄下,即和自己的可執行檔案放
頁面直接呼叫印表機,列印pdf檔案
<div id="pdf"> </div> var pdfForm = document.getElementById("pdf"); 說明:doPrint是一個數組,裡面
在 Android 系統中直接呼叫 SO檔案(包含System.loadLibrary載入so的路徑解釋)
Android虛擬機器不能直接呼叫底層裝置,如果要對底層裝置進行呼叫,就需要用到so使用 C語言或C++編寫完成,利用NDK進行編譯,直接執行在Linux核心中,按jni呼叫 so時,基本型別可以直接互動。 在 apk裡打包進.so檔案的方法有兩種,一 是在 Androi
在VC中所見即所得列印的簡易實現
在VC++6.0中用應用程式嚮導(AppWizard)生成的單文件或多文件程式提供了對列印功能的實現,但遺憾的是如果對自動生成的框架程式不做任何改進,打印出來的文件或圖形和螢幕上的顯示相比就會特別小。為什麼會這樣呢? 本文對這種現象的原因和MFC的列印機制進行了深入的分
呼叫一個方法,直接實現多執行緒執行任務
import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.concurrent.LinkedBlockingQueue; import ja
在kettle中使用java直接呼叫transformation、job檔案執行
目前在做一個專案,需要用到資料清洗,因為kettle是開源的,所以就選擇了它。目前遇到的困難是,在建立好轉換(transformation)或任務(job)後,需要整合到java程式碼中,以便和其他功能
關於Java Web 使用Spring中使用Quartz(定時呼叫、實現固定時間執行), 觸發定時器(執行某些任務)的例項
第一步:pom.xml中Maven下載需要的jar架包。 <!--```````````定時器```````````--> <dependency> <grou
SpringTask執行定時任務中呼叫方法中斷問題
背景 使用SpringQuartz輕量級定時任務時,出現任務中的方法呼叫鏈未執行完,也未丟擲異常,然後到下一次時間就繼續執行下一次的任務。剛開始時百度一下,以為是執行緒阻塞、併發設定等(預設是併
執行緒中更新視窗不能直接呼叫UpdateData函式 的解決辦法
李群會回覆於15日21點16分 LRESULT OnUpdateData(WPARAM wParam, LPARAM lParam);加到你的標頭檔案中去 tonygesong回覆於15日21點31分 1.自定義訊息: #define WM_UPDATEDA
activiti學習--13:組任務分配方式1直接方式+查詢正在執行的任務辦理人表+查詢歷史任務的辦理人表+拾取任務+將個人任務回退到組任務+向組任務中新增/刪除成員
組任務及三種分配方式: 1:在taskProcess.bpmn中直接寫 candidate-users=“a,b,c,d” 2:在taskProcess.bpmn中寫 candidate-users =“#{userIDs}”,變數的值要是S
ubuntu中執行定時任務crontab
img bsp etc 可能 exp reload 檔案 多個 命令行 今天研究了下ubuntu裏的crontab內置指令。這是設置定時執行腳本任務的指令,我先測試了下最基礎的執行。 第一次使用crontab 時,會出現 no crontab for root - usin