两个函数:GetScrolnfo和SetScrollnfo
一个结构:SCROLLINFO
两个消息:WM_CREATE和WM_SIZE

滚动条结构体

typedef struct tagSCROLLINFO {
UINT cbSize;
UINT fMask;
int nMin;
int nMax;
UINT nPage;
int nPos;
int nTrackPos;
} SCROLLINFO, *LPSCROLLINFO;

cbSize:以字节为单位,结构体大小。就调用者这个参数设置为 sizeof(SCROLLINFO)

fMask:指定要设置或检索的滚动条参数。该成员可以是以下值的组合:

nMin:滚动条最小位置

nMax:滚动条最大位置

nPage:滚动页大小

nPos:停止拖动滚顶条后,滚动条位

获取滚动条信息

BOOL GetScrollBarInfo(
HWND hwnd,
LONG idObject,
PSCROLLBARINFO psbi
);

hWnd:是一个滚动条控件的句柄。否则是一个具有WS_VSCROLL或WS_HSCROLL样式的窗口句柄

idObject:指定滚动条对象。这个参数可以是以下值之一

OBJID_CLIENT     hWnd参数是一个滚动条控件的句柄。
OBJID_HSCROLL hWnd窗口水平滚动条。
OBJID_VSCROLL hWnd窗口垂直滚动条。
psbi:指向一个SCROLLBARINFO结构,以获得的信息。再调用GetScrollBarInfo之前,设置cbSize大小为sizeof(SCROLLBARINFO)
设置滚动条参数
int SetScrollInfo(
HWND hwnd,
int nBar,
LPCSCROLLINFO lpsi,
BOOL redraw
);

hwnd:滚动条控件或带标准滚动条的窗体句柄,由nBar参数决定。

nBar:指定被设定参数的滚动条的类型。这个参数可以是下面值

SB_CTL:设置滚动条控件。而参数hwnd必须是滚动条控件的句柄。
SB_HORZ:设置所给定的窗体上标准水平滚动条参数。
SB_VERT:设置所给定的窗体上标准垂直滚动条参数。
lpsi:指向SCROLLINFO结构。在调用SetScrollInfo之前,设置SCROLLINFO结构中cbSize成员以标识结构大小,设置成员fMask以说明待设置的滚动条参数
redraw:指定滚动条是否重画以反映滚动条的变化。
返回值:返回值是滑块的当前位置。

就像所有消息一样,WM_VSCROLL和WM_HSCROLL消息都伴随着wParam和IParam消息参数。当滚动条是窗口的一部分时,可以忽略IParam参数:它只用于滚动条是子窗口时,通常是在对话框中。

wParam参数被分为低位字和高位字。wParam的低位字代表了鼠标在滚动条上的动作。这个值被称为“通知码”,由一个以SB开头的标识符定义(SB代表滚动条)

如果在滚动条的不同部分按住鼠标键不放,程序可能收到多条滚动条消息。当松开鼠标键时,程序会收到一条带有SB_ENDSCROLL通知码的消息。程序通常可以忽略带SB_ENDSCROLL的消息。Windows并不会自己改变滑块的位置,应用程序需要调用SetScrollPos函数来改变它。
将鼠标放在滑块上然后按下鼠标键时,可以移动滑块。这将会生成带SB_THUMBTRACK 和SB_THUMBPOSITION 通知码的滚动条消息。当wParam的低位字是SB_THUMBTRACK时,wParam的高位字是用户拖动滑块的当前位置。这个位置处于滚动条范围的最小值和最大值之间。当wParam的低位字是SB_THUMBPOSITION时,wParam的高位字是用户松开鼠标键时滑块的最终位置。对于其他的滚动条动作,wParam的高位字应被忽略。

 #include<Windows.h>
