C++Builder处理Windows讯息

C++Builder 自定义消息 处理 总结 这几天忙着弄一个SSDT HOOK驱动,一环扣一环啊,无奈要去理解一下C++Builder是怎么定义自定义消息的。网上资料很多,看了几篇,觉得有必要总结下。也希望找到这篇文章的同志,可以省点力气...首先,简单讲一下C++Builder的消息机制,BCB的消息处理集成在每个控件类中,首先主窗口有一个最大的消息处理循环函数MainWndProc,这个函数针对一些由BCB特定的消息做处理,其他的则 阅读详情
前言

虽然C++Builder为一RAD式的程式发展工具,程式设计师在大多数情况下不需理会Windows讯息的细节,只要将心思放在软体元件的事件处理函式即可。然而由於Windows作业系统终究是一个以讯息驱动的系统,因此架构其上的的应用程式自然无法自外於系统之外,在遭遇到C++Builder没有定义的事件时,Windows讯息处理能力仍然是C++Builder程式人不可或缺的能力。

不可否认地,C++Builder所提供的事件处理能力已具备了某一程度的完备性,然而我们也必须承认,在C++Buider建构的VCL美丽新世界中,仍然不免有漏网之鱼。例如使用者自定讯息的处理,Winsock讯息的处理及一些Windows讯息如WM_NC**** 系列的讯息都是C++Builder的物件模型所未包含的。

在本文中我将告诉你如何以C++Builder来处理Windows讯息,并透过此一能力,来达成在一般VCL元件所无法做到的功能。

何谓Window讯息(Message)

大家都知道 Windows是一套以讯息驱动(Message Driven)的作业系统。然而对於讯息本身却讳莫如深,只知其然而不知其所以然,虽然C++Builder将某些Windows讯息封装於事件 (Event)系统中,但身为一个Windows程式设计师,实有必要了解Windows的讯息系统。

所谓讯息是由Windows作业系统送往程式的事件。它是系统中各个物件沟通的方式,举例来说,当移动滑鼠、按下滑鼠键、改变视窗大小时,Windows都会送出讯息以通知程式。当然,为了要辨别事件的内容,Windows系统中定义了许多的讯息,如WM_PAINT,WM_CHAR等等。

当事件发生时,Windows会判断该事件必须由那个程式接收,然後将事件以讯息的方式送往程式的视窗中。虽然在Windows系统中包含了数以百计的事件,但是作业系统并没有为各个事件设计不同的讯息结构,而是以一个一般性的结构来描述讯息,这个结构在C++Builder就称是TMessage。

当然,随着事件的不同,对於讯息的解释也有所不同,在C++Builder中也为各种常用的讯息定义了专属的结构,你可以直接使用它们来解释讯息。这些讯息定义在C++Builder目录下的Include/vcl/messages.hpp中,你可以决定要自行解释TMessage参数或是直接将其转换成专属的结构。很抽象吗? 我举个例子吧,以WM_NCHITTEST讯息来说,C++Builder为它定义了TWMNCHitTest的专属结构,所以你可以直接经由它来得到XPos、YPos等值。或者你也可以直接由TMessage的LParam取得其值,端看你使用的方便。仔细观察TMessage及TWMNCHitTest两个结构,你会发现它们是等价的,也就是说它们的大小是一致的,因此你可以直接用强制转型互相转换(这有点类似union的方法)。

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;

};

};

};

struct TWMNCHitTest

{

Cardinal Msg;

long Unused;

union

{

struct

{

Windows::TSmallPoint Pos;

long Result;

};

struct

{

short XPos;

short YPos;

};

};

} ;

在收到讯息後,程式必须处理该讯息,若是不处理,则可直接将它交给Windows的内定处理程序来处理之,若是程式需要传回值,也可以在此时传回,Windows会将该值传回给呼叫方。如此就完成了讯息传递的程序。

复杂吗?一点也不!了解Windows讯息系统的运作後,我们来看看可以利用它来做些什麽有趣的事吧!

讯息使用范例一 使用者自定标题棒的实作

