mirror of
https://github.com/VincentWei/minigui-docs.git
synced 2025-10-16 23:08:02 +08:00
5.4 KiB
5.4 KiB
滑块
滑块通常用于调节亮度、音量等场合。在需要对某一范围的量值进行调节时,就可以使用滑块控件。以 CTRL_TRACKBAR
为控件类名调用 CreateWindow
函数,即可创建滑块。图 1.1 是滑块控件的典型运行效果。
1.1 滑块风格
滑块控件的常用风格组合为:
WS_CHILD | WS_VISIBLE | TBS_NOTIFY
指定 TBS_NOTIFY
风格,可让滑块产生通知消息。
默认情况下,滑块是水平的。如果想要创建竖直的滑块,可指定 TBS_VERTICAL
风格。图 1.2 中的滑块就是竖直滑块:
滑块的另外几个风格说明如下:
TBS_TIP
:在滑块两端显示文字说明(如__图 1.1__ 中的“Min”和“Max”那样)。具有这一风格时,滑块控件还将在控件的中部显示当前刻度值。TBS_NOTICK
:不显示刻度。TBS_BORDER
风格可使滑块带有边框,该风格不常用。
1.2 滑块消息
滑块的消息相对简单,总结如下:
TBM_SETRANGE
:通过wParam
和lParam
参数分别设置滑块的最小值和最大值。默认的范围是 0~10。TBM_GETMIN
:获得滑块的最小值。TBM_GETMAX
:获得滑块的最大值。TBM_SETMIN
:设置滑块的最小值。TBM_SETMAX
:设置滑块的最大值。TBM_SETLINESIZE
:通过wParam
参数设置滑块的步进值。当用户在滑块拥有输入焦点时按下向上或向下光标键,将使滑块向上或向下移动该步进值。默认的步进值是 1。TBM_GETLINESIZE
:获得滑块的步进值。TBM_SETPAGESIZE
:通过wParam
参数设置滑块的快速步进值。当用户在滑块拥有输入焦点时按下PageUp
和PageDown
键,将使滑块分别向上或向下移动该快速步进值。默认的快速步进值是 5。TBM_GETPAGESIZE
:获得滑块的快速步进值。TBM_SETPOS
:设置滑块的位置。TBM_GETPOS
:获得滑块的位置。TBM_SETTICKFREQ
:设置刻度间距,默认间距是 1。TBM_GETTICKFREQ
:获得刻度间距。TBM_SETTIP
:设置最小值及最大值处的文字说明。TBM_GETTIP
:获取最小值及最大值处的文字说明。
1.3 滑块通知码
当滑块控件具有 TBS_NOTIFY
风格时,可能产生如下通知消息:
TBN_CHANGE
:滑块的位置发生了变化。TBN_REACHMAX
:已到达了上限。TBN_REACHMIN
:已到达了下限。
1.4 编程实例
清单 1.1 给出了滑块控件的一个示例程序。该程序根据当前滑块的位置在窗口中画对应大小的圆。当用户改变滑块的位置时,圆也会接着更新。该程序的运行效果见__图 1.3__,程序的完整源代码见本指南示例程序包 mg-samples
中的 trackbar.c
文件。
清单 1.1 滑块控件的使用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
static int radius = 10;
static RECT rcCircle = {0, 60, 300, 300};
static void my_notif_proc (HWND hwnd, int id, int nc, DWORD add_data)
{
if (nc == TBN_CHANGE) {
/* 当滑块的的位置发生变化时,记录当前值,并通知主窗口重绘 */
radius = SendMessage (hwnd, TBM_GETPOS, 0, 0);
InvalidateRect (GetParent (hwnd), &rcCircle, TRUE);
}
}
static int TrackBarWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
HWND hwnd;
switch (message) {
case MSG_CREATE:
/* 创建滑块 */
hwnd = CreateWindow (CTRL_TRACKBAR,
"",
WS_VISIBLE | TBS_NOTIFY,
100,
10, 10, 280, 50, hWnd, 0);
/* 设置滑块的范围、步进值以及刻度间隔,当前位置等 */
SendMessage (hwnd, TBM_SETRANGE, 0, 100);
SendMessage (hwnd, TBM_SETLINESIZE, 1, 0);
SendMessage (hwnd, TBM_SETPAGESIZE, 10, 0);
SendMessage (hwnd, TBM_SETTICKFREQ, 10, 0);
SendMessage (hwnd, TBM_SETPOS, radius, 0);
/* 设置滑块的通知回调函数 */
SetNotificationCallback (hwnd, my_notif_proc);
break;
case MSG_PAINT:
{
HDC hdc = BeginPaint (hWnd);
/* 以当前滑块位置值为半径绘制圆 */
ClipRectIntersect (hdc, &rcCircle);
Circle (hdc, 140, 120, radius);
EndPaint (hWnd, hdc);
return 0;
}
case MSG_DESTROY:
DestroyAllControls (hWnd);
return 0;
case MSG_CLOSE:
DestroyMainWindow (hWnd);
PostQuitMessage (hWnd);
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
/* 以下创建主窗口的代码从略 */