#include<tchar.h>
#include<stdio.h>
#define NUM 1000 LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR szCmd, int nShow)
{
WNDCLASS WndClass;
TCHAR* ClassName = TEXT("MyClass");
HWND hwnd;
MSG msg;
HBRUSH hBrush; hBrush = CreateSolidBrush(RGB(0x20, 0x85, 0x41));
WndClass.cbClsExtra = ;
WndClass.cbWndExtra = ;
WndClass.hbrBackground = hBrush;
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance = hInst;
WndClass.lpfnWndProc = WindProc;
WndClass.lpszClassName = ClassName;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_VREDRAW | CS_HREDRAW; if (!RegisterClass(&WndClass))
{
MessageBox(NULL, TEXT("Gegister Class Fail!!"), TEXT("error"), MB_OK);
return ;
} //WS_VSCROLL窗口滚动条
hwnd = CreateWindow(ClassName, TEXT("Hello"), WS_OVERLAPPEDWINDOW | WS_VSCROLL, , , , , NULL, NULL, hInst, NULL);
if (hwnd == NULL)
{
MessageBox(NULL, TEXT("Create Window Fail!!"), TEXT("error"), MB_OK);
return ;
}
ShowWindow(hwnd, nShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} return ;
} LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT pt;
TEXTMETRIC ts;
TCHAR buf[];
int i; //行数
static int cyChar; //字体大小
static int cy; //客户区高度
static SCROLLINFO si;
static int position = ;
switch (message)
{
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &ts);
ReleaseDC(hwnd, hdc);
cyChar = ts.tmHeight;
si.cbSize = sizeof(si);
return ;
case WM_SIZE:
//窗口高度
cy = HIWORD(lParam);
si.fMask = SIF_ALL;
si.nMax = NUM - ;
si.nMin = ;
si.nPage = cy / cyChar;
si.nPos = position;
si.nTrackPos = ;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
case WM_VSCROLL:
//当滚动条是窗口的一部分时,可以忽略IParam参数
switch (LOWORD(wParam))
{
case SB_BOTTOM:
si.nPos = si.nMax;
break;
case SB_LINEDOWN:
si.nPos++;
break;
case SB_LINEUP:
si.nPos--;
break;
case SB_PAGEDOWN:
si.nPos = si.nPos + cy / cyChar;
break;
case SB_PAGEUP:
si.nPos = si.nPos - cy / cyChar;
break;
case SB_THUMBPOSITION:
si.nPos = HIWORD(wParam);
break;
default:
break;
}
si.fMask = SIF_POS;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
GetScrollBarInfo(hwnd, SB_VERT, &si);
position = si.nPos;
//UpdateWindow(hwnd);//窗口必须有无效区,否则刷新也是白刷。替换为InvalidateRect强制刷新
//InvalidateRect函数会产生WM_PAINT消息
InvalidateRect(hwnd, NULL, FALSE);
return ;
case WM_PAINT:
GetScrollBarInfo(hwnd, SB_VERT, &si);
hdc = BeginPaint(hwnd, &pt);
for (i = ; i < NUM; i++)
{
_stprintf(buf, TEXT("---------------%d--------------"), si.nPos + i);
TextOut(hdc, , i * cyChar, buf, _tcslen(buf));
}
EndPaint(hwnd, &pt);
return ;
case WM_DESTROY:
PostQuitMessage();//发送WM_QUIT消息
return ;
default:
break;
} return DefWindowProc(hwnd, message, wParam, lParam);
}

创建画刷

HBRUSH CreateSolidBrush(
COLORREF color
);

初始化一个指定颜色的画刷。画笔可以随后被选为任何设备上下文的当前刷子。

获取当前字体信息

BOOL GetTextMetrics(
HDC hdc,
LPTEXTMETRIC lptm
);

该函数把程序当前的字体信息,存放到TEXTMETRIC

最新文章

  1. MonogDB初探增加和删除
  2. PHP保留2位小数 格式化小数、浮点数
  3. README
  4. ActiveReports 9 新功能:可视化查询设计器(VQD)介绍
  5. listview分页
  6. php中json_decode()和json_encode()的使用方法
  7. The Ninth Hunan Collegiate Programming Contest (2013) Problem A
  8. Excel设置数据有效性实现单元格下拉菜单的3种方法(转)
  9. Spark Streaming揭秘 Day5 初步贯通源码
  10. 授予普通域用户远程桌面连接DC/客户端权限
  11. css-a:visited
  12. openStack deep dive,Retake Policy
  13. JAVA实用案例之邮件发送
  14. (五)solr7.1.0之solrJ的使用
  15. IIS命令行管理工具使用
  16. asp.net三层架构增删改查
  17. Canvas锯齿问题
  18. 利用ImageJ快速调整连续切片的对比度
  19. Ubuntu12.04 64bit 下安装VNC server
  20. ny33 蛇形填数

热门文章

  1. application.properties在Spring Boot项目中的位置
  2. 【C#设计模式1】单例模式
  3. MyBatis框架总结
  4. 49.Django起步学习
  5. go打印九九乘法表
  6. 《Mysql 一条 SQL 语句是如何执行的?》
  7. java访问磁盘文件
  8. 精选实用 Chrome 扩展(20)
  9. 华为S5700系列交换机配置文件导出、导入
  10. Centos7.3安装,并设置网络和防火墙