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