一个关于滚动条的简单程序,有一定的实际意义
2009-11-30 17:23
417 查看
#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); //对于其他的消息采用旧的窗口回调函数 }
相关文章推荐
- 一个关于滚动条的简单程序,有一定的实际意义
- 菜鸟发问,请各位不吝赐教啊! 关于一个简单的程序的理解问题
- 由一个简单的客户端间TCP/UDP通信程序引发的关于设计模式的思考
- 小程序大问题,MSDN中一个小小示例所带来的疑问,一个关于DataList的一个简单应用
- 作业:用JAVA写一个简单的关于数字相加的小程序
- 很久之前关于分治思想的一个简单程序
- 不断重构:关于一个简单的爬虫小程序
- 一个简单关于学生成绩管理的C++程序代码,但是对于拷贝析构函数目前还是不知其作用何在
- 一个简单的关于字符串识别与转换的程序
- 一个文件操作的简单程序:关于文件的fopen、fread、fseek、ftell、fclose等操作(FIFO related)
- 简单LinuxC程序关于逆序一个中英混合字符串
- 一个文件操作的简单程序:关于文件的fopen、fread、fseek、ftell、fclose等操作(FIFO related)
- 关于SIGSLOT的一个简单的程序
- 关于一个简单的矩阵运算程序,将A矩阵加上A矩阵的逆放到B矩阵中。
- 关于提高qn画面质量的一个简单方法,美工和程序来瞧瞧
- 关于兔子的一个简单java程序题
- 一个简单的关于去掉出现重复字符的程序
- 一个简单的爬虫程序(爬取百度百科关于python的一千个页面)
- 《Applications=Code+Markup》读书札记(2)——创建一个简单的 WPF 程序的代码结构及关于 Window 实例位置设置问题
- 第三天 简单的一个程序剖析,关键字,关于变量,常量,标识符,