我忽然发现:TButton既没有处理WM_PAINT,又没有Paint()或者PaintWindow(),那么它是什么时候被绘制的? Form1上放2个TButton,然后设置代码: procedure TForm1.Button1Click(Sender: TObject); begin button2.Repaint; end; procedure TForm1.Button2Click(Sender: TObject); begin ShowMessage('good'); end; 在F…
-------------------- TWinControl收到WM_Paint消息(以后找个例子)-------------------- 1. 消息函数 TWinControl.WMPaint (默认不是双缓冲)2.1 如果没有csCustomPaint状态,并且没有子控件,那么执行inherited,也就是寻找消息索引函数,以及TWinControl.DefaultHandler做进一步处理,后面怎么样不清楚.比如TButton就是继承自它的,有空做实验仔细看看.不过鉴于WM_Pain…
代码如下: function TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint; var Message: TMessage; begin Message.Msg := Msg; Message.WParam := WParam; Message.LParam := LParam; Message.Result := ; if Self <> nil then WindowProc(Message); Resul…
一直对这两个消息的关系不是太了解,借重新深刻学习windows编程的机会研究一番. 1)当窗口从无效变为有效时,比方将部分覆盖的窗口恢复时会重绘窗口时:程序首先会通过发送其他消息调用DefWindowProc,它内部会发送WM_ERASEBKGND消息,然后才会发送WM_PAINT消息,而且不经过消息队列(笔记:这结论从而何来?).用Delphi的代码当场验证: procedure TWinControl.WMSize(var Message: TWMSize); begin UpdateBou…
在研究TCustomControl的显示过程中,怎么样都找不到刷新FWinControls并重新显示的代码: procedure TWinControl.PaintHandler(var Message: TWMPaint); var I, Clip, SaveIndex: Integer; DC: HDC; PS: TPaintStruct; begin DC := Message.DC; then DC := BeginPaint(Handle, PS); try if FControls…
MakeObjectInstance应该不会帮助处理(接收)消息回调函数的返回值,可是有时候又确实需要这个返回值,这可怎么办呢?我是看到这段文字的时候,想到这个问题的: 当WM_PAINT不是由InvalidateRect产生时,即由最大化,最小化等产生时,或者移动产生(移动有时只会产生WM_ERASEBKGND消息)系统先发送WM_ERASEBKGND消息,再发送WM_PAINT消息. 如果处理WM_ERASEBKGND消息时返回FALSE,BeginPaint标记pt.fErase 为TRU…
我在追踪执行: procedure TForm1.Button1Click(Sender: TObject); begin panel1.Left:=panel1.Left-; end; 并且屏蔽TWinControl.WMWindowPosChanged里的UpdateBounds函数后 procedure TWinControl.WMWindowPosChanged(var Message: TWMWindowPosChanged); var Framed, Moved, Sized: Bo…
写在属于自己的体会,哪怕只是一点点,也是真的懂了.否则有那么多书,如果只是不过脑子的学一遍看一遍,又有谁真的掌握了这些知识呢? 这样你或许就明白了为什么不能直接用SendMessage和PostMessage发送WM_PAINT的原因:由于没有invalidate,系统认为窗口没有更新的必要,于是就对发来的WM_PAINT消息不理不睬.解决方案就是——我们自己invalidate!相关的API就是InvalidateRect()和InvalidateRgn(). 还想说一下Invalidate和…
再具体一点,就是TWinControl一般情况下不需要Canvas和Paint(TForm是个例外),而TCustomControl自带这2个. 同时开发者应该使用TGraphicControl,而不是TControl.TControl只是图形控件和句柄控件的共同功能的抽象,用来做很多杂事,比如鼠标.颜色.TCaption等等.…
程序本来是想实现鼠标单击改变背景颜色.可是,程序运行时,为什么没有任何消息触发,背景颜色就一直不断的改变了?WM_PAINT怎么被触发的 #include <windows.h> #include <stdlib.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; void DrawRectangle (HWND) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANC…