SCROLLINFO结构体中fMask和nPage的理解

还是VC++中有关显示图像的问题。

我们在显示一幅比较大的图像时,要使用带标准滚动条的对话框。涉及对滚动条的操作就不得不提SCROLLINFO这个结构体。只看单词意思就这道这个结构体要储存滚动条的一些信息。究竟是哪些信息呢?我们先看看这个结构体的定义:

typedef struct tagSCROLLINFO

{

  UINT cbSize ;   // SCROLLINFO结构体长度的字节数

  UINT fMask ;    // 指定结构体中哪些成员有效

  int nMin;       // 滚动范围最小尺寸

  int nMax;        // 滚动范围的最小尺寸

  UINT nPage ;        // 页尺寸,用来确定比例滚动框的大小

  int nPos ;     // 滚动框的位置

  int nTrackPos ;   //

}SCROLLINFO,*LPSCROLLINFO;

typedef SCROLLINFO CONST *LPCSCROLLINFO

好了,与其说这个结构体储存的是滚动条的信息,不如说它储存了滚动块的信息。滚动块就是滚动条上的那个滑块。下面我们具体说说这个结构体中几个成员的含义。

首先,fMask,指定哪些成员有效,它的值是这些常亮:SIF_ALL,表示整个结构体都有效,SIF_PAGE,表示nPage成员有效,SIF_POS:nPos成员有效,SIF_RANGE, nMax和nMin有效。这些常量可以用或连接。

nMin:这个值我们通常都设定为0

nMax: 对于这个值,如果我们想在整个客户区显示一个比客户区还要大的图片,这个值就应该等于图片大小和客户区大小的差(水平和竖直两个方向上)

nPage:这个属性表示页尺寸,怎么理解这个属性呢。首先,它的设置是为了根据比例确定滚动块的大小。这个值通常就取客户区的大小。但是要特别注意:当nMax<=nPage时,这时候如果使用nPage属性,将不会显示滚动条!!!!前面说过,nPage的设置是为了根据比例设置滚动块的大小。我们平时看到的滚动条的滚动块有大有小,有的滚动块的大小还会随着浏览篇幅的变化而变化。与这个nPage属性有很大关系。但是:nMax<=nPage不代表没有必要使用滚动条,只要nMax>nMin ,就是需要滚动条的,但是当nMax<nPage时,我们通常不设置nPage 属性(设置分fMask时不选SIF_PAGE),这样就可以显示出滚动条了,只不过滚动块的大小是标准大小,不是根据比例确定的大小而已。

原文地址:https://www.cnblogs.com/weekbo/p/9092672.html

时间: 2024-11-06 10:12:17

SCROLLINFO结构体中fMask和nPage的理解的相关文章

file结构体中private_data指针的疑惑【转】

本文转载自:http://www.cnblogs.com/pengdonglin137/p/3328984.html hi all and barry, 最近在学习字符设备驱动,不太明白private_data在字符驱动中的作用,我们在 驱动中添加一个设备结构体,然后定义了这个结构体的全局指针变量,接着我们就能在 驱动程序中使用这个指针了.我看到很多驱动程序中都把结构体指针付给private_data, 然后对private_data操作. 为什么要使用private_data,难道仅仅是避免使

结构体中的数据对齐

c语言结构中需要注意的就是数据存储的对齐方式. 对齐的好处:对齐主要是为了方便数据的访问,提高计算机的处理速度,但同时它会浪费内存空间. CPU的优化规则大致是这样的:对于n字节的元素,它的首地址能被n整除,才能获得最好的性能. 对齐的使用原则: 1.一般的基本对齐原则是按着最大的基本类型的长度进行对齐.较小的元素可以组合起来填充一段内存,实现基本的对齐.前提是其满足条件2. 2.结构体中的元素也要满足一定的分布条件,就是元素的存储起始地址要满足能够整除该元素类型的长度. 3.在结构体中存在结构

结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占用int长度空间,空数组不占任何空间.“这个数组不占用任何内存”,意味着这样的结构节省空间:“该数组的内存地址就和它后面的元素地址相同”,意味着无需初始化,数组名就是后面元素的地址,直接就能当指针使用. 这样的写法最适合制作动态buffer,因为可以这样分配空间malloc(sizeof(struc

libev 中 ev_loop 结构体中的成员变量

1.ev_loop是libev用来描述事件循环的结构体.在libev中的定义比较绕,这里把它摘抄出来,做下注释,方便学习.libev的定义如下 struct ev_loop { ev_tstamp ev_rt_now; #define ev_rt_now ((loop)->ev_rt_now) #define VAR(name,decl) decl; #include "ev_vars.h" #undef VAR }; #include "ev_wrap.h"

遍历结构体中的变量

public struct Site  {  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]  public string Country;     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]  public string StationNumber;     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]  publi

结构体中函数指针与typedef关键用途(函数指针)

// 结构体函数指针.  #include<stdio.h> //为了代码的移植考虑,一般使用typedef定义函数指针类 ,另一个好处是,减少代码的书写量.  typedef void (*shout)(char *name,int age); typedef struct {  //用指针来存储字符串     char *name;    int age ;    shout personinfo; }person; //类似于c++中类方法的实现,在这里,是为结构体中指针函数提供实现.在

结构体中的位域

在储存信息时,有时并不需要一个字节的空间而是只需要几个二进制位就足够了.因此在C语言中为了节省空间提高效率,因此引出了位域(也叫位段)的概念. 如下代码中: #include<stdio.h> typedef struct Test { char a : 1; char b : 1; char c : 1; }Test; void main() { printf("sizeof(Test) = %d\n",sizeof(Test)); } a,b,c都是字符类型,而每个字符

对于结构体中内存对齐的简单说明

结构体内存对齐的原因: 在运行一个结构体时,编译器需要给结构体中的每个变量成员分配内存空间,如这样一个结构体中 typedef struct A { char c1; int i; int j; }A; 对其内存空间分配问题进行分析,如若不进行内存对齐,它的内存空间是: char类型变量c1占1个字节,紧接着int类型变量i与j分别占4个字节,总有9个字节,在访问时,如图1,访问次数较多:在图2中,总有12个字节空间,虽然浪费了c1后的三个字节空间,访问次数却变少,会很大程度上节省了时间,提高了

认真体会 结构体中的零长度数组

以前只是知道这个东西,可以解决一些问题,最近自己做一个字符串操作的东东,看了下redis的源码,做个小的总结. struct cl_str_s{ int free; int len; char buf[]; }; 代码的意思是,我们定义了一个结构体,它有这么三个属性,作用很明显不详细说了. 思考两个问题: 1:char buf[]能不能用char *buf代替? 2:如果我把 buf[] 做一个 char *的转换(方便通用printf方法或者其它),那么给定一个转换后变量的地址,我该怎么获取结