一般Windows程式的标题棒位於视窗的上方,我们可以利用该标题棒来移动视窗。以下我将为你示范如何利用C++Builder实作出置於视窗左方的标题棒。如图一:

图一 标题棒在左方的视窗。

如上图,你可以很清楚地看到,这个视窗和其他的视窗有很大的不同;它的标题棒位於左方,而且其颜色为绿色,同时其文字的走向为由下而上的90度字形,而其功能则和一般的标题棒相同,你可以将滑鼠移至该处,然後移动该视窗。到底这是如何达成的呢?

WM_NCHITTEST讯息的奥秘

WM_NCHITTEST讯息是一个很特殊的讯息。它是用来决定目前滑鼠所在位置属性的讯息,因此我们可以利用此特性,当滑鼠移至指定的位置时,传回 HTCAPTION,使得系统以为滑鼠目前位於标题棒,如此你就可以移动视窗了。如何?是不是很神奇呢?

由上可知,只要我们适时地拦截WM_NCHITTEST讯息,然後传回HTCAPTION,就可以顺利地欺骗系统,达成在任何位置模拟出标题棒的效果。

C++ Builder的处理讯息的巨集

在C++Builder为了处理讯息的方便,因此定义了叁个处理讯息的巨集(Macro)。

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(WM_NCHITTEST,TMessage,OnNcHitTest)

END_MESSAGE_MAP(TForm)

以上的叁个巨集BEGIN_MESSAGE_MAP、MESSAGE_HANDLER及END_MESSAGE就是C++ Builder定义的巨集,其中比较重要的是MESSAGE_HANDLER;它共需要叁个参数,第一个参数代表讯息的ID,第二个代表参数型态,最後一个则是讯息事件处理函数。

乍看之下,这个巨集似乎和MFC及OWL所使用的巨集有几分神似,没错,不过其机制却更为简单及简洁,我们可以看看C++Builder对於这叁个巨集的原始定义:

#define BEGIN_MESSAGE_MAP virtual void __fastcall Dispatch(void *Message) /

{ /

switch (((PMessage)Message)->Msg) /

{

#define MESSAGE_HANDLER(msg,type,meth) /

case msg: /

meth(*((type *)Message)); /

break;

#define END_MESSAGE_MAP(base) default: /

base::Dispatch(Message); /

break; /

} /

}

相较於MFC或 OWL的可怕巨集,它实在是简单多了,这是因为C++Builder已替你完成了大部份的工作。其实若我们把以上的巨集展开後,可以得到以下的结果:

virtual void __fastcall Dispatch(void *Message)

{

switch (((PMessage)Message)->Msg)

{

case WM_NCHITTEST:

OnNcHitTest(*((TMessage *)Message));

break;

default:

TForm::Dispatch(Message);

break;

}

}

怎麽样?展开之後是不是有恍然大悟的感觉,要弄清楚这个巨集在卖啥膏药是很容易的,如果你玩过MFC的讯息处理机制,再看到以上的巨集,相较之下,实在是小儿科,不过也就因其简单,所以C++Builder的优势益加彰显。

我简单地说明以上的程式:在每个TForm中都定义一个名为Dispatch的虚拟函式,它就是用来处理Windows的讯息的,在大部份情况下,讯息都是呼叫C++Builder所提供的处理函式,因此你不需要修改它。

换句话说,我们只要改写Dispatch函式,就可以藉以处理指定的讯息了。前面提到的叁个巨集只是将这个程序简化而已,没什麽大不了。

自定标题的绘制

由於我们要使用自定的标题,所以你必须将程式所使用的 TForm的BorderStyle性质设为 bsNone,如此你的TForm就不会有标题棒了。

再来你就必须自行绘制标题棒,我们希望绘制一个位於左於的标题,因此我们必须处理TForm的OnPaint事件,然後在此事件中绘制标题棒。以下即为其事件处理函式:

void __fastcall TForm1::FormPaint(TObject *Sender)

{

RECT rc;

::SetRect(&rc,0,0,ClientWidth,ClientHeight);

DrawButtonFace(Canvas,rc,1);

Canvas->Pen->Color=clGreen;

Canvas->Brush->Color=clGreen;

Canvas->Rectangle(0,0,20,ClientHeight);

:// 以下略去

:

}

