⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compfaq.html

📁 对于学习很有帮助
💻 HTML
📖 第 1 页 / 共 5 页
字号:
Loaded;</FONT></P>

<P><FONT COLOR="#008040">// 将ComponentState中的 csLoading 状态清除 </FONT></P>

<P><FONT COLOR="#008040">// 在这里撰写你想要执行的动作 </FONT></P>
</UL>

<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>
</UL>

<P><A NAME="11_3"></A><B><FONT COLOR="#000000">11.3 在哪里绘制元件最适合?</FONT></B></P>

<UL>
<P><FONT COLOR="#000000">你应该拦截 WM_PAINT 视窗讯息然後利用 Canvas 来绘制元件。然而
VCL 己经帮你拦 截好了,你只须改写元件的 Paint 方法即可。</FONT></P>

<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
TMyClass.Paint;</FONT></P>

<P><B><FONT COLOR="#004080">begin</FONT></B><FONT COLOR="#000000"> </FONT></P>

<UL>
<P><FONT COLOR="#008000">// 如果你的元件是己存在的元件继承下来的,那麽必须在这里呼叫
inherited Paint</FONT></P>

<P><B><FONT COLOR="#004080">inherited</FONT></B><FONT COLOR="#000000">
Paint ;</FONT></P>

<P><FONT COLOR="#008040">// 在这里撰写你想要执行的动作 </FONT></P>
</UL>

<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>
</UL>

<P><A NAME="11_4"></A><B><FONT COLOR="#000000">11.4 如何改变元件的视窗式样?</FONT></B></P>

<UL>
<P><FONT COLOR="#000000">CreateParams方法用来设定元件的视窗式样及其它必须传递至
CreateWindowEx API 的 参数。要改变元件的视窗式样,例如增加或拿掉元件的垂直卷轴只要改写
CreateParams 方法:</FONT></P>

<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
TMyControl.CreateParams(var Params: TCreateParams);</FONT></P>

<P><B><FONT COLOR="#004080">begin</FONT></B></P>

<UL>
<P><B><FONT COLOR="#004080">inherited</FONT></B><FONT COLOR="#000000">
CreateParams(Params); </FONT></P>

<P><B><FONT COLOR="#004080">if</FONT></B><FONT COLOR="#000000"> IWantAScrollBar
</FONT><B><FONT COLOR="#004080">then</FONT></B><FONT COLOR="#000000"> </FONT></P>

<UL>
<P><FONT COLOR="#000000">Params.Style := Params.Style </FONT><B><FONT COLOR="#004080">or</FONT></B><FONT COLOR="#000000">
WS_VSCROLL </FONT></P>
</UL>

<P><B><FONT COLOR="#004080">else</FONT></B><FONT COLOR="#000000"> </FONT></P>

<UL>
<P><FONT COLOR="#000000">Params.Style := Params.Style </FONT><B><FONT COLOR="#004080">and</FONT></B><FONT COLOR="#000000">
</FONT><B><FONT COLOR="#004080">not</FONT></B><FONT COLOR="#000000"> WS_VSCROLL;
</FONT></P>
</UL>
</UL>

<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>
</UL>
</UL>

<P>
<HR WIDTH="100%"></P>

<H3><I><FONT COLOR="#0000FF">第十二部分 Windows API</FONT></I></H3>

<UL>
<P><A NAME="12_1"></A><B><FONT COLOR="#000000">12.1 元件卷动时闪动的很厉害,如何克服这种情况?</FONT></B></P>

<UL>
<P><FONT COLOR="#000000">要卷动元件本身最简单的方法就是改变它的座标然後重画元件,但是这方法会导致元件闪动的很厉害。</FONT></P>

<P><FONT COLOR="#000000">比较好的方法是呼叫 ScrollWindow 或 ScrollWindowEx
Windows API。</FONT></P>

