`
java-mans
  • 浏览: 11710972 次
文章分类
社区版块
存档分类
最新评论

子窗口控件(4)之滚动条和静态子窗口的使用

 
阅读更多

滚动条类跟窗体滚动条差不多。

如果想创建和窗口具有相同尺寸的滚动条控件,则可以使用GetSystemMetrics获得水平滚动条的高度

GetSystemMetrics(SM_CYHSCROLL);


或获得垂直滚动条的宽度

GetSystemMetrics(SM_CXVSCROLL);


同样可以窗口滚动条函数来设置滚动条控件的范围和位置

SetScrollRange(hwndScroll,SB_CTL,iMin,iMax,bRedraw);
SetScrollPos(hwndScroll,SB_CTL,iPos,bRedraw);
SetScrollInfo(hwndScroll,SB_CTL,&si,bRedraw);


下面是一个具体的例子,来自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 ;
     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 program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     
     hwnd = CreateWindow (szAppName, TEXT ("Color 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)
{
     static COLORREF crPrim[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 ;
     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) ;          
               // 也可以在winMain函数前赋值给一个HINSTANCE全局变量                        
          hwndRect = CreateWindow (TEXT ("static"), NULL,
                          WS_CHILD | WS_VISIBLE | SS_WHITERECT,//Static Style,SS_CENTER也是这种类型 label
                          0, 0, 0, 0,
                          hwnd, (HMENU) 9, hInstance, NULL) ;
          
          for (i = 0 ; i < 3 ; i++)
          {
                    // The three scroll bars have IDs 0, 1, and 2, with
                    // scroll bar ranges from 0 through 255.
               
               hwndScroll[i] = CreateWindow (TEXT ("scrollbar"), NULL,
                               WS_CHILD | WS_VISIBLE | 
                               WS_TABSTOP | SBS_VERT,//WS_TABSTOP可以用tab键控制焦点,获取焦点会闪亮
                                      0, 0, 0, 0, 
                                 hwnd, (HMENU) i, hInstance, NULL) ;
               
               SetScrollRange (hwndScroll[i], SB_CTL, 0, 255, FALSE) ;
               SetScrollPos   (hwndScroll[i], SB_CTL, 0, FALSE) ;
               
                    // The three color-name labels have IDs 3, 4, and 5, 
                    // and text strings "Red", "Green", and "Blue".
               
               hwndLabel [i] = CreateWindow (TEXT ("static"), szColorLabel[i],
                                             WS_CHILD | WS_VISIBLE | SS_CENTER,
                                             0, 0, 0, 0, 
                                             hwnd, (HMENU) (i + 3), 
                                             hInstance, NULL) ;
               
                    // The three color-value text fields have IDs 6, 7, 
                    // and 8, and initial text strings of "0".
               
               hwndValue [i] = CreateWindow (TEXT ("static"), TEXT ("0"),
                                             WS_CHILD | WS_VISIBLE | SS_CENTER,
                                             0, 0, 0, 0,
                                             hwnd, (HMENU) (i + 6), 
                                             hInstance, NULL) ;
               
               OldScroll[i] = (WNDPROC) SetWindowLong (hwndScroll[i], 
                                             GWL_WNDPROC, (LONG) ScrollProc) ;
               
               hBrush[i] = CreateSolidBrush (crPrim[i]) ;
          }
          
          hBrushStatic = CreateSolidBrush (
                              GetSysColor (COLOR_BTNHIGHLIGHT)) ;
          
          cyChar = HIWORD (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 :
          SetFocus (hwndScroll[idFocus]) ;
          return 0 ;
          
     case WM_VSCROLL :
          i = GetWindowLong ((HWND) lParam, GWL_ID) ;
          
          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 ://拖拽ed位置
          case SB_THUMBTRACK ://拖拽ing位置
               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, &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)    // static text controls
          {
               SetTextColor ((HDC) wParam, crPrim[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)//确定焦点,实现用tab键来转换焦点
     {
     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) ;
}


运行结果如下

分享到:
评论

相关推荐

    子窗口控件

    ### 子窗口控件知识点详解 #### 一、概述 在Windows编程中,子窗口控件是一种非常重要的组件,它们通常被嵌入到父窗口中,以实现更...以上介绍的各种控件和技巧可以帮助开发者有效地利用子窗口控件来提升用户体验。

    滚动条让子控件置顶显示

    在IT界,尤其是在UI设计和开发中,"滚动条让子控件置顶显示"是一种常见的交互设计技术,尤其在类似搜狗语音这样的应用中,它能帮助用户更直观地关注到关键信息。这种设计模式通常用于提升用户体验,确保用户在滚动...

    windows的控件

    在Windows操作系统中,控件是构成用户界面的基本元素,它们通常作为子窗口嵌入到对话框和其他窗口中,用于执行输入输出任务。控件在用户与程序之间架起了交互的桥梁,使得用户可以通过点击按钮、编辑文本框、选择...

    C#控件属性事件大全

    这两个控件提供水平和垂直滚动条,`Value`属性控制当前位置,`Maximum`和`Minimum`定义范围。 15. **OpenFileDialog、SaveFileDialog、FontDialog、ColorDialog控件** 这些对话框用于打开文件、保存文件、选择...

    mfc控件学习

    在实际开发中,还会涉及到控件的定位和大小调整(CRect、CSize对象的使用),控件的样式和扩展样式(如WS_EX_CLIENTEDGE),以及控件之间的通信(如父窗口与子窗口间的消息传递)。此外,MFC还支持自定义控件,通过...

    实用MFC教程——Windows常用控件的使用

    - `WS_CHILD | WS_VISIBLE | SS_CENTER`: 控件的样式,包括子窗口样式、可见性和居中对齐。 - `CRect(10, 10, 150, 50)`: 控件的位置和大小。 - `this`: 指向父窗口的指针。 此外,`CStatic`类还提供了许多成员函数...

    C# 控件缩写大全

    2. **hsc (HScrollBar)**:水平滚动条控件,用于水平滚动。 3. **prg (PropertyGrid)**:属性网格控件,用于编辑和显示对象属性。 4. **spl (Splitter)**:分割器控件,用于调整容器大小。 5. **trb (TrackBar)**:...

    C#控件及常用设计整理

    13. **AutoScroll**:自动滚动功能,当内容超出控件尺寸时自动启用滚动条。 14. **BackColor** 和 **BackgroundImage**:分别表示控件的背景颜色和背景图片。 15. **Enabled**:控件是否可用,默认为True。 16. **...

    深入浅出mfc课堂随练

    useocx2.zip可能包含了如何在MFC项目中使用和定制OCX控件的代码示例。 5. Scribble Demo:Scribble是一个经典的MFC教程应用,它模拟了一个简单的绘图程序。这个程序展示了如何处理鼠标输入,绘制图形,并使用...

    m*f*c常用控件课件—分享一下

    这里`_T("mystatic")`表示控件显示的文本,`WS_CHILD | WS_VISIBLE | SS_CENTER`指定了控件的样式(子窗口、可见以及居中对齐),`CRect(10, 10, 150, 50)`定义了控件的位置和大小,`this`表示当前窗口作为父窗口。...

    第6章 界面编程4-控件

    这些控件通常作为子窗口嵌套在对话框或其它框架窗口中。例如,在一个简单的“输入学生信息”的对话框中,我们可能会看到静态文本框用于显示提示信息,如“请输入姓名”、“请输入年龄”等;而文本编辑框则允许用户...

    C#控件一览表

    - **作用**:当控件中的内容超出其大小时,自动显示滚动条以便查看所有内容。 ##### 13. BackColor 和 BackgroundImage - **功能**:分别获取或设置控件的背景颜色和背景图像。 - **作用**:美化界面,提升用户体验...

    C#控件前缀名大全

    - `tlp`:代表TableLayoutPanel控件,用于使用表格布局管理控件的位置和大小。 ### 3. 菜单和工具栏 这些控件用于创建应用程序的菜单和工具栏。 - `cms`:表示ContextMenuStrip控件,用于创建上下文菜单。 - `mns`...

    Visual Basic 6.0 控件参考指南

    除了基本的文本属性,还可以通过`MultiLine`属性设置多行输入,`ScrollBars`属性控制滚动条的显示。 3. ListBox和ComboBox:提供选择列表。ListBox通常用于多选,ComboBox则支持下拉单选。它们的`AddItem`方法用于...

    C#常用控件的缩写大全

    2. **hsc** (HScrollBar):水平滚动条控件,用于滚动水平方向的内容。 3. **prg** (PropertyGrid):属性网格控件,用于编辑对象的属性。 4. **spl** (Splitter):分割器控件,用于在两个区域之间拖动以调整大小。 5....

    python基础控件.zip

    4. **滚动条(Scrollbar)**: 滚动条控件与列表框、文本区域等配合使用,当内容超出可视区域时,用户可以通过滚动条浏览。 5. **列表框(Listbox)**: Listbox控件用于展示一系列可选择的项,用户可以选择一个或多...

    C#控件大全 全部用法和名称在这里

    - **用途**:如果为`true`,当控件超出其父窗体时,父窗体会自动显示滚动条。 18. **BackColor**: 获取或设置窗体的背景颜色。 - **用途**:设置窗体的背景色。 19. **BackgroundImage**: 获取或设置窗体的背景...

Global site tag (gtag.js) - Google Analytics