你可以看到,我们画出一个宽为20,颜色为绿色的标题棒。因此我们处理WM_NCHITTEST讯息的处理函式也必须做相对应的修改:

void __fastcall TForm1::OnNcHitTest(TMessage& Msg)

{

TPoint pt;

pt.x=LOWORD(Msg.LParam);

pt.y=HIWORD(Msg.LParam);

pt =ScreenToClient(pt);

RECT rc;

::SetRect(&rc,0,0,20,ClientHeight);

if (PtInRect(&rc,pt))

Msg.Result = HTCAPTION;

else

DefaultHandler(&Msg);

}

OnNcHitTest函式首先取得目前滑鼠所在点,注意,WM_NCHITTEST讯息所传入的点为相对於萤幕的绝对座标,因此在取得该点後必须利用ScreenToClient函数将它转为TForm的相对座标值,然後再据以判断是否落於我们所定义的标题棒范围内,若是则传回HTCAPTION值,否则就交由内定的处理函式DefaultHandler来处理。如此就完成了一个位於左方的标题棒了。

旋转文字的输出

仔细观察图一,你会发现它所使用的标题字元的方向,已经因应标题棒的转向而成为90旋转的文字,这是如何达成的呢?

其实说穿了没什麽,只是利用传统SDK的绘图方法来画出来的。因为在C++Builder的TFont物件并没有定义文字旋转的属性,所以我们只好透过传统的GDI绘图方法来达成这个目标。

char* msg=Caption.c_str();

LOGFONT fontRec;

memset(&fontRec,0,sizeof(LOGFONT));

fontRec.lfHeight = -13;

fontRec.lfWeight = FW_NORMAL;

fontRec.lfEscapement = 900; // 旋转文字的关键

lstrcpy(fontRec.lfFaceName,"细明体");

HFONT hFont=CreateFontIndirect(&fontRec);

HFONT hOld=::SelectObject(Canvas->Handle,hFont);

::SetRect(&rc,0,0,20,ClientHeight);

::SetTextColor(Canvas->Handle,RGB(255,255,255));

::TextOut(Canvas->Handle,3,ClientHeight-3,msg,lstrlen(msg));

::SelectObject(Canvas->Handle,hOld);

::DeleteObject(hFont);

以上的程式我不打算详加说明,简单地说,它就是建立一个旋转90度的字形,然後将字串以此字形画於萤幕上,此段程式码的关键在於你必须知道Canvas->Handle即是代表GDI绘图的HDC。其馀的函式说明你都可以在一般讲解传统Windows SDK绘图的书籍中找到。

由此我们也可以得到一个经验:虽然C++Builder的快速程式发展环境已经取代了传统SDK式的程式设计中大部份的工作,然而通晓一些必要的SDK程式技巧却可以使你上一层楼。所以我建议你在『行有馀力』时,不妨可以看看SDK相关书籍,充实基础知识。或许我们可以名之为『立足 BCB,放眼 SDK』的学习态度吧!

其他说明

在本程式中因为TForm的BorderStyle性质为bsNone。因此并没有外框,为了美化视窗,所以我写了几个辅助函式来绘出立体框。若你在其他程式中有类似的需求,也可以使用之。

void DoRect(TCanvas* Canvas,RECT& rect,COLORREF cTopColor,COLORREF cBottomColor)

{

POINT p[3];

p[0].x = rect.right;

p[0].y = rect.top;

p[1].x = rect.left;

p[1].y = rect.top;

p[2].x = rect.left;

p[2].y = rect.bottom;

Canvas->Pen->Color=TColor(cTopColor);

Canvas->Polyline(p,3);

p[1].x = rect.right;

p[1].y = rect.bottom;

p[2].x--;

Canvas->Pen->Color=TColor(cBottomColor);

Canvas->Polyline(p,3);

}

void Frame3D(TCanvas* Canvas,RECT& rect,COLORREF cTopColor,COLORREF cBottomColor,int iColWidth)

