第10章 打印、動(dòng)態(tài)鏈接庫及多線程技術(shù)_第1頁
第10章 打印、動(dòng)態(tài)鏈接庫及多線程技術(shù)_第2頁
第10章 打印、動(dòng)態(tài)鏈接庫及多線程技術(shù)_第3頁
第10章 打印、動(dòng)態(tài)鏈接庫及多線程技術(shù)_第4頁
第10章 打印、動(dòng)態(tài)鏈接庫及多線程技術(shù)_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第10章打印、動(dòng)態(tài)鏈接庫及多線程技術(shù)10.1打印

術(shù)MFC通過CView類為應(yīng)用程序提供打印及打印預(yù)覽的功能。10.1.1映射模式與坐標(biāo)系統(tǒng)1.固定比率與可變比率映射模式映射模式的比率可分為固定比率和可變比率。(1)“固定比率”映射模式“固定比率”映射模式包含以下映射模式:MM_LOMETRICMM_HIMETRICMM_LOENGLISHMM_HIENGLISHMM_TWIPS(2)“可變比率”映射模式“可變比率”映射模式包括MM_ANISOTROPIC和MM_ISOTROPIC兩種映射模式。MM_ISOTROPIC映射模式:該映射模式在X軸和Y軸使用相同的單位長度,X和Y始終保持1∶1比率,所以對(duì)保留圖形的形狀非常有用,如在屏幕上畫了一個(gè)圓形,無論比例因子如何改變,始終還是圓形。MM_ANISOTROPIC映射模式:該映射模式允許改變X和Y的比率為任意值,如在屏幕上畫了一個(gè)圓形,當(dāng)比例因子改變后,圓形會(huì)變成橢圓形??梢杂孟旅娴墓綄?shí)現(xiàn)邏輯單位到設(shè)備單位的轉(zhuǎn)換。X比例因子=X視口長度/X窗口長度。Y比例因子=Y視口長度/Y窗口長度。設(shè)備X=邏輯X×X比例因子+X原點(diǎn)偏移量。設(shè)備Y=邏輯Y×Y比例因子+Y原點(diǎn)偏移量。2.MM_TEXT映射模式MM_TEXT映射模式又稱為文本映射模式,是系統(tǒng)默認(rèn)使用的映射模式,每個(gè)邏輯單位映射為一個(gè)設(shè)備像素,所以在邏輯坐標(biāo)和設(shè)備坐標(biāo)之間不存在任何的縮放。3.設(shè)置邏輯與設(shè)備坐標(biāo)設(shè)備環(huán)境本身提供了一些函數(shù)實(shí)現(xiàn)邏輯坐標(biāo)和設(shè)備坐標(biāo)間的互換。(1)DPtoHIMETRIC函數(shù):用于將設(shè)備坐標(biāo)單位轉(zhuǎn)換為HIMETRIC坐標(biāo)單位,該函數(shù)以像素為單位進(jìn)行轉(zhuǎn)換。語法:voidDPtoHIMETRIC(LPSIZElpSize)const;(2)DptoLP函數(shù):可以接受一個(gè)指向CPoint類或者CRect類對(duì)象的指針作為參數(shù),然后把它所指向的對(duì)象從設(shè)備單位轉(zhuǎn)換為邏輯單位。語法:voidDPtoLP(LPPOINTlpPoints,int

nCount=1)const;voidDPtoLP(LPRECTlpRect)const;voidDPtoLP(LPSIZElpSize)const;(3)HIMETRICtoDP函數(shù):將HIMETRIC單位轉(zhuǎn)換為設(shè)備單位,該函數(shù)以像素為單位進(jìn)行轉(zhuǎn)換。語法:voidHIMETRICtoDP(LPSIZElpSize)const;(4)HIMETRICtoLP函數(shù):將HIMETRIC單位轉(zhuǎn)換為邏輯單位,該函數(shù)以像素為單位進(jìn)行轉(zhuǎn)換。語法:voidHIMETRICtoLP(LPSIZElpSize)const;(5)LptoDP函數(shù):將邏輯單位轉(zhuǎn)換為設(shè)備單位。該函數(shù)以點(diǎn)為單位進(jìn)行轉(zhuǎn)換。語法:voidLPtoDP(LPPOINTlpPoints,int

nCount=1)const;voidLPtoDP(LPRECTlpRect)const;voidLPtoDP(LPSIZElpSize)const;(6)LPtoHIMETRIC函數(shù):將邏輯單位轉(zhuǎn)換為HIMETRIC單位,該函數(shù)以像素為單位進(jìn)行轉(zhuǎn)換。語法:voidLPToHIMETRIC(LPSIZElpSize)const;10.1.2打印控制1.獲取打印紙的左邊距和上邊距首先通過GetDevMode()函數(shù)獲取DEVMODE結(jié)構(gòu),通過DEVMODE結(jié)構(gòu)的成員變量可以自定義打印紙的大小。2.控制打印方向在打印時(shí)經(jīng)常會(huì)遇到這樣的問題,待打印的數(shù)據(jù)超出了打印紙的寬度,導(dǎo)致在打印時(shí)只有部分?jǐn)?shù)據(jù)被打印出來。通??梢杂袃煞N方式解決,一種是折行打印,另一種是橫向打印。3.設(shè)置打印紙大小Windows系統(tǒng)中提供了許多規(guī)格的打印紙,但實(shí)際應(yīng)用中,這些規(guī)格的紙張并不能滿足需求,因此,在設(shè)計(jì)程序時(shí),需要自定義紙張的大小。4.設(shè)置打印份數(shù)

