|
学习目的
学习创建, 使用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对话框窗口中可以使用可视化方式创建控件,在主窗口中却不能使用这种方式。
|
|
|