將文字傳送到剪貼簿 |
讓我們想像把一個(gè)ANSI字串傳送到剪貼簿上,并且我們已經(jīng)有了指向這個(gè)字串的指標(biāo)(pString)。現(xiàn)在希望傳送這個(gè)字串的iLength字元,這些字元可能以NULL結(jié)尾,也可能不以NULL結(jié)尾。 首先,通過(guò)使用GlobalAlloc來(lái)配置一個(gè)足以儲(chǔ)存字串的記憶體塊,其中還包括一個(gè)終止字元NULL: hGlobal = GlobalAlloc (GHND | GMEM_SHARE, iLength + 1) ; 如果未能配置到記憶體塊,hGlobal的值將為NULL 。如果配置成功,則鎖定這塊記憶體,并得到指向它的一個(gè)指標(biāo): pGlobal = GlobalLock (hGlobal) ; 將字串復(fù)制到記憶體塊中: for (i = 0 ; i < wLength ; i++) *pGlobal++ = *pString++ ; 由於GlobalAlloc的GHND旗標(biāo)已使整個(gè)記憶體塊在配置期間被清除為零,所以不需要增加結(jié)尾的NULL 。以下敘述為記憶體塊解鎖: GlobalUnlock (hGlobal) ; 現(xiàn)在就有了表示以NULL結(jié)尾的文字所在記憶體塊的記憶體代號(hào)。為了把它送到剪貼簿中,打開(kāi)剪貼簿并把它清空: OpenClipboard (hwnd) ; EmptyClipboard () ; 利用CF_TEXT識(shí)別字把記憶體代號(hào)交給剪貼簿,關(guān)閉剪貼簿: SetClipboardData (CF_TEXT, hGlobal) ; CloseClipboard () ; 工作告一段落。 |
GlobalAlloc 及其它 |
從用戶的角度來(lái)看,WIN32的內(nèi)存管理是非常簡(jiǎn)單和明了的。每一個(gè)應(yīng)用程序都有自己獨(dú)立的4G地址空間,這種內(nèi)存模式叫做“平坦”型地址模式,所有的段寄存器或描述符都指向同樣的起始地址,所有的地址偏移都是32位的長(zhǎng)度,這樣一個(gè)應(yīng)用程序無(wú)須變換選擇符就可以存取自己的多達(dá)4G的地址空間。這種內(nèi)存管理模式是非常簡(jiǎn)潔而便于管理的,而且我們?cè)俨挥煤湍切┝钊擞憛挼?#8220;near”和“far”指針打交道了。在W16下有兩種主要類型的API:全局和局部。“全局”的API 分配在其他的段中,這樣從內(nèi)存角度來(lái)看他們是一些“far”(遠(yuǎn))函數(shù)或者叫遠(yuǎn)過(guò)程調(diào)用,“局部”API只要和進(jìn)程的堆打交道,所以把它們叫做“near”(近)函數(shù)或者近過(guò)程調(diào)用。而在WIN32中,這兩種內(nèi)存模式是相同的,無(wú)論您調(diào)用GlobalAlloc還是LocalAlloc,結(jié)果都是一樣。
至于分配和使用內(nèi)存的過(guò)程都是一樣的: 調(diào)用GlobalAlloc函數(shù)分配一塊內(nèi)存,該函數(shù)會(huì)返回分配的內(nèi)存句柄。 |
句柄vs指針 | ||||||
句柄是一種指向指針的指針。我們知道,所謂指針是一種內(nèi)存地址。應(yīng)用程序啟動(dòng)后,組成這 個(gè)程序的各對(duì)象是住留在內(nèi)存的。如果簡(jiǎn)單地理解,似乎我們只要獲知這個(gè)內(nèi)存的首地址,那么就可以隨時(shí)用這個(gè)地址 訪問(wèn)對(duì)象。但是,如果您真的這樣認(rèn)為,那么您就大錯(cuò)特錯(cuò)了。我們知道,Windows是一 個(gè)以虛擬內(nèi)存為基礎(chǔ)的操作系統(tǒng)。在這種系統(tǒng)環(huán)境下,Windows內(nèi)存管理器經(jīng)常在內(nèi)存中來(lái)回移動(dòng)對(duì)象,依此來(lái)滿足各種應(yīng)用程序的內(nèi)存需要。對(duì)象被移動(dòng)意味著它的地址變化 了。如果地址總是如此變化,我們?cè)摰侥睦锶フ以搶?duì)象呢?為了解決這個(gè)問(wèn)題,Windows操作系統(tǒng)為各應(yīng)用程序騰出一些內(nèi)存儲(chǔ)地址,用來(lái)專門 登記各應(yīng)用對(duì)象在內(nèi)存中的地址變化,而這個(gè)地址(存儲(chǔ)單元的位置)本身是不變的。Windows內(nèi)存管理器在移動(dòng)對(duì)象在內(nèi)存中的位置后,把對(duì)象新的地址告知這個(gè)句柄地址來(lái)保存。這樣我們只需記住這個(gè)句柄地址就可以間接地知道對(duì)象具體在內(nèi)存中的哪個(gè)位置。這個(gè)地址是在對(duì)象裝載(Load)時(shí)由系統(tǒng)分配給的,當(dāng)系統(tǒng)卸載時(shí)(Unload)又釋放給系統(tǒng)。句柄地址(穩(wěn)定)→記載著對(duì)象在內(nèi)存中的地址→對(duì)象在內(nèi)存中的地址(不穩(wěn)定)→實(shí)際對(duì)象。但是,必須注意的是程序每次從新啟動(dòng),系統(tǒng)不能保證分配給這個(gè)程序的句柄還是原來(lái)的那個(gè)句柄,而且絕大多數(shù)情況的確不一樣的。假如我們把進(jìn)入電影院看電影看成 是一個(gè)應(yīng)用程序的啟動(dòng)運(yùn)行,那么系統(tǒng)給應(yīng)用程序分配的句柄總是不一樣,這和每次電 影院售給我們的門票總是不同的一個(gè)座位是一樣的道理。 | ||||||
|
C++開(kāi)發(fā)中常見(jiàn)問(wèn)題 | |||
1,簡(jiǎn)述VC6下如何進(jìn)行程序的調(diào)試。 在主菜單"Build"中,有一個(gè)Start Build的子菜單,它下面包含了Go菜單(快捷鍵為F5),選擇后,程序?qū)漠?dāng)前語(yǔ)句進(jìn)入調(diào)試運(yùn)行,直到遇到斷點(diǎn)或程序結(jié)束。 將鼠標(biāo)移動(dòng)到要調(diào)試的代碼行,單擊鼠標(biāo)右鍵選擇“Insert/Remove Breakpoint”,或者按下F9,可以在該行上添加斷點(diǎn),此時(shí)斷點(diǎn)代碼行前面出現(xiàn)一個(gè)棕色的圈,再次選擇將清除斷點(diǎn)。進(jìn)入調(diào)試狀態(tài)后,Debug菜單將取代Build菜單出現(xiàn)在菜單欄中,它下面包含常用的調(diào)試操作,如Step Over,單步運(yùn)行并不跟蹤到調(diào)用的函數(shù)內(nèi)部;其他還包括Step Into,Step Out, Stop Debugging等調(diào)試方法。 2, 簡(jiǎn)述在VC6建立的工程中后綴為.cpp,.h,.rc,.dsp,.dsw的文件的作用是什么? .cpp是源程序代碼C++文件 .h是包含函數(shù)聲明和變量定義的頭文件 .rc是定義資源的資源腳本文件 .dsp是工程文件,記錄當(dāng)前工程的有關(guān)信息 .dsw是工作區(qū)文件,一個(gè)工作區(qū)可能包含一個(gè)或多個(gè)工程 3, 已知一個(gè)對(duì)話框上有一個(gè)編輯框控件,ID為IDC_EDIT1,為其關(guān)聯(lián)了CEdit類型的變量m_edit1,使用兩種方法,說(shuō)明如何改變編輯框內(nèi)部的文本為"Hello",寫出程序代碼的片斷。 第一種方法:m_edit1.SetSel(0,-1); m_edit1.ReplaceSel("Hello"); 第二種方法:SetWindowText("Hello"); 4, 簡(jiǎn)述使用Windows API編寫的一個(gè)基本的Windows應(yīng)用程序框架的結(jié)構(gòu)。 Windows API編寫的基本應(yīng)用程序框架至少應(yīng)該包含程序入口函數(shù)WinMain和窗口函數(shù)WndProc。在主函數(shù)WinMain里面包含窗口類的定義和注冊(cè),窗口的創(chuàng)建和顯示以及消息循環(huán)。 5, 消息在Windows中的數(shù)據(jù)類型是什么,它有哪些成員變量,各有什么含義 消息的數(shù)據(jù)類型是MSG,它是一個(gè)結(jié)構(gòu)體,其成員變量主要包括hwnd,表示消息的窗口句柄;message代表消息的類型;wParam和lParam包含消息的附加信息,隨不同的消息有所不同。 6, Windows的鼠標(biāo)消息的長(zhǎng)參數(shù)lParam與字參數(shù)wParam的含義是什么 鼠標(biāo)消息的長(zhǎng)參數(shù)lParam的低字節(jié)包含了鼠標(biāo)光標(biāo)位置的x坐標(biāo)值,lParam的高字節(jié)包含了鼠標(biāo)光標(biāo)位置的y坐標(biāo)值;字參數(shù)wParam內(nèi)包含了指示當(dāng)前按下的各種虛鍵狀態(tài)的值。 7, 說(shuō)明使用一個(gè)非模態(tài)對(duì)話框的注意問(wèn)題和用到的Windows API函數(shù) 使用一個(gè)非模態(tài)對(duì)話框應(yīng)該注意一定要在樣式中包含WS_VISIBLE才能正常顯示;創(chuàng)建對(duì)話框使用CreateDialog函數(shù);消息循環(huán)部分應(yīng)該使用IsDialogMessage過(guò)濾消息;關(guān)閉對(duì)話框使用函數(shù)DestroyWindow。 8, 簡(jiǎn)述在MFC應(yīng)用程序中UpdateData函數(shù)的作用及其參數(shù)含義與使用場(chǎng)合。 UpdateData只有一個(gè)BOOL類型的參數(shù),UpdateData(FALSE)一般用于對(duì)話框控件連接的變量值刷新屏幕顯示;UpdateData(TRUE)用于獲取屏幕數(shù)據(jù)到對(duì)話框控件連接的變量中。 9, 列舉列表框控件能夠接受的三個(gè)消息類型,并說(shuō)明其作用 LB_ADDSTRING用于在列表框中加入一項(xiàng)字符串;LB_DIR用于在列表框中列出指定文件;LB_GETTEXT用于獲取指定項(xiàng)的文本。 10, 在一個(gè)對(duì)話框上添加了三個(gè)單選按鈕,要使它們之間自動(dòng)實(shí)現(xiàn)互斥,應(yīng)該注意什么問(wèn)題,在VC環(huán)境下如何操作? 要實(shí)現(xiàn)一組單選按鈕的自動(dòng)互斥,應(yīng)該讓它們的控件ID值連續(xù),并設(shè)置第一個(gè)單選按鈕的Group屬性,其他的不設(shè)。 11, 簡(jiǎn)述由一個(gè)文檔類派生自己的文檔類,并實(shí)現(xiàn)文檔的存取需要哪些步驟。 首先為每一個(gè)文檔類型從CDocument派生一個(gè)相應(yīng)的文檔類;然后為該文檔類添加成員變量以保存數(shù)據(jù);最后重載Serialize成員函數(shù)以實(shí)現(xiàn)文檔數(shù)據(jù)的串行化。 12, 列舉視圖類(CView)的三個(gè)子類,并簡(jiǎn)要說(shuō)明其作用。 CScrollView類提供視圖的滾動(dòng)顯示;CEditView類支持在視圖中的文本編輯操作;CHtmlView類支持在視圖中顯示和操作html文件。 13, Visual C++ 6.0如何進(jìn)入調(diào)試狀態(tài),在調(diào)試狀態(tài)下能夠顯示哪些調(diào)試窗口,列舉三個(gè),其作用分別是什么? 啟動(dòng)調(diào)試后,在View菜單的Debug Window子菜單下可以打開(kāi)一些輔助調(diào)試的窗口 Watch:顯示察看當(dāng)前語(yǔ)句和前面語(yǔ)句中變量值的窗口 Call Stack:顯示察看調(diào)用堆棧的窗口 Memory:顯示察看內(nèi)存中內(nèi)容的窗口 14, 說(shuō)明位圖資源的創(chuàng)建及顯示過(guò)程的步驟,并給出相應(yīng)的Windows API函數(shù)名。 首先定義位圖句柄HBITMAP hBitmap;第二步使用LoadBitMap加載位圖;第三步,調(diào)用CreateCompatibleDC向系統(tǒng)申請(qǐng)內(nèi)存設(shè)備環(huán)境句柄,并調(diào)用函數(shù)SelectObject把位圖選入內(nèi)存設(shè)備環(huán)境;第四步,調(diào)用BitBlt函數(shù)將位圖從內(nèi)存設(shè)備環(huán)境輸出到指定的窗口設(shè)備環(huán)境中,從而實(shí)現(xiàn)顯示位圖。 15, 如何獲取字體句柄從而實(shí)現(xiàn)字體的輸出,并給出相應(yīng)的Windows API函數(shù)名。 首先定義字體句柄變量HFONT hF;然后調(diào)用函數(shù)GetStockObject獲取系統(tǒng)的字體句柄,或者調(diào)用CreateFont得到自定義的字體句柄;最后調(diào)用SelectObject把字體句柄選入設(shè)備環(huán)境。 16, 列舉三種按鈕的類型,并說(shuō)明其作用和創(chuàng)建方法之間的不同之處。 常用的按鈕有普通按鈕、單選按鈕、復(fù)選框,和組框。普通按鈕作用是幫助用戶觸發(fā)指定動(dòng)作;單選按鈕一般各選項(xiàng)之間存在互斥性;復(fù)選框用來(lái)顯示一組選項(xiàng)供用戶選擇,各選項(xiàng)之間不存在互斥;組框主要用于把控件分成不同的組并加以說(shuō)明. 17, 要使一個(gè)靜態(tài)控件顯示一個(gè)位圖并能接受用戶輸入,應(yīng)該注意什么問(wèn)題。 要使靜態(tài)控件顯示位圖,必須設(shè)定其風(fēng)格包含SS_BITMAP,并在創(chuàng)建靜態(tài)控件窗口,即調(diào)用CreateWindow時(shí)指定并加載位圖;要使靜態(tài)控件能夠接收用戶輸入,必須設(shè)定其風(fēng)格包含SS_NOTIFY。
|
VC實(shí)現(xiàn)BMP位圖文件結(jié)構(gòu)及平滑縮放 | ||||||||||||||||||||||
|
本文轉(zhuǎn)自:http://www.shnenglu.com/mzty/archive/2006/05/29/7794.html