{

rect.bottom--; rect.right--;

while (iColWidth > 0)

{

iColWidth--;

DoRect(Canvas,rect,cTopColor,cBottomColor);

InflateRect(&rect,-1,-1);

}

rect.bottom++; rect.right++;

}

void DrawButtonFace(TCanvas* Canvas,RECT& rect,int nBevelWidth)

{

Canvas->Brush->Color=clBtnFace;

Canvas->FillRect(TRect(rect));

Frame3D(Canvas,rect,::GetSysColor(COLOR_BTNSHADOW),::GetSysColor(COLOR_WINDOWFRAME),nBevelWidth);

Frame3D(Canvas,rect,::GetSysColor(COLOR_BTNHIGHLIGHT),::GetSysColor(COLOR_BTNSHADOW),nBevelWidth);

}

这叁个函式中最重要的就是 DrawButtonFace,它是用来在一个矩形范围中画出一个类似Button的立体方框,在本程式中我用它来画出TForm的边框。你可以由图一看出它的视觉效果。

程式的改进

前面我们提到改进bsNone视窗视觉效果的方式是利用自行撰写的DrawButtonFace函式来达成,它虽不失为一个解决问题的方法,但是却也因此增加了程式的复杂度,再来我为你示范一种利用改写CreateParams函式的技巧来达成类似功能的方法。

CreateParams是一个虚拟函式,你可以经由它来修改windows的style,因为原先在C++Builder中所定义的Form是一个Dialog(交谈窗),而交谈窗的外形内定是有标题棒的,然而如果我们如前面的方法将外框设为bsNone 的话,那就必须自行画出假的视窗外框,否则看起来不好看。

但是在Windows系统中除了前面的Dialog式的视窗之外,还提供了另一种POPUP式的视窗,只不过在C++Builder并未提供该选项罢了。因此我们其实可以透过改写CreateParams的方式来产生WS_POPUP形式的视窗,如此一来我们就不必煞费周章地撰写画外框的函式了。它的程式其实很简单,只是将Params.Style的WS_DLGFRAME (代表使用Dialog外框),改成另一种WS_POPUP (弹出式视窗)。要做到以上效果,只要利用and及or运算就可以达到了。以下即为其程式码:

void __fastcall TForm1::CreateParams(TCreateParams& Params)

{

TForm::CreateParams(Params);

Params.Style |= WS_POPUP;

Params.Style ^= WS_DLGFRAME;

}

图二为改写後的程式执行结果,不仅程式简洁了许多,而且外观也较好看,那是因为我们在画标题棒时,不会像前面一样将外框盖住的缘故。

图二 利用CreateParams技巧的新程式。

讯息使用范例二 在程式中使用材质背景

许多人在使用网际网路浏览器如Internet Explorer、Netscape上网站时,会发现许多网页上普遍使用了材质图案做为背景,大大加强了它的视觉效果,也使用网页看起来更为美仑美奂,这时也许你会想:这个材质背景是如何做出来的呢?

在以下的文章中,我会示范如何利用C++Builder做出上述的材质背景效果,让你的程式也可以做出如Browser般的效果。此程式的执行效果如图叁

图叁 具有材质片背景的Form

WM_ERASEBKGND讯息说明

WM_ERASEBGGN是在Windows背景将要被清除时,所触发的讯息。在此讯息发生时,会传入要清除的Windows的HDC ( 还记这个SDK中用来绘图的重要角色吧?)。因此我们可以取得此HDC,然後将Canvas的Handle值设为该值,如此便可以在Canvas上作画了。

宣告使用WM_ERASEGKGN

class TForm1 : public TForm

{

__published: // IDE-managed Components

TPanel *Panel1;

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

void virtual __fastcall OnWMEraseBkgnd(TWMEraseBkgnd& Msg);

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(WM_ERASEBKGND,TWMEraseBkgnd,OnWMEraseBkgnd)

END_MESSAGE_MAP(TForm)

};

为了要拦截WM_ERASEBMGN讯息,因此我们必须利用前面谈过的巨集来宣告之,在此我们采用C++Builder为WM_ERASEBKGND定义的TWMEraseBkgnd讯息结构做为参数,同时定义了一个讯息处理函数 OnWMEraseGkgnd。当然,它所传入的讯息参数是前述的TWMEraseBkgnd&。

