Windows学习心得【静态类】
来源:互联网 发布:数据库实验报告 编辑:程序博客网 时间:2024/05/17 22:12
#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 ; }这些都不太懂,先休息一下吧,等等再看。。慢慢来,谁也一口吃不成个胖子,加油!!!继续努力!!!!
0 0
- Windows学习心得【静态类】
- Windows学习心得【按钮类】
- Windows学习心得【编辑类】
- 学习心得——从静态成员看类的抽象性
- 我的windows学习心得
- windows 服务程序学习心得
- 《windows程序设计》第一章学习心得
- windows类书的学习心得
- Windows学习心得【子窗口】
- Windows学习心得【计时器1】
- Windows学习心得【计时器2】
- Windows学习心得【数字时钟】
- Windows学习心得【模拟时钟】
- Windows学习心得【按钮控件】
- Windows学习心得【自定义光标】
- Windows学习心得【系统菜单】
- Windows学习心得【对话框】
- Windows学习心得【对话框2】
- 深入理解javascript之执行上下文(execution context)
- oracle存储过程和游标的使用
- Androids上显示gif动画
- Operations
- 编程之美初赛第一场_2014
- Windows学习心得【静态类】
- Android彻底退出应用程序
- 浅谈linux字符设备注册
- linux中断线程化分析
- 标准C++中的string类的用法总结
- Thinking in java——Generics Applying a method to a sequence
- pat 1017
- 解決EXP-00091
- 我宁可再来一遍。