CPrintDialog封裝了一個(gè)PRINTDLG結(jié)構(gòu)的變量,保存了該對(duì)話框的所有信息。該結(jié)構(gòu)的主要成員如下:typedef

struct

tagPD{DWORDlStructSize; HWNDhwndOwner;HANDLEhDevMode;HANDLEhDevNames;HDChDC;

DWORDFlags;WORDnFromPage;

WORDnToPage;WORDnMinPage;WORDnMaxPage; WORDnCopies;HINSTANCEhInstance;DWORDlCustData;LPPRINTHOOKPROClpfnPrintHook;LPSETUPHOOKPROClpfnSetupHook;LPCTSTRlpPrintTemplateName;LPCTSTRlpSetupTemplateName;HANDLEhPrintTemplate;HANDLEhSetupTemplate;}PRINTDLG;10.1.3打印實(shí)例1.設(shè)計(jì)報(bào)表打印程序通過CPrintDialog對(duì)話框封裝的成員函數(shù)可以對(duì)打印機(jī)的設(shè)備環(huán)境進(jìn)行設(shè)置。2.設(shè)計(jì)單據(jù)打印報(bào)表通過CPrintDialog對(duì)話框封裝的成員函數(shù)可以對(duì)打印機(jī)的設(shè)備環(huán)境進(jìn)行設(shè)置,然后通過打印機(jī)DC將要打印的內(nèi)容繪制到打印紙上。10.2動(dòng)態(tài)鏈接庫技術(shù)10.2.1鏈接庫概述1.鏈接庫的構(gòu)成DLL是動(dòng)態(tài)鏈接庫(DynamicLinkableLibrary)的簡稱。DLL的結(jié)構(gòu)和應(yīng)用程序很相近,每個(gè)應(yīng)用程序都有一個(gè)入口函數(shù)WinMain,而每個(gè)DLL也有一個(gè)入口函數(shù)DllMain;應(yīng)用程序中含有資源,而DLL中也含有資源;應(yīng)用程序中含有數(shù)據(jù)段和代碼段,DLL中也有數(shù)據(jù)段和代碼段。DLL可以像應(yīng)用程序一樣使用回調(diào)(CALLBACK)函數(shù),也可以使用自定義消息。DLL中必須有一個(gè)入口函數(shù)DllMain,它的主要框架如下。BOOLAPIENTRYDllMain(HANDLE

hModule, //動(dòng)態(tài)庫被調(diào)用時(shí)一個(gè)指向自己的句柄

DWORDul_reason_for_call,//動(dòng)態(tài)庫被調(diào)用原因的標(biāo)志

LPVOIDlpReserved//系統(tǒng)所保留{switch(ul_reason_for_call){

caseDLL_PROCESS_ATTACH: //進(jìn)程被調(diào)用

caseDLL_THREAD_ATTACH: //線程被調(diào)用

caseDLL_THREAD_DETACH: //進(jìn)程被停止

caseDLL_PROCESS_DETACH: //線程被停止

returnTRUE;}}2.動(dòng)態(tài)鏈接庫和靜態(tài)鏈接庫(1)靜態(tài)鏈接庫靜態(tài)鏈接庫的英文全稱是StaticLinkLibrary,它經(jīng)常是一些相對(duì)小的,比較穩(wěn)定的函數(shù)庫。(2)動(dòng)態(tài)鏈接庫動(dòng)態(tài)鏈接庫的英文全稱是DynamicLinkLibrary,簡稱DLL。動(dòng)態(tài)鏈接庫可以在需要的時(shí)候動(dòng)態(tài)加載到內(nèi)存中,而且動(dòng)態(tài)鏈接庫在內(nèi)存中只有一個(gè)實(shí)例,如果一個(gè)應(yīng)用程序調(diào)用了DLL,其他應(yīng)用程序也調(diào)用該DLL。那么第2個(gè)應(yīng)用程序只是將DLL在內(nèi)存中的地址映射到自己的進(jìn)程地址空間中;系統(tǒng)中有一個(gè)計(jì)數(shù)器,記錄有多少個(gè)應(yīng)用程序在使用DLL。10.2.2鏈接庫的創(chuàng)建與使用1.通過向?qū)?chuàng)建靜態(tài)鏈接庫VisualC++中提供了創(chuàng)建靜態(tài)鏈接庫的工程向?qū)В\(yùn)行VisualC++菜單“File”/“New”打開New對(duì)話框,如圖10.9所示。圖10.9“New”對(duì)話框