以材质图案填满画面

在完成了讯息处理函数的定义之後,再来我们就必须撰写实际的程式码。为了在所传入的HDC中做画,我们必须new一个 Canvas,然後自TWMEraseBkgnd中取得HDC的值。

接着为了要将材质背景载入,我们必须new一个Graphics::TBitmap (在这里加上Graphics:: 是因为尚有另一种Tbitmap ,是位於Windows的namespace中的,因此必须以Graphics:: 来区别它的名称空间)。然後,我们就可以利用LoadFromFile将材质背景图案载入。

在完成了以上两个必要的准备动作之後,我们就可以正式将材质背景画在Canvas上面了,首先当然要计算所画的次数,然後利用回圈以Canvas的Draw指令,将它填满整个萤幕。最後不要忘了将new产生的物件,以delete删除之。以下为其程式列表:

void __fastcall TForm1::OnWMEraseBkgnd(TWMEraseBkgnd& Msg)

{

TCanvas* canvas = new TCanvas;

Graphics::TBitmap* bitmap = new Graphics::TBitmap;

bitmap->LoadFromFile("back.bmp");

canvas->Handle = Msg.DC;

int cx = ClientWidth/bitmap->Width + 1;

int cy = ClientHeight/bitmap->Height + 1;

for (int i=0; i<cy; i++)

for (int j=0; j<cx; j++)

canvas->Draw(j*bitmap->Height,i*bitmap->Width,bitmap);

Msg.Result = true;

delete bitmap;

delete canvas;

}

怎麽样?不错吧!其实只要多多充实关於Windows讯息的知识,虽然在C++Builder中直接使用Windows讯息的机会并不多,但是在某些时候,它却可以发挥小兵立大功的效果,在像本节所举的例子一般。

结论

在本文中我为你示范了在C++Builder中处理讯息的方法,同时以一个实际的自定标题棒视窗及材质背景图为范例,仔细说明了其中之技巧。除此之外,在Windows系统中,讯息(Message)是无所不在的,它是许多传统的视窗元件用以互相沟通的元件,因此除非你能保证你永远不会使用到别的标准元件,否则你就必须 

VC基于Windows API实现屏幕软键盘 内容索引:VC/C++源码,系统相关,软键盘  基于Windows API实现的屏幕软键盘,一个比较有用的小程序,也是很好的编程参考资料,帮你更进一步了理解Windows API的使用方法。程序里面有Button的Subclassing两个东西,同时自己处理鼠标消息;钩子函数基于CodeGuru上的一个OnScreenKeyboa。 立即下载

相关推荐

Aurora8b10b光口通信实战:复位时序与IP核配置详解

本文深入解析了Aurora 8B10B协议在FPGA高速光口通信中的核心实践,重点剖析了确保链路稳定启动的关键复位时序与IP核配置细节。通过详解全双工与单工模式下的复位流程、Vivado中IP核的物理层与链路层参数设置,并结合用户逻辑设计实例,为工程师实现可靠的高速数据传输提供了清晰的实战指南。

weixin_29280219的博客 177

win10禁止触摸键盘_如何阻止Windows 10的触摸键盘在登录时出现

win10禁止触摸键盘Recently, my laptop has been presenting me with Windows’ Touch Keyboard every time I open the lock screen…even though my laptop doesn’t have a touch screen. Having a similar issue? Here are...

cum88284的博客 3491

Rockchip RK3568实战:手把手教你调试I2S音频驱动(附ALSA设备树配置详解)

本文提供Rockchip RK3568平台I2S音频驱动的实战调试指南。详细解析了从硬件连接到软件配置的全过程,重点涵盖ALSA驱动框架下的设备树配置、时钟计算、DMA参数设置以及常见问题(如无声、爆音)的排查与解决方法,帮助开发者快速定位并解决音频驱动难题。

weixin_28358083的博客 496

以C++ Builder处理Windows 讯息(Message)

