设为首页 收藏本站
云服务器等爆品抢先购,低至4.2元/月
查看: 1004|回复: 0

[经验分享] Windows标准控件

[复制链接]

尚未签到

发表于 2017-6-28 12:09:35 | 显示全部楼层 |阅读模式
  学习目的
  学习创建, 使用Windows标准控件(按钮, 滚动条, 静态控件, 列表框, 编辑框, 组合框); 学习使用子窗口控件操作函数(EnableWindow, MoveWindow, SetWindowText, GetWindowText, DestroyWindow).
  编写程序: 设计窗口应用程序, 分别包含按钮, 滚动条, 静态控件, 列表框, 编辑框, 组合框.等标准控件.
  1. 创建按钮控件
  创建子窗口时指定窗口类为button.代码如下:
  //创建按钮
  CreateWindow("button",//必须为:button   
  "向上滚动",//按钮上显示的字符   
  WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
  35, rt.top+10, 120, 60,
  hWnd, (HMENU)IDB_ONE,
  ((LPCREATESTRUCT)lParam)->hInstance,NULL);  
  2.创建滚动条控件
  在创建窗口函数的第三个参数中添加WS_HSCROLL,WS_VSCROLL分别添加垂直和水平滚动条,代码如下:
  hWnd = CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  3. 创建静态控件
  创建子窗口时指定窗口类为static.代码如下:
  //创建静态控件
  CreateWindow("static","这是静态控件",WS_VISIBLE|WS_CHILD,
  200,rt.top+20,100,50,
  hWnd,NULL,((LPCREATESTRUCT)lParam)->hInstance,NULL);
  4. 创建列表框控件
  创建子窗口时指定窗口类为listbox.代码如下:
  //创建列表框
          hWndList=CreateWindow("listbox",NULL,LBS_NOTIFY|WS_CHILD | WS_VISIBLE | LBS_STANDARD,
  200,(rt.bottom+rt.top)/2-100,200,200,
  hWnd,NULL,((LPCREATESTRUCT)lParam)->hInstance,NULL);
  SendMessage (hWndList, LB_ADDSTRING, 0, (LPARAM) "我是列表框") ;
  5. 创建编辑框控件
  创建子窗口时指定窗口类为edit.代码如下:
  //创建编辑框
  CreateWindow ("edit","这是编辑框,\r\n这是编辑框,\r\n这是编辑框,这是编辑框,这是编辑框,这是编辑框,这是编辑框,这是编辑框,\r\n这是编辑框,\r\n这是编辑框,\r\n这是编辑框,\r\n这是编辑框",      
  WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |      
  WS_BORDER | ES_LEFT | ES_MULTILINE |      
  ES_AUTOHSCROLL | ES_AUTOVSCROLL,      
  200, rt.bottom-120, 220, 100, hWnd, NULL,      
  ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
  6. 创建组合框控件
  创建子窗口时指定窗口类为combobox.代码如下:
  //创建组合框
  hWndComboBox=CreateWindow("combobox", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL |  CBS_DROPDOWNLIST | CBS_HASSTRINGS,
  rt.right -300, 20, 200, 400, hWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
  SendMessage(hWndComboBox,CB_ADDSTRING,0,(LPARAM)"我是列表框");   
  for (i=0;i<=50;i++)  
  {
  char temp[10];  
  SendMessage(hWndComboBox,CB_ADDSTRING,0,(LPARAM)itoa(i,temp,10));
  }
  7. 滚动条的事件处理
  在WM_VSCROLL中处理滚动条的消息,代码如下
  case WM_VSCROLL:
  switch (LOWORD (wParam))
  {
  case SB_LINEUP:
  iVscrollPos -= 1 ;
  break ;
  case SB_LINEDOWN:
  iVscrollPos += 1 ;
  break ;
  case SB_PAGEUP:
  iVscrollPos -= cyClient / cyChar ;
  break ;
  case SB_PAGEDOWN:
  iVscrollPos += cyClient / cyChar ;
  break ;
  case SB_THUMBPOSITION:
  iVscrollPos = HIWORD (wParam) ;
  break ;
  default :
  break ;
  }
  iVscrollPos = max (0, min (iVscrollPos, NUMLINES-1)) ;
  if (iVscrollPos != GetScrollPos (hWnd, SB_VERT))
  {
  SetScrollPos (hWnd, SB_VERT, iVscrollPos, TRUE) ;
  InvalidateRect (hWnd, NULL, TRUE) ;
  }
  break;
  8. 按钮控件的事件处理
  同主窗口菜单一样,在WM_COMMAND中处理按钮控件的消息,代码如下
  case WM_COMMAND:
  wmId    = LOWORD(wParam);
  wmEvent = HIWORD(wParam);
  // Parse the menu selections:
  switch (wmId)
  {
  case IDM_ABOUT:
  DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
  break;
  case IDM_EXIT:
  DestroyWindow(hWnd);
  break;
  case IDB_ONE:
  iVscrollPos++;
  //MessageBox(hWnd, "您点击了第一个按钮。", "提示", MB_OK | MB_ICONINFORMATION);     
  break;     
  case IDB_TWO:
  iVscrollPos--;
  //MessageBox(hWnd, "您点击了第二个按钮。", "提示", MB_OK |MB_ICONINFORMATION);     
  break;     
  case IDB_THREE:
  itoa(iVscrollPos, szList, 10);
  //SendMessage (hWndList, LB_RESETCONTENT, 0, 0) ;
  SendMessage (hWndList, LB_INSERTSTRING, -1, (LPARAM)    szList) ;
  //MessageBox(hWnd, "这个按钮没有功能。", "提示", MB_OK |MB_ICONINFORMATION);     
  break;     
  default:
  return DefWindowProc(hWnd, message, wParam, lParam);
  }
  9. 向列表框和组合框中添加数据条目
  向相应控件发送消息来向其中添加数据,代码如下
  //向列表框中添加数据
  SendMessage (hWndList, LB_ADDSTRING, 0, (LPARAM) "我是列表框") ;
  //向组合框中添加数据
  SendMessage(hWndComboBox,CB_ADDSTRING,0,(LPARAM)"我是组合框");
  10.启用、禁用窗口控件
  使用EnableWindow()函数启用与禁用窗口控件,具体代码如下:
  case IDB_ENWIN:
  if(IsCbBoxEnable==true)
  {
  EnableWindow(hWndComboBox,false);
  IsCbBoxEnable=false;
  SetWindowText(GetDlgItem(hWnd,IDB_ENWIN),"启用组合框->");
  }
  else
  {
  EnableWindow(hWndComboBox,true);
  IsCbBoxEnable=true;
  SetWindowText(GetDlgItem(hWnd,IDB_ENWIN),"禁用组合框->");
  }
  break;
  11.调整控件位置与大小
  使用MoveWindow()函数调整控件位置与大小,具体代码如下:
  case IDB_MOVWIN:
  GetWindowRect(hWndComboBox, &CbBoxRECT);
  MoveWindow( hWndComboBox,750,CbBoxRECT.top,CbBoxRECT.right-CbBoxRECT.left+30, 400, true );
  break;
  12.控件文字的设置与获取
  使用GetWindowText()函数与SetWindowText()函数获取与设置控件文字,具体代码如下:
  case IDB_GETWINTEXT:
  TCHAR editString[MAX_LOADSTRING];
  //GetWindowText(hWndEdit,editString,MAX_LOADSTRING);
  GetWindowText(hWndComboBox,editString,MAX_LOADSTRING);
  SetWindowText(GetDlgItem(hWnd,IDB_GETWINTEXT),editString);
  break;
  13.销毁控件
  使用DestroyWindow()函数获取与设置控件文字,具体代码如下:
  case IDB_DESWIN:
  DestroyWindow(hWndComboBox);
  break;
  14. 绘制窗口
  在WM_PAINT中绘制窗口,通过改变视口坐标来达到滚动的效果,代码如下
  case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  // TODO: Add any drawing code here...
  RECT rt;
  GetClientRect(hWnd, &rt);
  SetMapMode(hdc,MM_ANISOTROPIC);
  SetViewportOrgEx(hdc,0,rt.bottom -iVscrollPos*5 ,NULL);
  DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
  TextOut(hdc,300,500,szHello, strlen(szHello));
  
  
  EndPaint(hWnd, &ps);
  break;
  编译并调试程序
  程序运行结果运行结果如下图:
DSC0000.png

  程序运行初始状态
DSC0001.png

  操作滚动条或点击按钮使文字滚动,打开组合框
DSC0002.png

  禁用组合框
DSC0003.png

  启用并移动组合框,改变组合框宽度
DSC0004.png

  改变组合框文字,获取组合框当前文字并显示在按钮上
DSC0005.png

  销毁组合框,再次获取组合框文字,此时为空
  本次只处理了垂直滚动条的事件响应,水平滚动条事件处理方式与此相同,操作重复,暂未做处理。
  在Windows中,控件其实也是窗口,可以像处理窗口一样处理控件。
  做完本次实验感觉Windows中使用纯代码创建控件的方式不是很方便,习惯了Windows在可视化环境下以所见即所得方式创建控件,win32这种方式实在是不适应。而且不能理解的是为什么win32对话框窗口中可以使用可视化方式创建控件,在主窗口中却不能使用这种方式。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-388963-1-1.html 上篇帖子: windows版mysql5.7.18安装 下篇帖子: 在Windows Server2016里通过Hyper-V安装Liunx Container
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表