2.使用靜態(tài)鏈接庫要測試上面的靜態(tài)鏈接庫,需要新建一個(gè)MFC對(duì)話框工程,工程名為testDLL,在對(duì)話框上添加編輯框控件、按鈕控件、靜態(tài)文本框控件,設(shè)計(jì)對(duì)話框如圖10.10所示。

圖10.10測試鏈接庫的應(yīng)用程序

可以通過工程設(shè)置對(duì)話框來加入對(duì)靜態(tài)鏈接庫的引用,工程設(shè)置對(duì)話框通過VisualC++的“Project/Settings”菜單來打開。打開工程設(shè)置對(duì)話框,選擇Link選項(xiàng)卡,在“Object/librarymodules”編輯框中輸入需要引用的靜態(tài)鏈接庫文件。本實(shí)例使用StaticLib.lib,如圖10.11所示。圖10.11導(dǎo)入靜態(tài)鏈接庫文件

3.創(chuàng)建Win32動(dòng)態(tài)鏈接庫創(chuàng)建Win32動(dòng)態(tài)鏈接庫,需要使用Win32Dynamic_linkLibrary工程向?qū)?,向?qū)枰脩粼O(shè)置一步,主要是設(shè)置AnemptyDLLproject、AsimpleDLLproject、ADLLthatexportssomesymbols等3種工程類型。AnemptyDLLproject向?qū)?chuàng)建一個(gè)不帶任何文件的空工程。AsimpleDLLproject創(chuàng)建一個(gè)含有3個(gè)文件的工程,分別是帶有DllMain函數(shù)的實(shí)現(xiàn)文件、StdAfx.cpp和StdAfx.h。ADLLthatexportssomesymbols創(chuàng)建一個(gè)可以導(dǎo)出類的鏈接庫工程。10.2.3鏈接庫的導(dǎo)出1.動(dòng)態(tài)鏈接庫的命名改編在創(chuàng)建動(dòng)態(tài)鏈接庫中,為了導(dǎo)出動(dòng)態(tài)鏈接庫中的函數(shù),在函數(shù)定義前增加了extern"C"__declspec(dllexport)語句,其實(shí)只增加__declspec(dllexport)語句就可以導(dǎo)出函數(shù)。但此時(shí)的動(dòng)態(tài)鏈接庫只能進(jìn)行隱式調(diào)用,如果使用動(dòng)態(tài)加載可能會(huì)出錯(cuò),因?yàn)橹皇褂胈_declspec(dllexport)語句,導(dǎo)出的函數(shù)名稱會(huì)發(fā)生變化,使用命令dumpbin-exports查看沒有extern"C"語句生成的DynicDLL.dll文件,此時(shí)導(dǎo)出的函數(shù)名變?yōu)槿缦旅娲a所示的名稱:100000100A?GetMaxCommDiv@@YAHHH@Z2100001005?GetMinCommMul@@YAHHH@Z使用extern"C"語句后名稱不會(huì)發(fā)生改變,如下面的代碼所示:100000100AGetMaxCommDiv2100001005GetMinCommMul2.使用dumpbin工具查看鏈接庫

