如何在C ++ Builder上获取ScreenH的ClientHeight

时间:2013-05-21 15:46:04

标签: screen c++builder taskbar

问题

邪恶的Windows任务栏隐藏了一个设计工具窗口的一部分(我不想让它永远在顶部)。

如何轻松获取ScreenH的ClientHeight ????

详细说明

我设计了一个模板对话框RadioGroupDialog,其工具窗口上只有TRadioGroupForm->AutoSize = true。它是通过Execute()方法调用的。

Execute()上,必须传递一个TStringList,其中包含要放置在TRadioGroup上的项目,对话框表格的标题以及带有屏幕绝对坐标的TRect对话框表单将居中的位置(即Place->Left = CallingForm->Left + Component->Left等)

Execute()的代码中,在执行某种类型的自动调整大小以在TStringList中分配TRadioGroup的所有元素并且在将对话框格式居中于预期位置之后,代码尝试维持屏幕内的对话位置。

向上,向左和向右边框都可以,但是,由于Windows任务栏,对话框由它覆盖:(

如果我可以发现屏幕的ClientHeight,那么使用它而不是Screen->Height就可以轻松避免这个问题...也知道任务栏高度会有所帮助。好吧,我知道任务栏也会在屏幕的左上角和右上角,所以使用ClientHeight和ClientWidth将是最好的解决方案..

Execute()

的代码
//---------------------------------------------------------------------------
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();
}
//---------------------------------------------------------------------------

Windows任务栏所做的丑陋事情

示例:Form1包含Button1,当按下它时,它会显示RadioGroupDialog,其中有四个项目位于Button1中,并带有“Olá”对话框标题:

  • 屏幕中心表格: 1

  • 按下Button1后屏幕中心的表格: 2

  • 屏幕底部的表格: 3

  • 按下Button1后屏幕底部的表格(请参阅第4项未显示): 4

1 个答案:

答案 0 :(得分:4)

使用Screen->WorkArea...(左/顶部/宽度/高度/矩形)属性来获取屏幕工作区域的坐标和尺寸,不会被任务栏和其他工具栏遮挡。