<P><FONT COLOR="#000000">闪动的另一个原因可能来自於 WM_PAINT 及 WM_ERASEBKGND。你可以试著拦截
WM_ERASEBKGND 及 WM_PAINT 讯息然後自己处理绘图动作,包括绘制背景的动作,或
许可以改善闪动的情况。</FONT></P>
</UL>

<P><A NAME="12_2"></A><B><FONT COLOR="#000000">12.2 如何重新启动Windows?</FONT></B></P>

<UL>
<P><FONT COLOR="#000000">使用 ExitWindowsEx Windows API。</FONT></P>
</UL>

<P><A NAME="12_3"></A><B><FONT COLOR="#000000">12.3 如何快速大量地更改元件资料?</FONT></B></P>

<UL>
<P><FONT COLOR="#000000">在进行大量资料更改前後,利用 WM_SETREDRAW 讯息来控制你的元件暂时不要重画,
这不但可以使资料设定速度增快也防止元件闪烁的情况。</FONT></P>
</UL>
</UL>

<P>
<HR WIDTH="100%"></P>

<H3><I><FONT COLOR="#0000FF">第十三部分 控制项边框</FONT></I></H3>

<UL>
<P><A NAME="13_1"></A><B><FONT COLOR="#000000">13.1 为什麽我的元件的 Ctl3D
属性设为 True 之後,它依然没有 3D 的边框呢?</FONT></B></P>

<UL>
<P><FONT COLOR="#000000">如果 ControlStyle 属性内没有包含 csFramed 旗帜那麽
Ctl3D 属性就会没有作用。在元件 的建构函式内加上:</FONT></P>

<P><FONT COLOR="#000000">ControlStyle := ControlStyle + [csFramed];</FONT></P>
</UL>

<P><A NAME="13_2"></A><B><FONT COLOR="#000000">13.2 如何实作 BorderStyle
属性?</FONT></B></P>

<UL>
<P><FONT COLOR="#000000">在控制项设定有没有边框之後要重新建立 window handle:</FONT></P>

<P><FONT COLOR="#000000">FBorderStyle: TBorderStyle; </FONT></P>

<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
SetBorderStyle(Style: TBorderStyle);</FONT></P>

<P><B><FONT COLOR="#004080">property</FONT></B><FONT COLOR="#000000"> BorderStyle:
TBorderStyle </FONT><B><FONT COLOR="#004080">read</FONT></B><FONT COLOR="#000000">
FBorderStyle </FONT><B><FONT COLOR="#004080">write</FONT></B><FONT COLOR="#000000">
SetBorderStyle; </FONT></P>

<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
CreateParams(</FONT><B><FONT COLOR="#004080">var</FONT></B><FONT COLOR="#000000">
Params: TCreateParams); </FONT><B><FONT COLOR="#004080">override</FONT></B><FONT COLOR="#000000">;</FONT></P>

<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
TMyControl.CreateParams(</FONT><B><FONT COLOR="#004080">var</FONT></B><FONT COLOR="#000000">
Params: TCreateParams); </FONT></P>

<P><B><FONT COLOR="#004080">begin</FONT></B></P>

<UL>
<P><B><FONT COLOR="#004080">inherited</FONT></B><FONT COLOR="#000000">
CreateParams(Params);</FONT></P>

<P><B><FONT COLOR="#004080">if</FONT></B><FONT COLOR="#000000"> FBorderStyle
= bsSingle </FONT><B><FONT COLOR="#004080">then</FONT></B><FONT COLOR="#000000">
</FONT></P>

<UL>
<P><FONT COLOR="#000000">Params.Style := Params.Style </FONT><B><FONT COLOR="#004080">or</FONT></B><FONT COLOR="#000000">
WS_BORDER </FONT></P>
</UL>

<P><B><FONT COLOR="#004080">else</FONT></B><FONT COLOR="#000000"> </FONT></P>