以C++ Builder处理Windows 讯息(Message)前言虽然C++Builder为一RAD式的程式发展工具,程式设计师在大多数情况下不需理会Windows讯息的细节,只要将心思放在软体元件的事件处理函式即可。然而由於Windows作业系统终究是一个以讯息驱动的系统,因此架构其上的的应用程式自然无法自外於系统之外,在遭遇到C++Builder没有定义的事件时,Windows讯息

近山者仁 1500

大疆 DJI Mobile SDK实战指南——从零构建Android示例开发环境

本文提供了一份详尽的DJI Mobile SDK Android开发环境搭建实战指南。文章手把手教你从注册开发者账号、获取App Key,到配置Android Studio、下载官方示例代码,最终成功运行DJI官方Android示例程序,帮助开发者快速入门无人机应用开发,避开常见编译与依赖问题。

weixin_29188043的博客 273

ET篇:Google.Protobuf的学习(理解基本的使用流程)

据我目前所知,ET使用的数据交换协议是Google.Protobuf,所以今天就来学习一下,但是网上许多人都是以高下立判的方式讲解的,对新手小白很不友好,所以我今天就以纯小白的视角和大家一起学习 学习环境: .NET Core2.2 .NET Framework 4.7.2 Rider protobuf-csharp-3.7.0-rc-2 Google.Protobuf简介 prot...

设计师养成记 3563

VC 通过消息处理函数屏蔽按键消息

VC 通过消息处理函数屏蔽按键消息 在创建对话框类的时候,往往会需要屏蔽一些按键消息。 比如:在对话框界面按下回车按键,会自动退出。或者按下Esc按键会自动退出等。 要屏蔽回车按键,也可以重载OnOK方法。 //**************************************************************************

wjeson的专栏 3612

VOS3000线路对接、路由配置与路由分析操作教程

通过本教程,你应该已经掌握了VOS3000的线路对接、路由配置和路由分析的基本操作。添加备用路由:为常用前缀添加备用路由,确保在主路由失效时呼叫仍能正常进行。进入线路管理:点击“系统管理” -> “线路管理” -> “添加线路”。查看日志:在“系统日志”中查看路由选择情况,确保路由配置正确。失败原因:查看失败呼叫的原因(如“无应答”、“线路忙”等)。线路选择:选择之前添加的线路(如“供应商A”)。保存并启用:填写完毕后,点击“保存”并启用路由。路由名称:自定义一个名称(如“路由A”)。

AI_wx_3307623172的博客 2970

C++ Windows上键盘拦截

如果是键盘拦截,需要将KeyboardHookCallback函数事件进行处理,接收消息以后直接返回,而不是将事件传递给下一个钩子或默认过程。如果是仅仅拦截某个进程键盘事件,只需要修改SetWindowsHookEx第3、4个参数即可。

老狼的专栏 548

android 数据库锁的问题

最近在项目中遇到一个错误: 12-26 17:29:10.501 32592 32644 W SQLiteConnectionPool: The connection pool for database '***.db' has been unable to grant a connection to thread 1378 (thread-pool-0) with flags 0x2 for...

低调的成长 2903

Unity3D实战:5分钟搞定RTSP监控视频播放(附完整代码)

本文提供了一套在Unity3D中快速集成RTSP监控视频播放的实战方案。通过采用LibVLCSharp for Unity这一成熟稳定的跨平台中间件,开发者可以轻松实现RTSP流的解码与渲染,并附有完整的C#代码示例,帮助用户在5分钟内完成集成,适用于智慧园区、安防监控等3D可视化场景。

weixin_29001655的博客 191

BCB如何拦截消息

C++ Builder拦截消息 ---- 拦截Windows消息需要以下几步: ---- 在表单头文件内(如Unit1.h) ---- 1. 在类声明中建立消息映射表,把某条消息的处理权交给自定义的消息处理函数。 BEGIN_MESSAGE_MAP MESSAGE_HANDLER(Windows消息名,TMessage,消息处理函数名) MESSAGE_HANDLER(...) EN

ksrsoft的专栏 2151

Vue集成飞书前端JSSDK

