#include <windows.h> int idfocus; WNDPROC OldScroll[3]; LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); LRESULT CALLBACK ScrollProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow ) { static TCHAR szAppName[]=TEXT("Control"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style=CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc=WndProc; wndclass.cbClsExtra=0; wndclass.cbWndExtra=0; wndclass.hInstance=hInstance; wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground=CreateSolidBrush(0); wndclass.lpszMenuName=NULL; wndclass.lpszClassName=szAppName; if(!RegisterClass(&wndclass)) { MessageBox(NULL,TEXT("This programe requires windows NT"),szAppName,MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName, TEXT("Control Scroll"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static RECT rect; HINSTANCE hInstance; static int i,cxClient,cyClient,cyChar,color[3]; static TCHAR * szColorLabel[]={TEXT("Red"),TEXT("Green"),TEXT("Blue")}; static COLORREF rgb[3]={RGB(255,0,0),RGB(0,255,0),RGB(0,0,255)}; static HBRUSH hBrush[3],hBrushStatic; static HWND hwndScroll[3],hwndLabel[3],hwndValue[3],hwndRect; TCHAR szBuffer[10]; switch(message) { case WM_CREATE: hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE); //获取程序窗口句柄hInstance //GetWindowLong(HWND,int)用于获取与hwnd相关的窗口的信息 hwndRect=CreateWindow(TEXT("static"),NULL,WS_VISIBLE|WS_CHILD|SS_WHITERECT,0,0,0,0,hwnd,(HMENU)9,hInstance,NULL); //创建SS_WHITERECT类型的静态风格窗口,作为背景 for (i=0;i<3;i++) { hwndScroll[i]=CreateWindow(TEXT("scrollbar"),NULL,WS_CHILD|WS_VISIBLE|WS_TABSTOP|SBS_VERT,0,0,0,0,hwnd,(HMENU)i,hInstance,NULL); //创建3个scrollbar类型的窗口 SetScrollRange(hwndScroll[i],SB_CTL,0,255,FALSE); //scrollbar的范围为0到255 SetScrollPos(hwndScroll[i],SB_CTL,0,FALSE); //将其初始位置设定在0处 hwndLabel[i]=CreateWindow(TEXT("static"),szColorLabel[i],WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)(i+3),hInstance,NULL); //SS_CENTER意思为文本居中 //创建3个标签类型的子窗口,作为记录颜色的标签 hwndValue[i]=CreateWindow(TEXT("static"),TEXT("0"),WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)(i+6),hInstance,NULL); //创建3个标签类型的子窗口,作为记录RGB实际数值的标签 OldScroll[i]=(WNDPROC)SetWindowLong(hwndScroll[i],GWL_WNDPROC,(LONG)ScrollProc); //为三个ScrollBar窗口添加WndProc函数,并且获取之前的ScrollBar窗口过程WNDPROC函数 hBrush[i]=CreateSolidBrush(rgb[i]); //创建三种基本色的画刷 } hBrushStatic=CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT)); cyChar=HIWORD(GetDialogBaseUnits()); return 0; case WM_SIZE: cxClient=LOWORD(lParam); cyClient=HIWORD(lParam); SetRect(&rect,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); } //为ScrollBar初始化位置 SetFocus(hwnd); //将焦点居于主窗口 return 0; case WM_SETFOCUS: SetFocus(hwndScroll[idfocus]); return 0; case WM_VSCROLL: //ScrollBar的控制 i=GetWindowLong((HWND)lParam,GWL_ID); switch(LOWORD(wParam)) { case SB_PAGEDOWN: color[i]+=15; case SB_LINEDOWN: color[i]=min(255,color[i]+1); break; case SB_PAGEUP: color[i]-=15; 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); break; default: break; } SetScrollPos(hwndScroll[i],SB_CTL,color[i],TRUE); wsprintf(szBuffer,TEXT("%i"),color[i]); SetWindowText(hwndValue[i],szBuffer); DeleteObject((HBRUSH)SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(color[0],color[1],color[2])))); InvalidateRect(hwnd,&rect,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),rgb[i%3]); 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); switch(message) { case WM_KEYDOWN: if (wParam==VK_TAB) SetFocus(GetDlgItem(GetParent(hwnd),(id+(GetKeyState(VK_SHIFT)<0 ? 2:1))%3)); break; case WM_SETFOCUS: idfocus=id; break; } return CallWindowProc(OldScroll[id],hwnd,message,wParam,lParam); //对于其他的消息采用旧的窗口回调函数 }