dumpbin.exe命令可以用來查看動(dòng)態(tài)鏈接庫文件的一些信息。選項(xiàng)描述選項(xiàng)描述/ALL所有信息/OUT:filename輸出文件/DEPENDENTS模塊之間的關(guān)系/PDATA數(shù)據(jù)段信息/EXPORTS查看輸出函數(shù)列表/SECTION:name段信息/HEADERS數(shù)據(jù)段詳細(xì)信息/SUMMARY摘要信息/IMPORTS查看輸入函數(shù)列表/SYMBOLS調(diào)試標(biāo)識(shí)符/LINENUMBERS行號(hào)信息表10.1 常用命令選項(xiàng)3.使用DEF文件導(dǎo)出函數(shù)名稱如果使用DEF文件,就可以不使用extern"C"__declspec(dllexport)來聲明函數(shù)。4.隱式調(diào)用與動(dòng)態(tài)加載通過隱式鏈接,無論是調(diào)用動(dòng)態(tài)鏈接庫還是調(diào)用靜態(tài)鏈接庫,都是在編譯的時(shí)候就對(duì)鏈接庫進(jìn)行鏈接。動(dòng)態(tài)加載主要是通過LoadLibrary和GetProcAddress兩個(gè)函數(shù)來實(shí)現(xiàn)。(1)LoadLibrary用來裝載模塊的函數(shù),動(dòng)態(tài)鏈接庫和可執(zhí)行程序都是模塊,如果函數(shù)執(zhí)行成功,返回模塊句柄,這個(gè)句柄會(huì)在GetProcAddress函數(shù)中使用。語法:HINSTANCELoadLibrary(LPCTSTRlpLibFileName);(2)GetProcAddress獲得模塊中的函數(shù)地址。語法:FARPROCGetProcAddress(HMODULEhModule,LPCSTRlpProcName);5.從動(dòng)態(tài)鏈接庫中導(dǎo)出類動(dòng)態(tài)鏈接庫可以導(dǎo)出C++類及C++類的成員函數(shù)。10.3多線程技術(shù)10.3.1深入理解線程線程是指進(jìn)程內(nèi)的一個(gè)執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體。單個(gè)進(jìn)程在任何給定時(shí)刻,可能有不止一個(gè)線程正在運(yùn)行。但進(jìn)程啟動(dòng)的同時(shí)會(huì)啟動(dòng)一個(gè)線程,該線程被稱作主線程或執(zhí)行線程。一個(gè)進(jìn)程除啟動(dòng)主線程外還可以啟動(dòng)多個(gè)線程,每個(gè)線程都共享進(jìn)程的地址空間,并且共享著進(jìn)程的地址空間內(nèi)的資源及各種數(shù)據(jù)。10.3.2線程的創(chuàng)建與終止1.創(chuàng)建線程在Windows系統(tǒng)中可以使用CreateThread函數(shù)來創(chuàng)建一個(gè)線程。CreateThread函數(shù)語法如下:HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes

DWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);2.終止線程(1)ExitThread函數(shù)

ExitThread函數(shù)用于結(jié)束線程。語法:VOIDExitThread(DWORDdwExitCode);(2)TerminateThread函數(shù)

TerminateThread函數(shù)用于強(qiáng)行終止線程。語法:BOOLTerminateThread(HANDLEhThread,DWORDdwExitCode);10.3.3線程同步1.線程同步的重要性當(dāng)應(yīng)用程序中存在多個(gè)線程序時(shí),如果這些線程都訪問某一公共的資源,某一個(gè)全局變量可能會(huì)出現(xiàn)意想不到的結(jié)果。2.互斥實(shí)現(xiàn)線程同步互斥對(duì)象屬于系統(tǒng)內(nèi)核對(duì)象,它能夠使線程擁有對(duì)某個(gè)資源的絕對(duì)訪問權(quán)?;コ鈱?duì)象的使用方式如下。(1)當(dāng)互斥對(duì)象的線程ID為0時(shí),表示互斥對(duì)象不被任何線程所擁有,此時(shí),系統(tǒng)會(huì)發(fā)出該互斥對(duì)象的通知信號(hào)。(2)當(dāng)互斥對(duì)象的線程ID不為0時(shí),表示當(dāng)前有線程擁有該互斥對(duì)象。在程序中,可以通過CreateMutex函數(shù)創(chuàng)建一個(gè)互斥對(duì)象。如果函數(shù)執(zhí)行成功,則返回值是互斥對(duì)象的句柄。否則,返回值為NULL。語法:HANDLECreat

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論