#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;//首先是一个回调函数的声明
LRESULT CALLBACK ScrollProc (HWND, UINT, WPARAM, LPARAM) ;
int idFocus ;
WNDPROC OldScroll[3] ;
int WINAPI WinMain (HINSTANCE hInstance, //应用程序当前实例的句柄
HINSTANCE hPrevInstance,//应用程序先前的实例句柄
PSTR szCmdLine, //指向应用程序命令行的字符串的指针
int iCmdShow)//指明窗口如何显示
{
static TCHAR szAppName[] = TEXT ("Colors1") ;
HWND hwnd ;//当前实例的句柄
MSG msg ;//消息
WNDCLASS wndclass ;//类名
wndclass.style = CS_HREDRAW | CS_VREDRAW ;//窗口的显示方式,此处为水平重画和竖直重画
wndclass.lpfnWndProc = WndProc ;//窗口回调函数
wndclass.cbClsExtra = 0 ;//窗口扩展,此处为0
wndclass.cbWndExtra = 0 ;//窗口实例扩展,此处为0
wndclass.hInstance = hInstance ;//窗口的实例句柄
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;//窗口的显示方式,此处设置为应用程序型
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;//鼠标的显示方式,此处设置为标准型
wndclass.hbrBackground = CreateSolidBrush (0) ;//该函数创建一个具有指定颜色的逻辑刷子
wndclass.lpszMenuName = NULL ;//窗口菜单,此处没菜单设为NULL
wndclass.lpszClassName = szAppName ;//窗口类名
if (!RegisterClass (&wndclass))//注册窗口,若注册失败,产生如下的信息
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
创建窗口,如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL
hwnd = CreateWindow (szAppName,
TEXT ("Color Scroll"),//窗口的名字
WS_OVERLAPPEDWINDOW,//指定创建窗口的风格
CW_USEDEFAULT,//指定窗口的初始水平位置,如果该参数被设为CW_USEDEFAULT则系统为窗口选择缺省的左上角坐标并忽略纵坐标参数
CW_USEDEFAULT,//指定窗口的初始垂直位置
CW_USEDEFAULT, //以设备单元指明窗口的宽度。若是CW_USEDEFAULT,则系统为窗口选择一个缺省的宽度
CW_USEDEFAULT,//以设备单元指明窗口的高度。若被设为CW_USEDEFAULT,则系统忽略宽度参数
NULL, //指向被创建窗口的父窗口或所有者窗口的句柄,此处为NULL
NULL, //菜单句柄,或依据窗口风格指明一个子窗口标识,此处为NULL
hInstance, //与窗口相关联的模块实例的句柄
NULL) ;//指向一个值的指针,该值传递给窗口WM_CREATE消息
ShowWindow (hwnd, iCmdShow) ;//显示窗口,hWnd:指窗口句柄。iCmdShow:指定窗口如何显示
UpdateWindow (hwnd) ;//更新窗口,hWnd:指窗口句柄
while (GetMessage (&msg, NULL, 0, 0))//消息循环
{
TranslateMessage (&msg) ;//该函数将虚拟键消息转换为字符消息
DispatchMessage (&msg) ;//该函数分发一个消息给窗口程序
}
return msg.wParam ;//wParam是消息携带的参数,可以是个值,也可以是个地址
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static COLORREF crPrim[3] = { RGB (255, 0, 0), RGB (0, 255, 0),
RGB (0, 0, 255) } ;
//COLORREF类型用来描绘一个RGB颜色
static HBRUSH hBrush[3], hBrushStatic ;
static HWND hwndScroll[3], hwndLabel[3], hwndValue[3], hwndRect ;
static int color[3], cyChar ;
static RECT rcColor ;
static TCHAR * szColorLabel[] = { TEXT ("Red"), TEXT ("Green"),
TEXT ("Blue") } ;
HINSTANCE hInstance ;
int i, cxClient, cyClient ;
TCHAR szBuffer[10] ;
switch (message)
{
case WM_CREATE :
hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;
//GetWindowLong函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值
//第一个参数为窗口句柄及间接给出的窗口所属的窗口类
//第二个参数为指定要获得值的大于等于0的值的偏移量
//GWL_HINSTANCE意为如果父窗口存在,获得父窗口句柄
//这个子窗口句柄也就是窗口的左半部分
hwndRect = CreateWindow (TEXT ("static"),
NULL,//子窗口的名字,此处为无
WS_CHILD | WS_VISIBLE | SS_WHITERECT,//指定创建的风格
//WS_CHILD创建子窗口。不能用于WS_POPUP(创建一个弹出窗口)风格
//WS_VISIBLE,创建一个窗口,最初是可见的
//SS_WHITERECT指定一个用于充满填充窗口背景颜色的长方形,默认的是白色的
0, //这里参数全部设置为0,主要是因为这些子窗口的参数取决于主窗口的参数而定
0,
0,
0,
hwnd,//指向被创建窗口的父窗口或所有者窗口的句柄
(HMENU) 9, //菜单句柄,或依据窗口风格指明一个子窗口标识
hInstance, //与窗口相关联的模块实例的句柄
NULL) ;//指向一个值的指针,该值传递给窗口WM_CREATE消息
for (i = 0 ; i < 3 ; i++)
{
//这里创建的为三个滚动条的句柄
hwndScroll[i] = CreateWindow (TEXT ("scrollbar"),
NULL,//名字,这里为NULL
WS_CHILD | WS_VISIBLE |
WS_TABSTOP | SBS_VERT,//显示方式
//WS_CHILD创建子窗口。不能用于WS_POPUP(创建一个弹出窗口)风格
//WS_VISIBLE,创建一个窗口,最初是可见的
//创建一个控制,这个控制在用户按下Tab键时可以获得键盘焦点。
//按下Tab键后使键盘焦点转移到下一具有WS_TABSTOP风格的控制
//SBS_VERT指定一个垂直滚动条
0, 0, 0, 0,
hwnd, //指向被创建窗口的父窗口或所有者窗口的句柄
(HMENU) i, //菜单句柄,或依据窗口风格指明一个子窗口标识
hInstance, //与窗口相关联的模块实例的句柄
NULL) ;//指向一个值的指针,该值传递给窗口WM_CREATE消息
SetScrollRange (hwndScroll[i], SB_CTL, 0, 255, FALSE) ;
//SetScrollRange函数设置所指定滚动条范围的最小值和最大值
//第一个参数为该子窗口句柄
//第二个参数为滚动条类型
//第三个参数为滚动条的最小位置
//第四个参数为滚动条的最大位置
//第五个参数为重绘标志
SetScrollPos (hwndScroll[i], SB_CTL, 0, FALSE) ;
//SetScrollPos函数设置所指定滚动条中的滚动按钮的位置,如果需要,可重绘滚动条以反映出滚动按钮的新位置
//第一个参数为子窗体的句柄
//第二个参数为滚动条的类型
//第三个参数为滚动条的新位置
//第四个参数为 重绘标志
//此处创建滚动条上方的文本子窗口的句炳
hwndLabel [i] = CreateWindow (TEXT ("static"),
szColorLabel[i],//子窗口的名字
WS_CHILD | WS_VISIBLE | SS_CENTER,//创建风格
//WS_CHILD创建子窗口。不能用于WS_POPUP(创建一个弹出窗口)风格
//WS_VISIBLE,创建一个窗口,最初是可见的
//SS_CENTER指定一个简单的矩形和显示给定的文本为中心的矩形
0, 0, 0, 0,
hwnd, //指向被创建窗口的父窗口或所有者窗口的句柄
(HMENU) (i + 3), //菜单句柄,或依据窗口风格指明一个子窗口标识
hInstance, //与窗口相关联的模块实例的句柄
NULL) ;//指向一个值的指针,该值传递给窗口WM_CREATE消息
//此处创建滚动条下方的数字子窗口的句柄
hwndValue [i] = CreateWindow (TEXT ("static"),
TEXT ("0"),//子窗口的名字
WS_CHILD | WS_VISIBLE | SS_CENTER,//创建风格
//WS_CHILD创建子窗口。不能用于WS_POPUP(创建一个弹出窗口)风格
//WS_VISIBLE,创建一个窗口,最初是可见的
//SS_CENTER指定一个简单的矩形和显示给定的文本为中心的矩形
0, 0, 0, 0,
hwnd, //指向被创建窗口的父窗口或所有者窗口的句柄
(HMENU) (i + 6), //菜单句柄,或依据窗口风格指明一个子窗口标识
hInstance, //与窗口相关联的模块实例的句柄
NULL) ;//指向一个值的指针,该值传递给窗口WM_CREATE消息
OldScroll[i] = (WNDPROC) SetWindowLong (hwndScroll[i],
GWL_WNDPROC, (LONG) ScrollProc) ;
//为滚动条设置一个新的窗口过程
hBrush[i] = CreateSolidBrush (crPrim[i]) ;//该函数创建一个具有指定颜色的逻辑刷子
}
hBrushStatic = CreateSolidBrush (
GetSysColor (COLOR_BTNHIGHLIGHT)) ;
CreateSolidBrush函数创建一个具有指定颜色的逻辑刷子
//GetSysColor判断指定windows显示对象的颜色。返回值,DWORD,指定对象的RGB颜色
//COLOR_BTNHIGHLIGHT意为按钮的3D加亮区
cyChar = HIWORD (GetDialogBaseUnits ()) ;
//GetDialogBaseUnits函数返回系统的对话基本单位,该基本单位为系统字体字符的平均宽度和高度
return 0 ;
case WM_SIZE :
cxClient = LOWORD (lParam) ;获取主窗口的宽度
cyClient = HIWORD (lParam) ;//获取主窗口的高度
SetRect (&rcColor, cxClient / 2, 0, cxClient, cyClient) ;//设置指定矩形的内容
MoveWindow (hwndRect, 0, 0, cxClient / 2, cyClient, TRUE) ;//改变指定窗口的位置和大小
for (i = 0 ; i < 3 ; i++)
{
//改变三个滚动条窗口的位置和大小
MoveWindow (hwndScroll[i],
(2 * i + 1) * cxClient / 14, 2 * cyChar,
cxClient / 14, cyClient - 4 * cyChar, TRUE) ;
MoveWindow (hwndLabel[i],
(4 * i + 1) * cxClient / 28, cyChar / 2,
cxClient / 7, cyChar, TRUE) ;
MoveWindow (hwndValue[i],
(4 * i + 1) * cxClient / 28,
cyClient - 3 * cyChar / 2,
cxClient / 7, cyChar, TRUE) ;
}
SetFocus (hwnd) ;//该函数对指定的窗口设置键盘焦点
return 0 ;
case WM_SETFOCUS :
//当窗口获得一个键盘焦点后发送一个WM_SETFOCUS消息
SetFocus (hwndScroll[idFocus]) ;该函数对指定的窗口设置键盘焦点
return 0 ;
case WM_VSCROLL :
//当窗口的标准垂直滚动条中有滚动的事件发生时,在我们的窗口应用程序的消息队列中将产生一条WM_VSCROLL消息
i = GetWindowLong ((HWND) lParam, GWL_ID) ;//通过该函数来获得相应窗口的ID
//另外lParam的高位字表示子窗口的句柄
switch (LOWORD (wParam))//取wParam的低位字
{
case SB_PAGEDOWN :
color[i] += 15 ;
// fall through
case SB_LINEDOWN :
color[i] = min (255, color[i] + 1) ;
break ;
case SB_PAGEUP :
color[i] -= 15 ;
// fall through
case SB_LINEUP :
color[i] = max (0, color[i] - 1) ;
break ;
case SB_TOP :
color[i] = 0 ;
break ;
case SB_BOTTOM :
color[i] = 255 ;
break ;
case SB_THUMBPOSITION ://用户拖动滚动框和释放鼠标按钮
case SB_THUMBTRACK ://用户拖动滚动框。这个消息发送多次,直到用户释放鼠标按钮
color[i] = HIWORD (wParam) ;//取wParam的高位字
break ;
default :
break ;
}
SetScrollPos (hwndScroll[i], SB_CTL, color[i], TRUE) ;
//SetScrollPos函数设置所指定滚动条中的滚动按钮的位置,如果需要,可重绘滚动条以反映出滚动按钮的新位置
//第一个参数为子窗体的句柄
//第二个参数为滚动条的类型
//第三个参数为滚动条的新位置
//第四个参数为 重绘标志
wsprintf (szBuffer, TEXT ("%i"), color[i]) ;
//函数wsprintf()将一系列的字符和数值输入到缓冲区
SetWindowText (hwndValue[i], szBuffer) ;
//SetWindowText函数改变指定窗口的标题栏的文本内容(如果窗口有标题栏)如果指定窗口是一个控件,则改变控件的文本内容
DeleteObject ((HBRUSH)
SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)
CreateSolidBrush (RGB (color[0], color[1], color[2])))) ;
//CreateSolidBrush函数创建一个具有指定颜色的逻辑刷子
//SetClassLong创建新的画刷,把句柄存入到窗口类中然后删除旧的画刷
//DeleteObject函数删除一个指定的句柄
InvalidateRect (hwnd, &rcColor, TRUE) ;//重绘所指定的矩形
return 0 ;
case WM_CTLCOLORSCROLLBAR :
i = GetWindowLong ((HWND) lParam, GWL_ID) ;
return (LRESULT) hBrush[i] ;
case WM_CTLCOLORSTATIC :
i = GetWindowLong ((HWND) lParam, GWL_ID) ;
if (i >= 3 && i <= 8)
{
SetTextColor ((HDC) wParam, crPrim[i % 3]) ;
//设置指定设备环境(HDC)的字体颜色
SetBkColor ((HDC) wParam, GetSysColor (COLOR_BTNHIGHLIGHT));
//该函数用指定的颜色值来设置当前的背景色
return (LRESULT) hBrushStatic ;
}
break ;
case WM_SYSCOLORCHANGE :
DeleteObject (hBrushStatic) ;
hBrushStatic = CreateSolidBrush (GetSysColor (COLOR_BTNHIGHLIGHT)) ;
return 0 ;
case WM_DESTROY :
DeleteObject ((HBRUSH)
SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)
GetStockObject (WHITE_BRUSH))) ;
for (i = 0 ; i < 3 ; i++)
DeleteObject (hBrush[i]) ;
DeleteObject (hBrushStatic) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
LRESULT CALLBACK ScrollProc (HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int id = GetWindowLong (hwnd, GWL_ID) ;//获取子窗口的ID
switch (message)
{
case WM_KEYDOWN :
if (wParam == VK_TAB)//判断TAB键是否按下
SetFocus (GetDlgItem (GetParent (hwnd),
(id + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3)) ;
//SetFocus函数对指定的窗口设置键盘焦点
//GetDlgItem返回窗口中指定参数ID的子元素的句柄,可以通过返回的句柄对窗口内的子元素进行操作
//GetDlgItem第一个参数为标识含有控件的对话框
//第二个参数为指定将被检索的控件标识符
break ;
case WM_SETFOCUS :
//WM_SETFOCUS消息发送到一个窗口后获得键盘焦点。
idFocus = id ;
break ;
}
return CallWindowProc (OldScroll[id], hwnd, message, wParam, lParam) ;
}
这段代码我还有很多不懂的地方。
case WM_CTLCOLORSCROLLBAR :
i = GetWindowLong ((HWND) lParam, GWL_ID) ;
return (LRESULT) hBrush[i] ;
case WM_CTLCOLORSTATIC :
i = GetWindowLong ((HWND) lParam, GWL_ID) ;
if (i >= 3 && i <= 8)
{
SetTextColor ((HDC) wParam, crPrim[i % 3]) ;
//设置指定设备环境(HDC)的字体颜色
SetBkColor ((HDC) wParam, GetSysColor (COLOR_BTNHIGHLIGHT));
//该函数用指定的颜色值来设置当前的背景色
return (LRESULT) hBrushStatic ;
}
break ;
case WM_SYSCOLORCHANGE :
DeleteObject (hBrushStatic) ;
hBrushStatic = CreateSolidBrush (GetSysColor (COLOR_BTNHIGHLIGHT)) ;
return 0 ;
switch (message)
{
case WM_KEYDOWN :
if (wParam == VK_TAB)//判断TAB键是否按下
SetFocus (GetDlgItem (GetParent (hwnd),
(id + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3)) ;
//SetFocus函数对指定的窗口设置键盘焦点
//GetDlgItem返回窗口中指定参数ID的子元素的句柄,可以通过返回的句柄对窗口内的子元素进行操作
//GetDlgItem第一个参数为标识含有控件的对话框
//第二个参数为指定将被检索的控件标识符
break ;
case WM_SETFOCUS :
//WM_SETFOCUS消息发送到一个窗口后获得键盘焦点。
idFocus = id ;
break ;
}
这些都不太懂,先休息一下吧,等等再看。。慢慢来,谁也一口吃不成个胖子,加油!!!继续努力!!!!