1. 程式人生 > >在VC++中直接呼叫API執行列印任務

在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