Windows学习心得【静态类】

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值