1.如何取得Memo的行和列
建立一個應用,在表單Form1上添加兩個TLabel組件名為Label1,Label2;
添加兩個TButton組件名為Button1,Button2;添加一個TMemo組件名為Memo1。
然後在代碼編輯器中添加以下代碼。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Label1->Caption=SendMessage(Memo1->Handle,EM_LINEFROMCHAR,-1,0)+1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Label2->Caption=Memo1->SelStart-SendMessage(Memo1->Handle,EM_LINEINDEX,-1,0)+1;
}
這種方法同樣適用於RichEdit。
2.在Memo中增加一行後,如何使最後一行總能顯示
或如何控制ScrollBar,將其拉到最下面
SendMessage(Memo1->Handle,EM_SCROLL,SB_LINEDOWN,0 )
3.為TStringGrid 的 文 字 加 上 顏 色
TStringGrid 是C++ Builder 提 供 給 用 戶 的 一 種 字 符 網 格 控 件。 美 中 不 足 的 是, 它 沒 有 提 供 分 別 修 改 各 單 元 字 體 顏 色、 大 小 的 方 法。 其 實 要 為TStringGrid 實 現 這 樣 功 能, 只 需 在 程 序 中 稍 加 處 理 就 行 了。 方 法 是 自 定 義 一 個 二 維 數 組 cellbuf, 它 的 下 標 與 網 格 單 元 列 行 一 一 對 應, 用 於 存 放 各 網 格 單 元 的 顏 色、 文 字 等 信 息。
struct CellStru
{
AnsiString msg; // 文 字 信 息
TColor color; // 文 字 顏 色
};
CellStru cellbuf[MAXCOL][MAXROW];
初 始 化cellbuf 後, 再 在 字 符 網 格 控 件 StringGrid1 的OnDrawCell 響 應 事 件 中, 加 入 如 下 的 代 碼 即 可。
void __fastcall TForm1::StringGrid1DrawCell (TObject *Sender, int Col,
int Row, TRect &Rect, TGridDrawState State)
{
StringGrid1- >Canvas- >Font- > Color=cellbuf[Col][Row].color;
StringGrid1- >Canvas- >TextOut(Rect.Left+3, Rect.Top+3,cellbuf[Col][Row].msg);
}
4.BCB未公開的代碼編輯熱鍵
左移或右移整塊代碼
選中一塊代碼,反白後,
(1)按 CTRL+ K,鬆開,再按 I 是整片往右移;
(2)按 CTRL+ K,鬆開,再按 U 是整片文字往左移.
或者,反白後,
(1)按 CTRL+ SHIFT+ I 是整片往右移,
(2)按 CTRL+ SHIFT+ U 是整片文字往左移.
5.任務條狀態區的應用
Windows95的任務條(Taskbar)上有一個狀態區,可以顯示當前IME(中文版)、目前時間等資訊,當啟動列印管理器時還可顯示列印管理器的表徵圖,表明印表機正在工作。我們可以使用這一技術為正在後台工作的程式設定一個表徵圖,以顯示它的工作狀態,使用者可以通過滑鼠點擊來查詢詳細情況或修改工作參數。下面對其實現方法作一介紹。
6.表徵圖的添加和刪除
實現這兩個操作都是通過調用Shell_NotifyIcon函數,並傳遞兩個參數:一個是操作指示,添加時為NIM_ADD,刪除時為NIM_DELETE;另一個是結構NOTIFYCONDATA,並需適當的初始化。通過指定不同的表徵圖標識號,可以添加多個表徵圖。下面的兩個函數分別實現添加表徵圖和移去表徵圖。
//AddTaskBarICON:將指定表徵圖添加到TaskBar的狀態區,成功返回TRUE,否則返回FALSE //hwnd:指定接收訊息的視窗//uID:表徵圖的標識號//hicon:待添加的表徵圖控制代碼//IpszTip:當滑鼠停留在表徵圖上時顯示的提示資訊BOOL AddTaskBarICON(HWND hwnd,UINT uID,HICON hicon,LPSTR lpszTip) { BOOL res; NOTIFYICONDATA tnid; tnid.cbSize=sizeof(NOTIFYICONDATA); tnid.hWnd=hwnd; tnid.uID=uID; tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; //使用者點擊表徵圖時傳給指定視窗的回呼函數的訊息,由程式員自訂tnid.uCallbackMessage=MYWM_NOTIFYICON; tnid.hIcon=hicon; if (lpszTip) lstrcpyn(tnid.szTip,lpszTip,sizeof(tnid.szTip)); else tnid.szTip[0]=‘/0' //NIM_ADD:添加表徵圖res=Shell_NotifyIcon(NIM_ADD,&tnid); if(hicon) DestroyIcon(hicon); return res; } //DeleteTaskBarIcon:移去AddTaskBar的狀態區上的指定表徵圖,成功則返回TRUE,否則返回FALSE //hwnd:添加表徵圖時指定的視窗//uID:要刪除的表徵圖標識號BOOL DeleteTaskBarIcon(HWDN hwnd,UITN uID) { BOOL res; NOTIFYICONDATA tnid; tnid.cbSize=sizeof(NOTIFYICONDATA); tnid.hWnd=hwnd; tnid.uID=uID; //NIM_DELETE:移去表徵圖res=Shell_NotifyIcon(NIM_DELETE,&tnid); return res; }
接收表徵圖返回的訊息
_________________________________
狀態區的表徵圖可以接收使用者的輸入,將接收到的滑鼠訊息傳送到指定視窗的回呼函數,程式可以對使用者的輸入做出相應的反應。下面是對應的視窗回呼函數和訊息處理函數的例子:
//MainWndProc:視窗回呼函數,處理傳遞給視窗的訊息//Windows根據在添加表徵圖時指定的視窗控制代碼確定對應的回呼函數LRESULT CALLBACK MainWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){switch(message){//MYWM_NOTIFYICON:添加表徵圖時指定的訊息 case MYWM_NOTIFYICON: //調用自訂的訊息處理函數 ON_MYWM_NOTIFYICON(wParam,lParam); break; …… case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowsProc(hwnd,message,wParam,lParam)); } return lParam;}//On_MYWM_NOTIFYICON:處理TaskBar的狀態區表徵圖產生的訊息//wParam:回調訊息的第一個參數,表徵圖的標識號//lParam:回調訊息的第二個參數,滑鼠訊息的代號void ON_MYWM_NOTIFYICON(WPARAM wParam,LPARAM lParam){ UINT uID; UINT uMouseMsg; uID=(UINT) wParam; uMouseMsg=(UINT) lParam; //本函數只處理了滑鼠左鍵單擊訊息,類似可以添加處理其它 //滑鼠訊息的代碼 if(uMouseMsg=WM_LBUTTONDOWN)//當使用者使用滑鼠左鍵單擊時顯示一個訊息框,MessageBox(NULL,"Be happy,don't worry.", "TaskBarICON",MB_OK);return;}
7.怎樣用代碼來最小化或恢複程式
你能夠用下面三種方法之一來實現它。
方法一:發送一條Windows訊息到主視窗的Handle屬性或Application->Handle。這條訊息就是WM_SYSCOMMAND,將wParam設為SC_MINIMIZE或SC_RESTORE。你可以調用SendMessageAPI函數來發送訊息。
//設定WPARAM為SC_MINIMIZE來已最小化的視窗
SendMessage(Application->Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
//設定WPARAM為SC_RESTROE來恢複視窗
SendMessage(Application->Handle,WM_SYSCOMMAND,SC_RESTORE,0);
方法二:調用ShowWindowAPI函數。你必須傳送Application物件控點到ShowWindow函數。如果你傳送給ShowWindow函數的控制代碼是主視窗,那麼主視窗將最小化到案頭(desktop)而不是任務條(taskbar)。
//最小化:傳送SW_MINIMIZE到ShowWindow
ShowWindow(Application->Handle,SW_MINIMIZE);
//恢複:傳送SW_RESTORE到ShowWindow
ShowWindow(Application->Handle,SW_RESTORE);
方法三:調用Application對象的Minimize或Restore函數。
//調用Minimize最小化應用程式
Application->Minimize();
//調用Restore恢複應用程式
Application->Restore();
調用Application的方法較易用,但發送WM_SYSCOMMAND訊息功能更強。另外,WM_SYSCOMMAND訊息允許你最大化程式,改變游標為協助游標,滾動程式,移動一個視窗,改變視窗大小,甚至類比Alt-TAB切換到另一視窗。緊記,實現這些功能用API函數更好。
儘管調用ShowWindow也能工作,你大概也不想用它來最小化或恢複程式。當隱藏的視窗被最小化時ShowWindow會引起最小化動畫出現。這看上去稍微有點傻,因為動畫是從程式主視窗的位置遠離中心。
8.BCB中派生VCL類及動態地建立控制項
以產生一個TMemo的衍生類別及動態地建立該VCL控制項為例。
Class TMemoEx : public TMemo
{
.
.
}
extern TMemoEx memoex;
Class TForm1 : Class TForm
{
public:
TMemoEx *MemoEx;
.
.
}
void _fastcall TForm1::FormShow(TObject *Sender)
{
MemoEx=new TMemoEx(this);
MemoEx->Parent=this;
.
.
}
總之,遵循以下步驟即可:
類定義;
extern TMemoEx memoex;
TMemoEx *MemoEx;
MemoEx=new TMemoEx(this);
MemoEx->Parent=this;