<UL>
<P><FONT COLOR="#000000">Params.Style := Params.Style </FONT><B><FONT COLOR="#004080">and</FONT></B><FONT COLOR="#000000">
</FONT><B><FONT COLOR="#004080">not</FONT></B><FONT COLOR="#000000"> WS_BORDER;
</FONT></P>
</UL>
</UL>

<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>

<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
TMyControl.SetBorderStyle(Style: TBorderStyle); </FONT></P>

<P><B><FONT COLOR="#004080">begin</FONT></B></P>

<UL>
<P><B><FONT COLOR="#004080">if</FONT></B><FONT COLOR="#000000"> Style &lt;&gt;
FBorderStyle </FONT><B><FONT COLOR="#004080">then</FONT></B><FONT COLOR="#000000">
</FONT></P>

<P><B><FONT COLOR="#004080">begin</FONT></B></P>

<UL>
<P><FONT COLOR="#000000">FBorderStyle := Style; </FONT></P>

<P><FONT COLOR="#008040">// 重新建立window handle </FONT></P>

<P><FONT COLOR="#000000">RecreateWnd; </FONT></P>
</UL>

<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>
</UL>

<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>
</UL>
</UL>

<P>
<HR WIDTH="100%"></P>

<H3><I><FONT COLOR="#0000FF">第十四部分 控制项式样</FONT></I></H3>

<UL>
<P><A NAME="14_1"></A><B><FONT COLOR="#000000">14.1 当元件重绘时如何防止闪动的情况?</FONT></B></P>

<UL>
<P><FONT COLOR="#000000">如果元件的 ComponentStyle 属性没有包含 csOpaque
旗帜的话,呼叫 Invalidate方法时 会导致元件的背景先被擦掉再重绘。如果你在
Paint 方法中绘制背景,那你应该在元件的建构函式中加上:</FONT></P>

<P><FONT COLOR="#000000">ComponentStyle := ComponentStyle + [csOpaque];</FONT></P>

<P><FONT COLOR="#000000">Max Nilson的回答:</FONT></P>

<P><FONT COLOR="#000000">引起闪动另一个原因可能是 WM_ERASEBKGND 讯息的处理。当
VCL 控制项收到一个 WM_ERASEBKGND 讯息时,它会将元件的背景擦掉然後设定成预设的颜色。如果你的元
件衍生自 TWinControl,而且元件的颜色与背景颜色不同(例如图形),每次重画以
前都会将元件先清成背景颜色再重绘,这就是造成闪动的原因了!</FONT></P>

<P><FONT COLOR="#000000">解决的方法不难,你必须告诉 Windows 你要自行解决『所有的』绘图动作。不过有一
个前提是,你一定要确定你的 Paint 方法将""个元件都画过,如果你漏了什麽地方忘
了画,那个部分的资料会由乱数组成,你能想见这情况吗?使用这个方法可以加速你
的元件绘制动作(稍微快一点点),因为少了一个填满背景颜色的动作。</FONT></P>

<P><B><FONT COLOR="#004080">type</FONT></B></P>

<P><FONT COLOR="#000000">TMyComponent = </FONT><B><FONT COLOR="#004080">class</FONT></B><FONT COLOR="#000000">
(TWinControl)</FONT></P>

<UL>
<P><FONT COLOR="#000000">...</FONT></P>
</UL>

<P><B><FONT COLOR="#004080">protected </FONT></B></P>

<UL>
<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
WMEraseBkgnd(var Message: TWMEraseBkgnd); </FONT><B><FONT COLOR="#004080">message</FONT></B><FONT COLOR="#000000">
WM_ERASEBKGND; </FONT></P>

<P><FONT COLOR="#000000">... </FONT></P>
</UL>

<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">; </FONT></P>

<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
TBMyComponent.WMEraseBkgnd(</FONT><B><FONT COLOR="#004080">var</FONT></B><FONT COLOR="#000000">
Message: TWMEraseBkgnd); </FONT></P>

<P><B><FONT COLOR="#004080">begin</FONT></B></P>

