首先來建立一個插入符,由於是在視窗建立完成之後才有的,所以在視圖類裡要加一個
訊息WM_CREATE。用函數CreateSolidCaret(20,100),當然預設是隱藏的,還得用
ShowCaret()顯示它。當然(20,100)這樣產生的插入符好寬啊,醜.....
插入符的尺寸應該根據當前字型的大小來確定的,比如在word中那樣。
根據我們當前裝置描述表中的字型的大小來改變。首先我們要擷取當前裝置描述表中字型,即文本的資訊。當然,又是用一個函數GetTextMetrics(LPTEXTMETRIC lpMetrics) const;
Retrieves the metrics for the current font using the attribute device context.
用屬性裝置描述表獲得當前字型的度量(怎麼感覺我翻譯的比詞霸還爛,囧)
接下來解釋一下怎麼用這個函數
首先介紹一下
字型的資訊
gh基準往上叫做升序tmAscent的高度,往下叫降序tmDescent的高度,升序的高度加上降序的高度等於整個字型的高度。我們輸入下一行文字的時候才不會覆蓋掉上一行
我們先得構造一個DC
CClientDC dc(this);
再定義一個
TEXTMETRIC tm;
利用dc去調用
dc.GetTextMetrics(&tm)
字型寬度可以這樣設定tm.tmAveCharWidth/8(除以8是孫老師實驗出來的),高度:tm.tmHeight.它兩可以直接作為CreateSolidCaret的參數。
那麼圖形的插入符怎麼建立呢?
我們用一個函數CWnd::CreateCaret
void CreateCaret(CBitmap *pBitmap);
Creates a new shape for the system caret and claims ownership of the caret
The bitmap must have previously been created by the CBitmap::CreateBitmap member function, theCreateDIBitmap Windows function, or the CBitmap::LoadBitmap member function.
函數建立一個新的系統圖形插入符,。。。。(這句咋翻譯啊),位元影像必須用CBitmap::CreateBitmap成員函數,theCreateDIBitmap windows函數,或者CBitmap::LoadBitmap 成員函數在使用CreateCaret之前建立好
CreateCaret automatically destroys the previous caret shape, if any, regardless of which window owns the caret. Once created, the caret is initially hidden. To show the caret, the ShowCaret member function must be called.
如果有必要,不管插入符屬於哪個視窗,CreateCaret將自動銷毀之前的插入符。一旦建立了,插入符將預設隱藏,必須調用ShowCaret函數來顯示。
The system caret is a shared resource. CWnd should create a caret only when it has the input focus or is active. It should destroy the caret before it loses the input focus or becomes inactive.
系統插入符是一個共用資源,Cwnd應該僅僅在他擁有輸入焦點或啟用的時候建立它。當丟失輸入焦點或沒被啟用的時候, 插入符應該被銷毀。
代碼:
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();
但是我們發現什麼都沒有
因為我們的bitmap是局部的對象。當OnCreate執行完成之後它將發生析構
所以我們要把CBitmap bitmap定義為CTextView的成員變數,這時候就有了,一閃一閃的。呵呵
下面我們要在我們的視窗上輸出一串文字
我們可以用TextOut函數。視窗重繪的時候就會被擦除
為了讓我們的文字儲存起來,一直顯示。我們就可以在OnDraw函數中進行處理
每次視窗重繪都會調用OnDraw這個函數,把處理過程放裡邊,就會一直顯示了。
先介紹一個類Cstring,跟C++string類似,可變長度,自動改變大小,而不是字元數組那種自己定義數組大小。
重載了普通操作符。
舉例吧:
CString str("老婆我愛你!");
pDC->TextOut(0,0,str);
視窗就輸出文字了。而且由於是在OnDraw函數裡的函數,所以文字會一直顯示。
還有一個成員函數LoadString
他的作用就是直接根據ID來調用文字。
例如
先在資源檢視裡的String table下得字串表裡定義好了自己的
CString str2;
str2.LoadString(IDS_ZIDONGQING);
pDC->TextOut(100,100,str2);
下面介紹一個函數
CSize sz=pDC->GetTextExtent(str2);//擷取文本所佔高度寬度,然後返回一個CSize值。
48:40