BOOL SetWindowPos(
HWND hWnd, // 窗体句柄
HWND hWndInsertAfter, // 放置窗体位置的句柄
int X, // 窗体水平位置坐标
int Y, // 窗体竖直位置坐标
int cx, // 窗体宽度
int cy, // 窗体高度
UINT uFlags // 窗体位置标志
);
通过将参数hWndInsertAfter设置为HWND_TOPMOST就可实现窗体始终位于最上层。
设计步骤
新建一应用程序,双击窗体,添加FormCreate事件的处理函数(见“代码分析”部分)
。
代码分析
FormCreate事件的处理函数的代码如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
with Form1 do
SetWindowPos(Handle,
HWND_TOPMOST,
//hWndInsertAfter参数设置为HWND_TOPMOST
Left,
Top,
Width,
Height,
//窗体的位置和尺寸不变
SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
//SWP_NOACTIVATE:不激活窗体
//SWP_NOMOVE:保持窗体当前位置,忽略X和Y参数
//SWP_NOSIZE:保持窗体当前尺寸,忽略cx 和cy参数
end;
总结
通过hWndInsertAfter参数的不同设置可以实现不同的效果,此参数的取值及其效果见表
1.5。
表1.5 hWndInsertAfter参数的主要取值及其效果说明
HWndInsertAfter参数取值效果说明
HWND_TOP 窗体位于Z order顶部,但在topmost窗体之下
HWND_TOPMOST 窗体位于所有非topmost窗体之上,即使没有激活
HWND_NOTOPMOST 窗体位于所有非topmost窗体之上,但在所有topmost窗体之下
HWND_BOTTOMMOST 窗体位于Z order底部
另外,uFlags有很多值可选,具体请参见MSDN。
第二个问题:
假设有2个窗体Form1和Form2
在Form1上有一个按钮button1用于调用Form2,那么在Button1的onclick事件中写入下列代码
Form2.showmodal