<UL>
<P><FONT COLOR="#008040">// 不要重绘背景,这会造成元件闪动 </FONT></P>

<P><FONT COLOR="#000000">Message.Result := 0 </FONT></P>
</UL>

<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">; </FONT></P>
</UL>
</UL>

<P>
<HR WIDTH="100%"></P>

<H3><I><FONT COLOR="#0000FF">第十五部分 视窗讯息</FONT></I></H3>

<UL>
<P><A NAME="15_1"></A><B><FONT COLOR="#000000">15.1 为什麽我的元件得不到方向键的讯息?
</FONT></B></P>

<UL>
<P><FONT COLOR="#000000">你必须拦截 WM_GETDLGCODE 才能处理方向键的讯息,在
WM_GETDLGCODE 的讯息处理 者中传回 DLGC_WANTARROWS。如果你不这样做,那方向键的功用就只能用来移动视窗
焦点而己。</FONT></P>

<P><FONT COLOR="#000000">Max Nilson 的回答:</FONT></P>

<P><FONT COLOR="#000000">想要你的元件能够处理方向键,你必须要拦截 CM_WANTSPECIALKEY
元件讯息。 CM_WANTSPECIALKEY 元件讯息提供你比拦截 WM_GETDLGCODE 视窗讯息更容易且灵活的
判断方法来决定是否需要某些特殊键的讯息。当控制项收到任何一个特殊键时就会送
出CM_WANTSPECIALKEY 元件讯息给控制项。</FONT></P>

<P><FONT COLOR="#000000">特殊键包括:VK_TAB、VK_LEFT、VK_RIGHT、VK_UP、VK_DOWN、VK_RETURN、VK_EXECUTE
、VK_ESCAPE 及 VK_CANCEL。如果讯息传回值是非零值,这个键就会被送至 KeyPress
方法以供处理,否则这个键的讯息会被送至元件的父控制项,以预设方式来处理。</FONT></P>

<P><FONT COLOR="#000000">一个简单的范例:</FONT></P>

<P><B><FONT COLOR="#004080">type</FONT></B></P>

<P><FONT COLOR="#000000">TMyComponent = </FONT><B><FONT COLOR="#004080">class</FONT></B><FONT COLOR="#000000">
(TWinControl)</FONT></P>

<UL>
<P><FONT COLOR="#000000">... </FONT></P>
</UL>

<P><B><FONT COLOR="#004080">protected </FONT></B></P>

<UL>
<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
CMWantSpecialKey(var Message: TCMWantSpecialKey); </FONT><B><FONT COLOR="#004080">message</FONT></B><FONT COLOR="#000000">
CM_WANTSPECIALKEY;</FONT></P>

<P><FONT COLOR="#000000">...</FONT></P>
</UL>

<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>

<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
TMyComponent.CMWantSpecialKey(</FONT><B><FONT COLOR="#004080">var</FONT></B><FONT COLOR="#000000">
Message: TCMWantSpecialKey); </FONT><B><FONT COLOR="#004080">begin</FONT></B></P>

<UL>
<P><B><FONT COLOR="#004080">inherited</FONT></B><FONT COLOR="#000000">;</FONT></P>

<P><FONT COLOR="#008040">// 我们只想处理向左方向键,其它的特殊键都给 Windows
处理</FONT></P>

<P><B><FONT COLOR="#004080">if</FONT></B><FONT COLOR="#000000"> Message.CharCode
= VK_LEFT </FONT><B><FONT COLOR="#004080">then</FONT></B></P>

<UL>
<P><FONT COLOR="#000000">Message.Result := 1; </FONT></P>
</UL>
</UL>

<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>

<P><FONT COLOR="#000000">CM_WANTSPECIALKEY 元件讯息比 WM_GETDLGCODE 讯息更具有弹性的地方在这儿。我们
甚至可以根据是按下的是哪个特殊键才决定是否处理这个键。例如,你的控制项有三张影像,你可以

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -