Windows 程式設計常用函式
一. 對話方塊操作:
1. Domodal ( ) 建立模態對話方塊
2. GetDlgItem ( ) 獲得對話方塊視窗上的控制元件
3. GetDlgItemText() 獲得指定控制元件上的文字
SetDlgItemText() 設定控制元件上的文字
4. GetWindowText() 獲得指定視窗上的文字
GetDlgItem ( )-> GetWindowText() 獲得指定控制元件上的文字資訊
5. GetDlgItemInt() 獲得指定控制元件上的數字字元並將其轉換為整形數字
6. DoDataExchange()控制元件與某一變數相關聯後,此函式用於該引數和控制元件交換資料
7. UpData() 與DoDataExchange()共同使用,實現控制元件與變數的關聯
8. GetWindowRect() 得到視窗的矩形的大小
9. IsRectNull()判斷矩形視窗的大小是否為零
10. SetWindowPos() 設定視窗的大小
11. OnInitDialog() 當控制元件顯示之前初始化對話方塊,使對話方塊和控制元件顯示
12. SetWindowLong() 當視窗建立完畢,重新設計視窗過程函式
13. GetNextWindow() 得到當前視窗的下一個視窗的控制程式碼
14. GetWindow() 通過其引數也可以獲得其上一個或下一個視窗控制程式碼
15. GetNextDlgTabItem() 得到下一個有Tab屬性的視窗
16. GetFocus()得到當前的活動視窗
17. SetFocucs() 設定當前的活動視窗
二. 屬性表單操作
1. AddPage()將屬性頁物件新增到屬性表單中
2. DoModal()建立屬性表單
3. SetWizardMode()建立表單嚮導
4. OnSetActive() 當建立嚮導後,某一屬性頁處於活動狀態時將呼叫此函式,可在此函式中修改屬性頁。
5. SetWizardButtons()在OnSetActive()函式中修改當前屬性頁的按鈕顯示
6.AddString() 向列表框或者組合框新增表項
7. OnInitDialog()在對話方塊顯示之前呼叫此函式,可在此函式中向列表框新增項
8. OnWizardNext()建立嚮導後,屬性頁上的按鈕響應函式
總結:
1. 對對話方塊操作,都要對對話方塊資源建立相關聯的類
2. 對對話方塊上的控制元件操作,可以對空間關聯變數,對變數的操作就是對空間的操作,此工作是有DoDataExchange()函式完成的,但是系統不會自動呼叫此函式,此處必須記得呼叫UpDateDate()函式
3. 對話方塊在顯示之前,會呼叫InitDialog()初始化對話方塊,可以在此函式中對對話方塊修改
4. 對對話方塊上控制元件的響應,是由視窗過程函式響應的,有時候需要修改系統的響應,可以重寫視窗過程函式
5. 對於模態對話方塊,當點選OK按鈕時,系統自動呼叫UpDate()函式獲得對話方塊上控制元件的資訊,但是點選CANCLE按鈕,不會呼叫此函式。對於模態對話方塊,當單擊OK按鈕、CANCLE按鈕、或者呼叫EndDialog()函式時,系統自動關閉對話方塊。
6. 對於非模態對話方塊,必須重寫OnCancle()函式和DestoryWindow()函式,否則系統會呼叫EndDialog()函式,此時對話方塊只是看不到而沒有關閉。同時必須重寫PostNcDestroy()虛擬函式銷燬this指標,因為非模態對話方塊一般都是用new建立的。
三、選單欄操作
1、GetMenu() 獲得選單欄指標
2、GetSubMenu()獲得選單欄上的子選單
3、CheckMenuItem()對選單項新增標記
4、SetDefaultItem()設定預設選單項
5、SetMenuItemBitmaps()為選單項新增圖形標記,首先建立點陣圖資源,再用LoadBitmap()載入點陣圖資源,然後才能用SetMenuItemBitmaps()函式對某一選單項新增圖形標記
6、EnableMenuItem()設定某一選單項灰色顯示或者是否可用。
但是系統選單項是否可用,是系統的訊息對映機制實現的,單單呼叫此函式,不會改變系統的訊息對映機制,這時必須在CMainFrame的建構函式中將變數m_bAutoMenuEnable=FALSE,這時將是系統的訊息對映機制失效,但是這時系統所有的選單的原始狀態都會改變,所有選單欄都需要自己來設定其是否可用等狀態。選單欄的訊息對映機制是通過UPDATE_COMMAND_UI巨集來實現的,所以真正正確而且簡單的做法是為需要改變的選單項新增此訊息對映巨集,用Enable()函式等來改變選單項。
7、SetMenu()用某一選單欄和系統生成的選單欄交換,如果此函式的引數為NULL的話,系統的選單欄將不顯示。也可以用一個CMenu物件,用LoadMenu()載入一個選單欄,然後用SetMenu()和系統的選單欄交換。如果這時的CMenu物件是區域性變數的話,必須用該CMenu物件呼叫Detach()函式,使物件和他的控制程式碼分離。否則系統會告知出錯。當然,定義成員變數不會出錯。
8、TrackPopupMenu(),為視窗手動新增右鍵彈出選單。要新增右鍵選單,首先要有選單資源,首先在資源檢視中建立一個選單資源,然後在OnRButtonDown()函式中響應TrackPopupMenu()函式,首先載入選單資源,然後GetSubMenu()獲得此子選單,然後就可以TrackPopupMenu()了。系統自動新增的右鍵選單也是這樣新增的。
9、動態新增選單或選單項:以前的新增選單是在資源檢視中先建立選單資源,動態新增選單,當然也需要選單資源,但是需要程式碼生成,因此首先建立一個CMenu物件,呼叫CreatePopupMenu()建立一個彈出選單,然後就可以呼叫AppendMenuA()新增子選單或者呼叫InsertMenuA()插入子選單。通過AppendMenuA()和InsertMenuA()也可以新增選單項。
10、DeleteMenu()通過此函式也可以動態的刪除子選單或者選單項。
11、GetSystemMetrics()可以獲得系統的各種物件的尺寸大小
12.字串的Format()函式可以對字串進行格式化輸出。
總結:
1. 選單的命令更新機制是通過UPDATE_COMMAMD_UI巨集來實現的,因此我們如果想改變某一選單項的命令更新機制,就可以為此選單項新增 此訊息對映巨集,然後在此響應函式中修改即可。
2. 右鍵彈出選單式通過TrackPopupMenu()函式實現的,我們也可以通過此函式手動新增右鍵彈出選單。
3. 新增子選單之前,首先要有選單資源,可以通過資源檢視自動新增,也可以用CreatePopupMenu()函式生成選單物件,然後才能進行相應的操作。
4. 對於動態新增的選單項,由於他的資源ID使我們自己隨便寫的,所以不能用ClassWizard()為其新增訊息響應函式,我們可以手動新增訊息響應函式,現在資源標頭檔案中,為選單項新增ID,然後在框架類的標頭檔案和原始檔中分別新增訊息對映。如果不太熟悉,可以用ClassWizard為某一具體選單項新增響應函式後,我們就可以參考新增的格式和位置。
四、繪圖操作
繪圖操作,首先要獲得裝置的上下文裝置(即裝置描述表),用裝置描述表來控制繪圖的顯示。
1、 HDC 屬於平臺SDK的裝置上下文,用平臺SDK的裝置上下文類構造一個物件時,必須呼叫系統的::GetDC() 和::ReleaseDC()來獲得上下文和釋放上下文。
2、 MoveTo()移動到某一點
3、 Linto()從某一點到當前點畫線,MoveTo()和LineTo()結合起來用來畫線。
4、 CDC是CWind封裝的裝置上下文類,但是這個類在構造物件時仍需要呼叫函式GetDC()和 ReleaseDC()
5、 CClientDC 最常用的是從CDC派生來的CClientDC類,這個類在構造物件時自動呼叫GetDC()在析構的時候自動呼叫ReleaseDC(),因此不用我們顯式的自己再寫此函式。
6、 CWindowDC 這個類也是從CDC派生而來的,也不用我們顯式的呼叫GetDC()和ReleaseDC(),這個類的作用時當其父視窗用GetParent()時可以在選單欄上繪圖(即非客戶區),當父視窗為GetDesktopWindow()時,可以在螢幕上繪圖。
7、 CPen類,可以用CPen類構造一個畫筆物件,修改畫筆的顏色。
8、 CBrush類,可以構造畫刷物件。當然也可以構造點陣圖畫刷。
9、 SelectObject(),將構造的畫筆選入裝置描述表,該畫筆才能起作用
10、 FillRect()用指定畫刷填充矩形區域。也可以構造點陣圖畫刷,用點陣圖填充矩形區域。
11、 Rectangle()可以繪製矩形,但是矩形是有系統預設的白色畫刷來填充,可以用GetStockObject()函式獲得一個透明畫刷
12、 FromHandle()可以將一個HGDI的控制程式碼轉換為CBrush的指標,方便使用。
注意:以上繪製的圖形和線條都是直線,是在OnLeftButtonDown()中記錄一個點,在OnleftButtonUp()中繪製線條。如果想繪製連續的線條,要在OnMouseMove()中捕獲滑鼠移動的訊息,並不斷改變儲存的前一個滑鼠位置。
五.文字操作
1.CreateSolidCaret()建立游標,游標的寬高由我們自己設定,我們可以得到字型的尺寸,讓游標的大小和字型的大小一致。
2.對於文字的操作,必須弄清兩個概念。TEXTMETRICS結構體的GetTextMetrics()獲得當前字型的尺寸,包括高,平均寬度等。GetTextExtent()獲得字串的範圍,即整個字串的在螢幕輸出的範圍。
3.CreateCaret(),建立游標不僅可以建立基本的游標,通過此函式可以建立點陣圖游標
4.ShowCaret()顯示游標。無論建立的何種游標,初始是隱藏的,必須呼叫ShowCaret()將其顯示出來。
5.TextOut()用於將字串顯示在制定的視窗位置。
6.LoadString()字串顯示之前,肯定要有字串資源,有兩種方法建立字串資源,一種是用過CString類構造字串物件,然後對字串物件賦值,就可以顯示了。第二種方法是資源皮膚新增字串資源,併為其建立ID號,這樣每次需要該字串的時候,就可以載入該字串資源。
7.BeginPath()和EndPath()用於建立路徑層,BeginPath()用於開啟路徑層,EndPath()用於關閉路徑層,可以在這兩個函式之間用Rectangle()函式建立矩形路徑層。
8.SelectClipPath()建立的路徑層正常狀態下看不到變化,可以用此函式選擇剪下路徑,可以用過引數將當前路徑層和螢幕進行互操作,顯示特殊的顯示效果。
9.進行文字操作的幾個技巧:
(1)、要在視窗中輸出鍵盤輸入,可以在WM_CHAR訊息響應函式中處理。經每次輸入的字元儲存到CString m_strLine物件中。為了動態顯示輸入的操作每次輸入當前字元加上以前的字元。(例如:輸入a,當輸入b時,在螢幕上重新輸出ab)
(2)、當在鍵盤上按下退格鍵是,要刪除一個字元。可以先將文字用螢幕顏色輸出,然後刪掉一個字元,再用指定顏色輸出,用人眼的視覺暫留現象,人眼看到動態刪除字元的效果。具體操作如下:可以用GetBkColor()得到背景色,然後用SetTextColor()設定字型的顏色,接著用TextOut()函式用背景色輸出字串;m_strLine=m_strLine.Left(m_strLine.GetLength()-1);用CString的成員函式Left()顯示字串左邊的n個字元。GetLength()得到字串中字元的個數。
(3)、在輸入刪除字元的時候,要求游標對字元的輸入而變化。我們可以在OnLeftButtonDown()函式中用m_TextCaret記錄滑鼠單擊位置處的座標,用SetCaretPos()設定游標的位置。當按下Enter鍵的時候修改m_TextCaretde 縱座標,這樣就記錄了回車和滑鼠單擊的游標位置。對於輸入和刪除後的游標位置,我們可以在字串輸出之前,再次用SetCaretPos()設定游標的位置,此時的位置可以用m_TextCaret的位置加上字串的範圍的得到。
10.CreatePointFont()用此函式設定輸出的字型。
11.SetTimer()設定定時器
12.、在WM_TIMER的響應函式中響應定時器的訊息。可以在此函式中實現卡拉OK字型變色效果。用DrawText()函式在某一矩形區域中顯示字串,可以讓這一矩形不斷的連續變化來達到字型現實的效果。可以設定一成員變數m_width,讓矩形的寬度獨斷增加。矩形的左上角座標和上邊沿的座標自己設定,高度可以用TEXTMETRICS的高度加上上邊沿的高度來實現。當矩形的寬度增加到大於字串的範圍時可以讓寬度變為零,並重新用另一種顏色輸出字串,表示該句話已經顯示一遍了。
13.MFC為我們提供了CEditView類和CRichEditView類,可以讓我們的視類從這兩個類派生,那麼我們的床後就有系統自動生成一些基本的文字編輯功能。
總結:
1、 對字型的操作,GetTextMetrics()和GetTextExtent()函式很重要,需要隨時獲得字型的有關資訊。
2、 字型操作游標的位置很重要,要結合上述兩個函式改變貫標的位置
3、 對字元的操作,有一些技巧可以應用,應掌握上面的一些技巧。
六、繪圖操作
1.建立字型對話方塊:可以用MFC提供的CFontDialog類很方便的建立字型對話方塊。CFontDialog類中的m_cf的lpLogFont儲存了關於字型的資訊,比如大小,字型名稱等一系列資訊。
2.CreateFontIndrect()可以用LOGFONG指標建立一個字型。當用此函式建立一個字型後,CGdiObject的m_font就與建立的字型相關聯了,如果想再次讓m_font執行此函式建立另一字型,必須用m_font呼叫DeleteObject()刪除此GDI物件與系統GDI的聯絡,才能建立新的字型資源。(示例程式碼:D\studio\Graphic\ CGraphicView::OnFont()).
3.建立顏色對話方塊,也用MFC提供的CColorDialog類方便的建立。該類的成員變數m_cc儲存了顏色的有關資訊。M_cc的rgbResult儲存了使用者選擇的顏色資訊。如果m_cc的Flag引數設定CC_RGBINIT值的話,當建立對話方塊是就顯示使用者初始化的顏色資訊。如果不設定值,每次建立對話方塊時都顯示系統預設的黑色值。注意:此時雖然將Flag設定為CC_RGBINIT值,但是此時Flag已經儲存有系統的預設值,如果直接賦值的話,會出錯。必須用“|(或)”操作符賦值。
4.建立一個組框,在組框中放置點、直線、虛線、點線。當單擊選擇某一單選按鈕後,程式就記錄我們的選擇,當我們繪圖的時候就會按照我們的選擇的線型來繪圖。可以為第一個單選按鈕設定成組屬性,並給他關聯一個成員變數,當我們選擇某一個單選按鈕時,這個變數就會按順序加一,記錄我們的選擇。(當用CColorDialog類建立一個顏色對話方塊時,不用再關聯變數,因為顏色對話方塊的物件裡面有一個m_CC的結構體裡面儲存了使用者的選擇)當使用者點選OK按鈕時,就把對話方塊變數儲存的值賦給視類的成員變數。當我們在繪圖的時候,就可以在建立畫筆的函式中把這個引數傳進去,響應使用者的選擇。線寬和顏色也是這樣處理的。但是當我們再次開啟設定對框框對繪圖風格進行設定時,應該顯示我們上次的操作,可以在對話方塊顯示之前(即呼叫Domodel()函式之前)將視類的變數的值賦給對框框的變數,使其顯示。
5.示例對話方塊的建立:當我們選擇線型和線寬時,應該在對話方塊的下面顯示使用者的選擇的示例。如果我們每選擇一項,就在制定區域畫出我們的選擇,很麻煩。我們可以在單擊此控制元件的響應函式中,呼叫Invalidate()函式,使視窗重繪,在WM_PAINT的響應函式中用使用者選擇的線型線寬顏色繪圖。注意:這時繪圖的座標是螢幕座標,需呼叫ScreenToClient()函式轉換座標。
6.WM_CTLCOLOR,當對話方塊建立完畢,顯示之前會響應此訊息,用系統設定的顏色繪製對話方塊,因此我們可以在此響應函式中修改對話方塊的顏色。我們可以構造一個畫刷物件,讓對話方塊以我們建立的畫刷顯示對話方塊。當然我們也可以根據ID號讓其改變某一空間的顏色,其他位置仍用系統顏色繪製。我們也可以用SetTextColor()設定控制元件上字型的顏色。但是字型也有背景顏色,我們可以用SetBkMode()函式設定背景為透明。但是,控制元件上的按鈕不能改變,我們可以將其設定OwnerDraw屬性,使其成為自繪製按鈕,然後從CButton類派生一個新的類,在此類中響應WM_DRAWITEM訊息,讓按鈕關聯一該類的成員變數,就可以在響應函式中修改按鈕的顏色和字型。
7.在視窗中顯示點陣圖:顯示點陣圖分四步:(1)構造點陣圖物件,載入點陣圖資源——>(2)用CDC類的CreateCompatibleDC建立相容性裝置描述表與當前裝置描述表相關聯——>(3)將點陣圖選入相容性裝置描述表,用以確定點陣圖的大小——>(4)用當前裝置描述表表用BitBlt()
函式顯示點陣圖
8.BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );引數分別表示:當前顯示圖片的左上角座標;當前要顯示影像的視窗的寬高(用來設定顯示點陣圖的寬高);相容DC;點陣圖在相容DC的左上角左邊;複製型別
9.StretchBlt()用BitBlt顯示點陣圖,是將點陣圖全部顯示,如果視窗太小擇顯示不全,即沒有縮放。用StretchBlt()函式可以將影像縮放顯示。
10. BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );此函式多了兩個引數,即點陣圖在相容DC的寬高,這個寬高可以用點陣圖的寬高獲得BITMAP結構體可以儲存一副點陣圖的相關資訊,因此可以用點陣圖物件呼叫GetBitmap()函式獲得點陣圖的資訊。
注意:顯示點陣圖可以在視類的OnDraw函式中完成,但是在此函式中顯示後,當視窗大小發生變化,視窗重繪時,螢幕會發生閃爍。解決的方法是:可以在是類中讓其響應WM_ERASEBKGND訊息,在擦除視窗背景是重繪,可以避免閃爍。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27660822/viewspace-775101/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 函式程式設計函式程式設計
- Perl在CGI程式設計中常用的函式 (轉)程式設計函式
- UNIX系統程式設計常用庫函式說明(轉)程式設計函式
- scala 函式程式設計函式程式設計
- 函式程式設計之道函式程式設計
- ASP.NET網路程式設計常用的27個函式ASP.NET程式設計函式
- 【趣解程式設計】函式程式設計函式
- linux C程式設計中常用的函式--字元測試篇LinuxC程式程式設計函式字元
- 總結.NET程式設計中經常用到的27個函式程式設計函式
- python網路程式設計中常用到的函式總結Python程式設計函式
- JS 命令式 宣告式 函式式 程式設計?JS函式程式設計
- 函數語言程式設計-鏈式程式設計RAC函數程式設計
- 不用任何賦值的程式設計稱為*函式式*程式設計賦值程式設計函式
- 揚帆起航:從指令式程式設計到函式響應式程式設計程式設計函式
- select函式socket程式設計函式程式設計
- 函式式思維和函數語言程式設計函式函數程式設計
- 13.程式程式設計進階:函式程式設計函式
- Scala函式與函數語言程式設計函式函數程式設計
- 邏輯程式設計與函式程式設計的介紹程式設計函式
- iOS鏈式程式設計及函數語言程式設計iOS程式設計函數
- python函式程式設計 返回函式 匿名函式 裝飾器 偏函式Python函式程式設計
- 函式設計函式
- 瞭解 JavaScript 函數語言程式設計 - 宣告式函式JavaScript函數程式設計函式
- 函式響應式程式設計與RxSwift函式程式設計Swift
- Linux系統程式設計(9)—— 程式之程式控制函式exec系列函式Linux程式設計函式
- Bash程式設計007——函式(一)程式設計函式
- Ardunio和HAL庫函式程式設計函式程式設計
- linux程式設計之pipe()函式Linux程式設計函式
- inux程式設計下signal()函式UX程式設計函式
- Linux Shell程式設計(29)——函式Linux程式設計函式
- 函數語言程式設計中的常用技巧函數程式設計
- 函數語言程式設計(一) 認識“程式設計正規化”和“函式”函數程式設計函式
- Mysql 常用函式(1)- 常用函式彙總MySql函式
- 函數語言程式設計(2) 高階函式函數程式設計函式
- Day 14 匿名函式 內建函式 物件導向程式設計函式物件程式設計
- 常用函式函式
- Lambda表示式入門--函數語言程式設計與函式式介面函數程式設計函式
- 好程式設計師大資料培訓分享之hive常用內部函式程式設計師大資料Hive函式