邪恶的Windows任务栏隐藏了一个设计工具窗口的一部分(我不想让它永远在顶部)。
如何轻松获取ScreenH的ClientHeight ????
我设计了一个模板对话框RadioGroupDialog
,其工具窗口上只有TRadioGroup
,Form->AutoSize = true
。它是通过Execute()
方法调用的。
在Execute()
上,必须传递一个TStringList
,其中包含要放置在TRadioGroup
上的项目,对话框表格的标题以及带有屏幕绝对坐标的TRect
对话框表单将居中的位置(即Place->Left = CallingForm->Left + Component->Left
等)
在Execute()
的代码中,在执行某种类型的自动调整大小以在TStringList
中分配TRadioGroup
的所有元素并且在将对话框格式居中于预期位置之后,代码尝试维持屏幕内的对话位置。
向上,向左和向右边框都可以,但是,由于Windows任务栏,对话框由它覆盖:(
如果我可以发现屏幕的ClientHeight,那么使用它而不是Screen->Height
就可以轻松避免这个问题...也知道任务栏高度会有所帮助。好吧,我知道任务栏也会在屏幕的左上角和右上角,所以使用ClientHeight和ClientWidth将是最好的解决方案..
//---------------------------------------------------------------------------
int __fastcall TRadioGroupDialog::Execute(TStringList *Str, AnsiString DlgCaption, TRect Place)
{
ModalResult = 0;
Caption = DlgCaption;
RadioGroup1->Items->Clear();
RadioGroup1->Items->AddStrings(Str);
int TheHeight = 30*RadioGroup1->Items->Count;
int MaxHeight = 4*Screen->Height/5;
int MinHeight = 30;
if(TheHeight > MaxHeight)
{
TheHeight = MaxHeight;
}
else if(TheHeight < MinHeight)
{
TheHeight = MinHeight;
}
RadioGroup1->Height = TheHeight;
Left = ((Place.Left + Place.Right)/2) - Width / 2;
Top = ((Place.Top + Place.Bottom)/2) - Height / 2;
if(Left + Width > Screen->Width)
{
Left = Screen->Width - Width;
}
if(Top + Height > Screen->Height)
{
Top = Screen->Height - Height;
}
if(Left < 0)
{
Left = 0;
}
if(Top < 0)
{
Top = 0;
}
RadioGroup1->ItemIndex = -1;
return ShowModal();
}
//---------------------------------------------------------------------------
示例:Form1包含Button1,当按下它时,它会显示RadioGroupDialog
,其中有四个项目位于Button1中,并带有“Olá”对话框标题:
屏幕中心表格:
按下Button1后屏幕中心的表格:
屏幕底部的表格:
按下Button1后屏幕底部的表格(请参阅第4项未显示):
答案 0 :(得分:4)
使用Screen->WorkArea...
(左/顶部/宽度/高度/矩形)属性来获取屏幕工作区域的坐标和尺寸,不会被任务栏和其他工具栏遮挡。