1 前言
作為和delphi類似的rad(rapid application development)工具,c++ builder的強(qiáng)大功能不僅體現(xiàn)在數(shù)據(jù)庫開發(fā)方面,也凸現(xiàn)于應(yīng)用程序開發(fā)上(令人稱絕的是這兩方面結(jié)合得非常好)。僅就應(yīng)用程序而言,要真正體現(xiàn)c++ builder的優(yōu)勢,開發(fā)出高質(zhì)量的軟件,則在拖拉拽放之外,尚需用到一些進(jìn)階技術(shù)。如消息處理、dll、ole、線程、sdk編程。c++ builder在這些方面都或多或少有獨到的優(yōu)勢。此外,可以方便地制作自定義控件,也是c++ builder的一大特色和高級功能。本文將通過制作一個標(biāo)題棒在窗口左邊的對話框控件,來示范一些c++ builder中關(guān)于控件制作和消息處理的概念,同時涉及到一點sdk編程。我們將要制作的是一個對話框,就如同opendialog等一樣,一調(diào)用其execute()方法,就彈出一個窗口。這個窗口的標(biāo)題棒位于左方,綠色,文字走向為由下而上的90度字形,其功能和一般的標(biāo)題棒相同,可以將鼠標(biāo)移至該處來移動該窗口。
首先來完成這個窗口,然后用它來制作對話框控件。
2 利用wm_nchittest消息制作豎直標(biāo)題的窗口
.wm_nchittest消息
c++builder將某些windows消息封裝于事件(event)中,但無法囊括所有消息,如wm_nc**** 系列消息。wm_nchittest消息發(fā)生于游標(biāo)(cursor)移動或鼠標(biāo)按下、釋放時,返回值指示目前游標(biāo)所在位置,如返回hthscroll表示處于水平滾動條內(nèi),返回htcaption表示處于標(biāo)題棒內(nèi)(參見win32 sdk help)。其參數(shù)xpos、ypos分別表示游標(biāo)的x、y坐標(biāo)(相對于屏幕左上角),分別對應(yīng)于lparam的低字和高字。如果攔截wm_nchittest消息,使得當(dāng)鼠標(biāo)在窗口左邊按下時,人為地將返回值設(shè)為htcaption,則系統(tǒng)將以為是在標(biāo)題棒內(nèi),于是將可以移動窗口,完成了標(biāo)題棒的功能,至于顏色和文字,則與消息無關(guān),將在下面敘述其原理。
.windows消息
消息就是windows操作系統(tǒng)送往程序的事件。但事件數(shù)以百計,操作系統(tǒng)并沒有為各個事件設(shè)計不同的消息結(jié)構(gòu),而是以一個一般性的結(jié)構(gòu)來來描述消息,這個結(jié)構(gòu)在c++ builder中定義為tmessage。另外c++ builder對常見消息定義了專用結(jié)構(gòu),二者對等。可以直接將消息轉(zhuǎn)換為專用結(jié)構(gòu),也可以自行解釋tmessage參數(shù)。以wm_nchittest消息為例,它的定義如下:
struct twmnchittest
{
cardinal msg;
long unused;
union
{
struct
{
windows::tsmallpoint pos;
long result;
};
struct
{
short xpos;
short ypos;
};
};
};
對照tmessage定義:
struct tmessage
{
cardinal msg;
union
{
struct
{
word wparamlo;
word wparamhi;
word lparamlo;
word lparamhi;
word resultlo;
word resulthi;
};
struct
{
long wparam;
long lparam;
long result;
};
};
};
可以發(fā)現(xiàn),tmessage的lparam成員對應(yīng)twmnchittest的pos成員,就是說以下兩行語句
等價:
tpoint pt=tpoint(msg.lparam); //此時msg類型為tmessage
tpoint pt=tpoint(msg.pos); //此時msg類型為twmnchittest
.c++ builder處理消息的宏
在c++ builder中自定義消息處理是較為方便的,結(jié)合wm_nchittest舉例如下:
在窗口類的protected部分加入如下宏定義:
begin_message_map
message_handler(wm_nchittest,tmessage,onnchittest)
end_message_map(tform)
message_handler包含3個參數(shù):wm_nchittest,消息標(biāo)識,也可以為自定義消息如wm_mymessage,這時只需加一個宏如#define wm_mymessage wm_app+1等;第二個參數(shù)tmessage代表消息類型,也可以為符合要求的自定義消息結(jié)構(gòu)類型如tmymsg等,onnchittest為消息處理函數(shù)。這樣,一旦有wm_nchittest消息傳給tform,對該消息的響應(yīng)就完全交由onnchittest函數(shù)處理。onnchittest函數(shù)只有一個參數(shù),類型為message_handler中第2個參數(shù)的引用,即tmessage &或tmymsg &。
.完成圖一的窗口。
作為和delphi類似的rad(rapid application development)工具,c++ builder的強(qiáng)大功能不僅體現(xiàn)在數(shù)據(jù)庫開發(fā)方面,也凸現(xiàn)于應(yīng)用程序開發(fā)上(令人稱絕的是這兩方面結(jié)合得非常好)。僅就應(yīng)用程序而言,要真正體現(xiàn)c++ builder的優(yōu)勢,開發(fā)出高質(zhì)量的軟件,則在拖拉拽放之外,尚需用到一些進(jìn)階技術(shù)。如消息處理、dll、ole、線程、sdk編程。c++ builder在這些方面都或多或少有獨到的優(yōu)勢。此外,可以方便地制作自定義控件,也是c++ builder的一大特色和高級功能。本文將通過制作一個標(biāo)題棒在窗口左邊的對話框控件,來示范一些c++ builder中關(guān)于控件制作和消息處理的概念,同時涉及到一點sdk編程。我們將要制作的是一個對話框,就如同opendialog等一樣,一調(diào)用其execute()方法,就彈出一個窗口。這個窗口的標(biāo)題棒位于左方,綠色,文字走向為由下而上的90度字形,其功能和一般的標(biāo)題棒相同,可以將鼠標(biāo)移至該處來移動該窗口。
首先來完成這個窗口,然后用它來制作對話框控件。
2 利用wm_nchittest消息制作豎直標(biāo)題的窗口
.wm_nchittest消息
c++builder將某些windows消息封裝于事件(event)中,但無法囊括所有消息,如wm_nc**** 系列消息。wm_nchittest消息發(fā)生于游標(biāo)(cursor)移動或鼠標(biāo)按下、釋放時,返回值指示目前游標(biāo)所在位置,如返回hthscroll表示處于水平滾動條內(nèi),返回htcaption表示處于標(biāo)題棒內(nèi)(參見win32 sdk help)。其參數(shù)xpos、ypos分別表示游標(biāo)的x、y坐標(biāo)(相對于屏幕左上角),分別對應(yīng)于lparam的低字和高字。如果攔截wm_nchittest消息,使得當(dāng)鼠標(biāo)在窗口左邊按下時,人為地將返回值設(shè)為htcaption,則系統(tǒng)將以為是在標(biāo)題棒內(nèi),于是將可以移動窗口,完成了標(biāo)題棒的功能,至于顏色和文字,則與消息無關(guān),將在下面敘述其原理。
.windows消息
消息就是windows操作系統(tǒng)送往程序的事件。但事件數(shù)以百計,操作系統(tǒng)并沒有為各個事件設(shè)計不同的消息結(jié)構(gòu),而是以一個一般性的結(jié)構(gòu)來來描述消息,這個結(jié)構(gòu)在c++ builder中定義為tmessage。另外c++ builder對常見消息定義了專用結(jié)構(gòu),二者對等。可以直接將消息轉(zhuǎn)換為專用結(jié)構(gòu),也可以自行解釋tmessage參數(shù)。以wm_nchittest消息為例,它的定義如下:
struct twmnchittest
{
cardinal msg;
long unused;
union
{
struct
{
windows::tsmallpoint pos;
long result;
};
struct
{
short xpos;
short ypos;
};
};
};
對照tmessage定義:
struct tmessage
{
cardinal msg;
union
{
struct
{
word wparamlo;
word wparamhi;
word lparamlo;
word lparamhi;
word resultlo;
word resulthi;
};
struct
{
long wparam;
long lparam;
long result;
};
};
};
可以發(fā)現(xiàn),tmessage的lparam成員對應(yīng)twmnchittest的pos成員,就是說以下兩行語句
等價:
tpoint pt=tpoint(msg.lparam); //此時msg類型為tmessage
tpoint pt=tpoint(msg.pos); //此時msg類型為twmnchittest
.c++ builder處理消息的宏
在c++ builder中自定義消息處理是較為方便的,結(jié)合wm_nchittest舉例如下:
在窗口類的protected部分加入如下宏定義:
begin_message_map
message_handler(wm_nchittest,tmessage,onnchittest)
end_message_map(tform)
message_handler包含3個參數(shù):wm_nchittest,消息標(biāo)識,也可以為自定義消息如wm_mymessage,這時只需加一個宏如#define wm_mymessage wm_app+1等;第二個參數(shù)tmessage代表消息類型,也可以為符合要求的自定義消息結(jié)構(gòu)類型如tmymsg等,onnchittest為消息處理函數(shù)。這樣,一旦有wm_nchittest消息傳給tform,對該消息的響應(yīng)就完全交由onnchittest函數(shù)處理。onnchittest函數(shù)只有一個參數(shù),類型為message_handler中第2個參數(shù)的引用,即tmessage &或tmymsg &。
.完成圖一的窗口。