BCB使用小技巧(1)

來源:互聯網
上載者:User
 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; 





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.