如何在运行时确定垂直滚动条已出现在界面上?(300分)

  • 主题发起人 主题发起人 anna_zb
  • 开始时间 开始时间
A

anna_zb

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在运行时确定垂直滚动条已出现在界面上?
有无相应的属性或方法判断?(如Visible等)
 
好像没有,不知道你要这东西干嘛
 
动态调整界面中的列宽,确保界面的整体效果.
比如在设计时是按滚动条没有出现考虑的,因而能确保满屏显示,但当滚动条出现时却不好
处理了.本来可以根据有多少条记录的出现来算出滚动条是否出现,但这只能保证用户不
调整窗体大大小时正确实现,如果用户调整了窗体的大小则会造成判断失误.
 
到Windows Sdk帮助里查这个函数,肯定可以
GetScrollInfo
 
函数功能:该函数找到滚动条的参数,包括滚动条位置的最小值、最大值,页面大小,
滚动按钮的位置,
函数原型:BOOL GetScrolllnfo(HWND hWnd,int fnBar,LPSCROLLINFO lpsi);
参数:
hWnd:滚动条控制或有标准滚动条的窗体句柄,由fnBar参数确定。
fnBar:指定待找回滚动条参数的类型,此参数可以为如下值,其值含义:
SB_CTL:找回滚动条控制参数。其中参数hwnd一定是处理滚动条控制的句柄。
SB_HORZ:找回所指定窗体的标准水平滚动条参数。
SB_VERT:找回所指定窗体的标准垂直滚动条参数。
lpsi:指向SCROLLINFO结构。
在调用Getscrolllofo函数之前,设置SCROLLINFO结构中cbSize成员以标识结构大小,
设置成员fMask以说明待找回的滚动条参数。
在运行之前,函数复制结构中适当的成员所指定的参数。
成员fMask可以是如下值:
SIF_PAGE:复制滚动页码到由lpsi指向的SCROLLINFO结构的nPage成员中。
SIF_POS:复制滚动位置到由lpsi指向的SCROLLINFO结构的nPos成员中。
SIF_RANGE:复制滚动范围到由lpsi指向的SCROLLINFO结构的nMin和nMax成员中。
SIF_TRACKPOS:复制当前滚动盒跟踪位置到由nTrackPos指向的SCROLLINFO结构的nPage成员中。
返回值:如果函数找到任何一个值,那么返回值为非零;
如果函数没有找到任何值,那么返回值为零;
若要得到更多出错信息,请调用GetLastError函数。
注意:Getscrolllnfo函数尽管WM_HSCROLL和WM_VSCROLL指出了滚动条位置消息,
却仅提供了16位数据,而函数SetScrollnfo和GetScrollnfo则提供了32位的滚动条数据。
因而,当应用程序在处理WM_HSCROLL或 WM_VSCROLL时,
要获得32位滚动条位置的数据时,则要调用Getscrolllnfo函数。
在WM_HSCROLL或WM_VSCROLL消息中SB_THUMBTRACK通告过程中,
为了获得32位的滚动盒位置,需要调用GetScrolllnfo函数以得到结构SCROLLINFO成员
fMask中的SCROLLINFO值。
函数返回在结构SCROLLINFO成员nTrackPos中指出的滚动盒跟踪位置的值。
这将允许当用户移动滚动盒时能得到其位置。
 
if Form1.VertScrollBar.IsScrollBarVisible then
beign
end;

if Form2.HorzScrollBar.IsScrollBarVisible then
begin
end;
 
你可以编程设置每一列的宽度及总宽度啊,
然后如果超宽了可以在总宽度上加上垂直滚动条的宽度
下面一个程序段可能对你有启发:
procedure TForm1.StringGrid1Ini(Sender: TObject);
var
ParaFile:TextFile;
line,N,Name:string;
Row,i:integer;
begin
with stringgrid1 do //设置题头
begin
cells[0,0]:='参数号';
cells[1,0]:='参数名称';
cells[2,0]:='10进制';
cells[3,0]:='16进制';
ColWidths[0]:=38;
ColWidths[1]:=200;
ColWidths[2]:=42;
ColWidths[3]:=42;
width:=ColWidths[0]+ColWidths[1]+
ColWidths[2]+ColWidths[3]+26;
end;
另外你可以在程序用行数*行高和窗体高度比较来判断是否会加垂直滚动条
 
如果是RichEdit控件,各行的字体和字号不一如何确定各行的高度和宽度?
 
to book523
你有例子吗?贴出来。
 
怎么,没人关心了!
 
if getwindowlong(form1.handle, GWL_STYLE) and WS_VSCROLL <> 0 then
// form1有垂直滚动条
 
如果要确定的时某个控件的垂直滚动条?
 
if getwindowlong(memo1.handle, GWL_STYLE) and WS_VSCROLL <> 0 then
// memo1有垂直滚动条
 
我自己解决了这个问题,方法是:
总体思路:如果控件的Width<>控件的ClientWidth+边框的宽度则滚动条出现了!
具体函数如下
//---------------------------------------------------------------------------
void __fastcall Tpbl_Pubilc::DynamicResizeStringGridWidth(
TStringGrid *sgrid_Resize,
const int Ai_ColItem //需调整的列
)
{
int i_ColWidths=sgrid_Resize->ColCount-1;
for(int i_Item=0;i_Item<=sgrid_Resize->ColCount-1;i_Item++)
i_ColWidths+=sgrid_Resize->ColWidths[i_Item];
if(!(i_ColWidths==sgrid_Resize->ClientWidth))
sgrid_Resize->ColWidths[Ai_ColItem]+=
sgrid_Resize->ClientWidth-i_ColWidths;
}
还是要感谢各位朋友的支持;见者有分.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部