文章目录前言<1>飞书前端JSSDK<2>使用步骤1.将JSSDK引入到VUE2.读入数据总结 前言 公司需要使用飞书软件,所以转战飞书开发,也是对新知识的探索与研究,飞书SDK也一直都在更新,路虽远,行必达。 <1>飞书前端JSSDK 1、官网地址:https://open.feishu.cn/document/uYjL24iN/uITO4IjLykDOy4iM5gjM 2、当前使用的飞书前端JSSDk的版本:1.5.4 <!-- 在html文档中 --&gt

A 1万+

Borland C++Builder 3 VS Delphi 3

自从Borland推出了Borland C++ Builder之后,许多人时常会询问BCB和Delphi有什么不同?除了使用的语言(C/C++ v.s. Object Pascal)之外,是不是都一样?也有人经 常会不满的指出,是不是BCB 一定会在功能上落后Delphi一个版本,那么使用BCB的人比 起Delphi 的程序员来说,是不是代表全用BCB的人是二等公民.说实话在BCB ...

huang714的专栏 797

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++ BUILDER 消息处理的深入探索

在本文中我將告訴你如何以C++Builder來處理Windows訊息,並透過此一能力,來達成在一般VCL元件所無法做到的功能。 何謂Window訊息(Message) 大家都知道 Windows是一套以訊息驅動(Message Driven)的作業系統。然而對於訊息本身卻諱莫如深,只知其然而不知其所以然,雖然C++Builder將某些Windows訊息封裝於事件(Event)系統中,但身為

peachblossom的专栏 1333

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++ BUILDER 消息处理的深入探索

C++ BUILDER 消息处理的深入探索 在本文中我將告訴你如何以C++Builder來處理Windows訊息,並透過此一能力,來達成在一般VCL元件所無法做到的功能。 何謂Window訊息(Message)  大家都知道 Windows是一套以訊息驅動(Message Driven)的作業系統。然而對於訊息本身卻諱莫如深,只知其然而不知其所以然,雖然C++Builder將某些W

diligentcat的专栏 825

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++ BUILDER 消息处理的深入探索 (转)

C++ BUILDER 消息处理的深入探索 (转)[@more@]在本文中我將告訴你如何以C++Builder來處理windows訊息,並透過此一能力,來達成在一般VCL元件所無法做到的功能。 何謂Window訊息(Mess...

csobhtdx34120的博客 92

Access Violations 访问冲突(AVs)是Windows编程时发生的最麻烦的错误? (转)

Access Violations 访问冲突(AVs)是Windows编程时发生的最麻烦的错误? (转)[@more@] Access ViolationsXML:namespace prefix = o ns = "u...

csd3176的博客 169

在C++ Builder中通过TPaintBox控件绘制柱形图

在C++ Builder中通过TPaintBox控件绘制柱形图

fall_on_me的博客 765

【语言-C++】Win7 64位系统下出现无法启动屏幕键盘的bug

用下面代码在Win64位系统下调用键盘出现“无法启动屏幕键盘。”的问题。 WinExec("osk.exe",SW_NORMAL); 解决方案: 添加头文件和相关函数 #include #include typedef BOOL (CALLBACK * pWow64DisableWow64FsRedirection)(PVOID *OldValue); typedef BOOL

少莫千华 4419

C++builder自绘控件框架

#ifndef __switch1__ #define __switch1__ #include "gdi.h" //自定义GDI+函数库 class TSwitchButton : public TGraphicControl { private: int m_left; int m_top; int m_width; int m_he

chinayu2007的专栏 3665

对于Canvas与Bitmap两者的关系

想象一下Canvas与Bitmap两者的关系

weixin_44752167的博客 871

拦截Windows消息

                          拦截Windows消息  C++ Builder不愧为Borland公司的优秀产品,用它来开发Windows程序非常快捷高效,但在编程过程中你也会发现它的一些限制性,让你无法实现自己的想法。比如你无法在修改表单的系统菜单;比如使用跟踪栏时,你找不到StartTrack和EndTrack事件,而偏偏你的程序需要这两个事件。Windows API

Woodman007的专栏 1602
上一篇: 用C++ Builder实现图像的特技显示
下一篇: VS2005调试问题解决方案集锦--引用
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值