vc 學習點滴之終結篇
將文字傳送到剪貼簿 |
讓我們想像把一個ANSI字串傳送到剪貼簿上,並且我們已經有了指向這個字串的指標(pString)。現在希望傳送這個字串的iLength字元,這些字元可能以NULL結尾,也可能不以NULL結尾。 首先,通過使用GlobalAlloc來配置一個足以儲存字串的記憶體塊,其中還包括一個終止字元NULL: hGlobal = GlobalAlloc (GHND | GMEM_SHARE, iLength + 1) ; 如果未能配置到記憶體塊,hGlobal的值將為NULL 。如果配置成功,則鎖定這塊記憶體,並得到指向它的一個指標: pGlobal = GlobalLock (hGlobal) ; 將字串複製到記憶體塊中: for (i = 0 ; i < wLength ; i++) *pGlobal++ = *pString++ ; 由於GlobalAlloc的GHND旗標已使整個記憶體塊在配置期間被清除為零,所以不需要增加結尾的NULL 。以下敘述為記憶體塊解鎖: GlobalUnlock (hGlobal) ; 現在就有了表示以NULL結尾的文字所在記憶體塊的記憶體代號。為了把它送到剪貼簿中,開啟剪貼簿並把它清空: OpenClipboard (hwnd) ; EmptyClipboard () ; 利用CF_TEXT識別字把記憶體代號交給剪貼簿,關閉剪貼簿: SetClipboardData (CF_TEXT, hGlobal) ; CloseClipboard () ; 工作告一段落。 |
GlobalAlloc 及其它 |
從使用者的角度來看,WIN32的記憶體管理是非常簡單和明瞭的。每一個應用程式都有自己獨立的4G地址空間,這種記憶體模式叫做“平坦”型地址模式,所有的段暫存器或描述符都指向同樣的起始地址,所有的地址偏移都是32位的長度,這樣一個應用程式無須變換選擇符就可以存取自己的多達4G的地址空間。這種記憶體管理模式是非常簡潔而便於管理的,而且我們再不用和那些令人討厭的“near”和“far”指標打交道了。在W16下有兩種主要型別的API:全域性和區域性。“全域性”的API 分配在其他的段中,這樣從記憶體角度來看他們是一些“far”(遠)函式或者叫遠過程呼叫,“區域性”API只要和程式的堆打交道,所以把它們叫做“near”(近)函式或者近過程呼叫。而在WIN32中,這兩種記憶體模式是相同的,無論您呼叫GlobalAlloc還是LocalAlloc,結果都是一樣。
至於分配和使用記憶體的過程都是一樣的: 呼叫GlobalAlloc函式分配一塊記憶體,該函式會返回分配的記憶體控制程式碼。 |
控制程式碼vs指標 | ||||||
控制程式碼是一種指向指標的指標。我們知道,所謂指標是一種記憶體地址。應用程式啟動後,組成這
個程式的各物件是住留在記憶體的。如果簡單地理解,似乎我們只要獲知這個記憶體的首地址,那麼就可以隨時用這個地址 訪問物件。但是,如果您真的這樣認為,那麼您就大錯特錯了。我們知道,Windows是一 個以虛擬記憶體為基礎的作業系統。在這種系統環境下,Windows記憶體管理器經常在記憶體中來回移動物件,依此來滿足各種應用程式的記憶體需要。物件被移動意味著它的地址變化 了。如果地址總是如此變化,我們該到哪裡去找該物件呢?為了解決這個問題,Windows作業系統為各應用程式騰出一些記憶體儲地址,用來專門 登記各應用物件在記憶體中的地址變化,而這個地址(儲存單元的位置)本身是不變的。Windows記憶體管理器在移動物件在記憶體中的位置後,把物件新的地址告知這個控制程式碼地址來儲存。這樣我們只需記住這個控制程式碼地址就可以間接地知道物件具體在記憶體中的哪個位置。這個地址是在物件裝載(Load)時由系統分配給的,當系統解除安裝時(Unload)又釋放給系統。控制程式碼地址(穩定)→記載著物件在記憶體中的地址→物件在記憶體中的地址(不穩定)→實際物件。但是,必須注意的是程式每次從新啟動,系統不能保證分配給這個程式的控制程式碼還是原來的那個控制程式碼,而且絕大多數情況的確不一樣的。假如我們把進入電影院看電影看成 是一個應用程式的啟動執行,那麼系統給應用程式分配的控制程式碼總是不一樣,這和每次電 影院售給我們的門票總是不同的一個座位是一樣的道理。 |
||||||
|
C++開發中常見問題 | |||
1,簡述VC6下如何進行程式的除錯。 在主選單"Build"中,有一個Start Build的子選單,它下面包含了Go選單(快捷鍵為F5),選擇後,程式將從當前語句進入除錯執行,直到遇到斷點或程式結束。 將滑鼠移動到要除錯的程式碼行,單擊滑鼠右鍵選擇“Insert/Remove Breakpoint”,或者按下F9,可以在該行上新增斷點,此時斷點程式碼行前面出現一個棕色的圈,再次選擇將清除斷點。進入除錯狀態後,Debug選單將取代Build選單出現在選單欄中,它下面包含常用的除錯操作,如Step Over,單步執行並不跟蹤到呼叫的函式內部;其他還包括Step Into,Step Out, Stop Debugging等除錯方法。 2, 簡述在VC6建立的工程中字尾為.cpp,.h,.rc,.dsp,.dsw的檔案的作用是什麼? .cpp是源程式程式碼C++檔案 .h是包含函式宣告和變數定義的標頭檔案 .rc是定義資源的資源指令碼檔案 .dsp是工程檔案,記錄當前工程的有關資訊 .dsw是工作區檔案,一個工作區可能包含一個或多個工程 3, 已知一個對話方塊上有一個編輯框控制元件,ID為IDC_EDIT1,為其關聯了CEdit型別的變數m_edit1,使用兩種方法,說明如何改變編輯框內部的文字為"Hello",寫出程式程式碼的片斷。 第一種方法:m_edit1.SetSel(0,-1); m_edit1.ReplaceSel("Hello"); 第二種方法:SetWindowText("Hello"); 4, 簡述使用Windows API編寫的一個基本的Windows應用程式框架的結構。 Windows API編寫的基本應用程式框架至少應該包含程式入口函式WinMain和視窗函式WndProc。在主函式WinMain裡面包含視窗類的定義和註冊,視窗的建立和顯示以及訊息迴圈。 5, 訊息在Windows中的資料型別是什麼,它有哪些成員變數,各有什麼含義 訊息的資料型別是MSG,它是一個結構體,其成員變數主要包括hwnd,表示訊息的視窗控制程式碼;message代表訊息的型別;wParam和lParam包含訊息的附加資訊,隨不同的訊息有所不同。 6, Windows的滑鼠訊息的長引數lParam與字引數wParam的含義是什麼 滑鼠訊息的長引數lParam的低位元組包含了滑鼠游標位置的x座標值,lParam的高位元組包含了滑鼠游標位置的y座標值;字引數wParam內包含了指示當前按下的各種虛鍵狀態的值。 7, 說明使用一個非模態對話方塊的注意問題和用到的Windows API函式 使用一個非模態對話方塊應該注意一定要在樣式中包含WS_VISIBLE才能正常顯示;建立對話方塊使用CreateDialog函式;訊息迴圈部分應該使用IsDialogMessage過濾訊息;關閉對話方塊使用函式DestroyWindow。 8, 簡述在MFC應用程式中UpdateData函式的作用及其引數含義與使用場合。 UpdateData只有一個BOOL型別的引數,UpdateData(FALSE)一般用於對話方塊控制元件連線的變數值重新整理螢幕顯示;UpdateData(TRUE)用於獲取螢幕資料到對話方塊控制元件連線的變數中。 9, 列舉列表框控制元件能夠接受的三個訊息型別,並說明其作用 LB_ADDSTRING用於在列表框中加入一項字串;LB_DIR用於在列表框中列出指定檔案;LB_GETTEXT用於獲取指定項的文字。 10, 在一個對話方塊上新增了三個單選按鈕,要使它們之間自動實現互斥,應該注意什麼問題,在VC環境下如何操作? 要實現一組單選按鈕的自動互斥,應該讓它們的控制元件ID值連續,並設定第一個單選按鈕的Group屬性,其他的不設。 11, 簡述由一個文件類派生自己的文件類,並實現文件的存取需要哪些步驟。 首先為每一個文件型別從CDocument派生一個相應的文件類;然後為該文件類新增成員變數以儲存資料;最後過載Serialize成員函式以實現文件資料的序列化。 12, 列舉檢視類(CView)的三個子類,並簡要說明其作用。 CScrollView類提供檢視的滾動顯示;CEditView類支援在檢視中的文字編輯操作;CHtmlView類支援在檢視中顯示和操作html檔案。 13, Visual C++ 6.0如何進入除錯狀態,在除錯狀態下能夠顯示哪些除錯視窗,列舉三個,其作用分別是什麼? 啟動除錯後,在View選單的Debug Window子選單下可以開啟一些輔助除錯的視窗 Watch:顯示察看當前語句和前面語句中變數值的視窗 Call Stack:顯示察看呼叫堆疊的視窗 Memory:顯示察看記憶體中內容的視窗 14, 說明點陣圖資源的建立及顯示過程的步驟,並給出相應的Windows API函式名。 首先定義點陣圖控制程式碼HBITMAP hBitmap;第二步使用LoadBitMap載入點陣圖;第三步,呼叫CreateCompatibleDC向系統申請記憶體裝置環境控制程式碼,並呼叫函式SelectObject把點陣圖選入記憶體裝置環境;第四步,呼叫BitBlt函式將點陣圖從記憶體裝置環境輸出到指定的視窗裝置環境中,從而實現顯示點陣圖。 15, 如何獲取字型控制程式碼從而實現字型的輸出,並給出相應的Windows API函式名。 首先定義字型控制程式碼變數HFONT hF;然後呼叫函式GetStockObject獲取系統的字型控制程式碼,或者呼叫CreateFont得到自定義的字型控制程式碼;最後呼叫SelectObject把字型控制程式碼選入裝置環境。 16, 列舉三種按鈕的型別,並說明其作用和建立方法之間的不同之處。 常用的按鈕有普通按鈕、單選按鈕、核取方塊,和組框。普通按鈕作用是幫助使用者觸發指定動作;單選按鈕一般各選項之間存在互斥性;核取方塊用來顯示一組選項供使用者選擇,各選項之間不存在互斥;組框主要用於把控制元件分成不同的組並加以說明. 17, 要使一個靜態控制元件顯示一個點陣圖並能接受使用者輸入,應該注意什麼問題。 要使靜態控制元件顯示點陣圖,必須設定其風格包含SS_BITMAP,並在建立靜態控制元件視窗,即呼叫CreateWindow時指定並載入點陣圖;要使靜態控制元件能夠接收使用者輸入,必須設定其風格包含SS_NOTIFY。
|
VC實現BMP點陣圖檔案結構及平滑縮放 | ||||||||||||||||||||||
|
相關文章
- Django之學習點滴Django
- Laravel 初學者學習點滴Laravel
- Kotlin學習之起點篇Kotlin
- 部落格開張,記錄學習點滴
- 【面試】實習求職終結篇面試求職
- JUnit5學習之八:綜合進階(終篇)
- Flutter學習篇(五)——路由剖析終篇Flutter路由
- 『高階篇』docker之CICD(終結篇)(44)Docker
- 死磕 java集合之終結篇Java
- sql查詢學習和實踐點滴積累SQL
- 一點一滴探究 JVM 之記憶體結構JVM記憶體
- OO學習最終總結
- jackson學習之十(終篇):springboot整合(配置類)Spring Boot
- asm點滴ASM
- oracle點滴Oracle
- 演算法學習之旅,終點亦是起點演算法
- Java學習之反射篇Java反射
- 死磕 java原子類之終結篇(面試題)Java面試題
- disruptor筆記之八:知識點補充(終篇)筆記
- 學習mysql之後的一點總結(基礎)MySql
- NestJS學習總結篇JS
- mailx使用點滴AI
- OSS網頁上傳和斷點續傳(終結篇)網頁斷點
- Go 之基礎速學 (十八) golang 基礎二次速過(終結篇)Golang
- sql點滴42—mysql中的資料結構MySql資料結構
- 敏捷之終結?敏捷
- 如何系統學習C 語言(中)之 結構體篇結構體
- [手動置頂] 文章彙總|Android學習的一點一滴Android
- Snmp學習總結系列——開篇
- Java學習之LinkedHashMap學習總結JavaHashMap
- 《資料結構與演算法之美》學習筆記之開篇資料結構演算法筆記
- 工作點滴積累
- lzma 知識點滴
- 前端點滴記錄前端
- 專題:點滴JavascriptJavaScript
- hp-ux點滴UX
- swoft 學習筆記之 response 篇筆記
- Flutter Canvas學習之繪圖篇FlutterCanvas繪圖