标签:
学习目的 学习创建, 使用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; 编译并调试程序 |
程序运行结果运行结果如下图:
程序运行初始状态 ?
操作滚动条或点击按钮使文字滚动,打开组合框 ?
禁用组合框 ?
启用并移动组合框,改变组合框宽度 ?
改变组合框文字,获取组合框当前文字并显示在按钮上 ?
销毁组合框,再次获取组合框文字,此时为空 ? 本次只处理了垂直滚动条的事件响应,水平滚动条事件处理方式与此相同,操作重复,暂未做处理。 在Windows中,控件其实也是窗口,可以像处理窗口一样处理控件。 做完本次实验感觉Windows中使用纯代码创建控件的方式不是很方便,习惯了Windows在可视化环境下以所见即所得方式创建控件,win32这种方式实在是不适应。而且不能理解的是为什么win32对话框窗口中可以使用可视化方式创建控件,在主窗口中却不能使用这种方式。 |
标签:
原文地址:http://www.cnblogs.com/leftshine/p/5698638.html