创建一个带滚动条的窗口
1、滚动条的理论
将当前显示的内容坐标改为负数,则显示的是下一个等待显示的内容
2、如何创建一个带滚动条的窗口
创建一个带有水平和垂直的滚动条的窗口只需要在CreateWindow函数中说明即可
HWND CreateWindow(
LPCTSTR lpClassName,//你的字符是否使用UNICODE
LPCTSTR lpWindowName,
DWORD dwStyle,//DWORD 就是 Double Word, 每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位
//窗口样式中加上 WS_HSCROLL WS_VSCROLL
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hInstance,
LPVOID lpParam
};
3、对于滚动条windows需要处理的是:
1>处理滚动条中的所有鼠标消息;
2>当用户单击滚动条时提供被单击部分的轻微闪烁
3>当用户拖动滑块时在滚动条内移动滑块
4>当窗口大小被调整时,自动调整滚动条的长度
5>向滚动条所在窗口发送滚动条的相关消息
4、我们要处理的任务:
1>初始化滚动条的位置和滚动条的范围;
2>处理系统发来的消息;
3>根据发来的消息重置滑块的位置;
4>根据滚动条消息重绘客户区显示的内容
===============================
消息响应机制
1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)构成。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单选中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。
2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。
3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。
4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。
接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都会被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。
====================
5、收到的滚动消息
滚动条消息来源同其他消息一样 ,伴随着wParam与lParam消息机制,当窗口为父窗口时消息的来源为wParam,此时可忽略lParam的值,lParam用于子窗口消息。
wParam参数分为两部分,高位字与低位字,其中高位字代表用户松开鼠标键时滑块的最终位置,低位字上代表鼠标在滚动条上的动作,以一个值的形式表现出来,同样,为了方便记忆,有不同的标识符对这些值进行分区,这些标识符定义在WINUSER.H头文件中,以SB_开头。有关滚动条的消息标识符如下:
#define SB_LINEUP 0
#define SB_LINELEFT 0
#define SB_LINEDOWN 1
#define SB_LINERIGHT 1
#define SB_PAGEUP 2
#define SB_PAGELEFT 2
#define SB_PAGEDOWN 3
#define SB_PAGERIGHT 3
#define SB_THUMBPOSITION 4
#define SB_THUMBTRACK 5
#define SB_TOP 6
#define SB_LEFT 6
#defien SB_BOTTON 7
#defien SB_RIGHT 7
#define SB_ENDSCROLL 8
6、需要使用的新函数
1>SetScrollRange 作用是设置所指定的滚动条范围的最小值和最大值
BOOL SetScrollRange(
HWND hWnd, //窗口句柄
int nBar, //被设置的滚动条类型 SB_HORZ表示该窗口的水平滚动条 SB_VERT表示垂直滚动条
int nMinPos, //滚动条的最小位置
int nMaxPos, //滚动条的最大位置
BOOL bRedraw //重绘标志 指定滚动条是否被重绘以反映变化,但参数为TURE,滚动条重绘,FALSE则不被重绘
};
2>SetScrollPos 作用是设置滚动条中的滚动按钮的位置,
int SetScrollPos(
HWND hWnd,//窗口句柄
int nBar,// 被设置的滚动条类型
int nPos, // 滚动条的新位置
BOOL hRedraw //重绘标志
);
=============================
int a[]={33,22,33,22,44,55,66,77,88}
sizeof(a)和sizeof(*a)是什么意思,为什么值是36和4
a 是一个数组,有9位int型
sizeof(a) 就是 a整个的存储字节数 就是 9*4=36
*a相当于a[0] 就是一个存储单元的内容
sizeof(*a) 就相当于 sizeof(int) =4
=============================
鼠标的使用
一、鼠标的介绍
1>鼠标所在的位置
在windows系统下,用户移动鼠标时,在屏幕上一般会以一个斜式的箭头来表示鼠标当前的位置,这个箭头实际上是一个位图格式的小图标,称为“鼠标指针”,鼠标指针具有一个单像素精度的“热点”(hot spot),热点在显示设备上指示了一个精确的位置。当我们去捕获鼠标指针的位置时,实际上是指鼠标指针的这个”热点”所在像素单元的位置。
2>鼠标的术语
单击:按下鼠标按键,然后松开;
双击:连续快速的按下鼠标同一个按键然后松开;
拖动:保持按键按下状态,并移动鼠标。
二、使用鼠标的简单示例
1>获取鼠标指针位置
消息标识符 WM_MOUSEMOVE 当鼠标指针在客户区移动 窗口会得到这个消息
获取鼠标位置的函数 GetCursorPos 函数原型:
BOOL GetCursorPos(LPPOINT lpPoint);
键盘响应事件
GDI介绍
1、GDI作用:负责系统与绘图程序之间的信息交换,处理window程序的图形输出;是由许多的函数组成的一套完善的图形输出系统
2、在诸多的GDI函数中从功能上来说实际上可以主要分为一下5种类型:
1>获取、释放设备环境的函数;
2>获取环境信息的函数;
3>绘图函数;
4>设置、获取设备环境属性的函数;
5>使用GDI对象的函数;
在屏幕上绘图的相关流程,首先,获得设备环境的句柄,当获取成功时就意味着你的应用程序有了在屏幕上绘图的权限,然后你就可以调用GDI中的绘图函数通过设备环境句柄对屏幕进行绘制,等绘制结束后你应该释放这个句柄。
使用计时器
使用计时器主要分为创建、处理、销毁三个部分
创建:创建一个计时器并设定其计时器的任务周期,例如每5秒发送一条WM_TIMER消息;
处理:根据接收到的WM_TIMER消息让程序作出响应的处理;
销毁:window的计时器属于系统资源,在使用完毕后应及时销毁
按钮类控件
文本输入框
从用户哪里获取文字信息是与用户进行交互的一个重要组成部分,输入框的作用是搭建起用户与软件交互的一个直接桥梁之一
文本输入框分为单行输入框和多行输入框,单行输入框即不能进行换行操作,所有内容都将在一行写完,常用来输入一些较短的文本,例如常见的用户名/密码输入框。
多行文本输入框通常用于输入较长的段落式文本,用户可以使用回车键进行换行。
1、文本输入框的创建
创建文本输入框的步骤与创建一个按钮类似,只需要调用CreateWindows创建一个输入框子窗口控件就可以了