最近公司要求用Windows API 做个设置对话框,小弟初入此道,无奈只能上网搜索资料,集合众人智慧,却发现对话框的相关资料多是使用MFC,SDK方面往往只有只言片语,需要层层搜索加思考才能理解。好在经过几天努力总算完成了,现在把工作中的资料整理汇总一下,一来方便他人,二来对自己也算是个积累。
一、创建对话框
1、int DialogBox(HINSTANCE hinst,LPCTSTR lpTemplate,HWND hWndParent,DLGPROC DialogProc);
参数 IpTemplate:标识对话框模板。如果此参数指定了一个资源标识符则它的高位字一定为零,且低位字一定含有标识符。一定用MAKEINTRESOURCE创建此值。如MAKEINTRESOURCE(IDD_SET);
hWndParent:指定拥有对话框的窗口。
DialogProc:指向对话框过程的指针。即一个回调函数,用于处理DialogBox发送来的消息。
2、BOOL CALLBACK DialogProc(HWND hwndDlg,UINT UMsg,WPARAM wParam,LPARAM IParam);
参数:
hwndDlg:指定对话框。
uMsg:指定消息。
wParam:指定消息特定的其他信息。
Iparam:指定消息特定的其他信息。
返回值:除了对WM_INITDIALOG消息的响应之外如果函数处理消息,则对话框应用程序应该返回非零值。
3、常用的对话框消息
1)WM_INITDIALOG
初始化对话框
2)WM_COMMAND
用户点击菜单、下拉框等控件时触发该消息,例如IDOK,IDCANCEL等。
3)WM_CLOSE
关闭对话框。
二、TabControl控件
TabControl控件比较有意思。它来回切换的只有标题,显示页面只有一个。如果想做成每一个TAB页显示不同的控件,单纯用它会变得很繁琐。在Delphi中可以直接使用PageControl,VC没有PageControl,但有属性页。使用属性页和TabControl配合使用可实现PageControl功能,当然这都是后话。
把TabControl控件直接拖到对话框窗口中,运行程序,会发现在显示控件的位置为空,这是因为没有设置标题的原因。
1、插入标题
使用HWND GetDlgItem(HWND,int ID),取得TAB控件的句柄。插入标题使用TabCtrl_InsertItem(HWND hwnd,int iItem,const LPTCITEM pitem)。例子代码如下
- TCITEM tie; //创建一个TCITEM结构的实例
- TCHAR szTitle[30]; //标题名称缓冲区
- tie.mask = TCIF_TEXT; //此时只有pszText有效
- tie.pszText = szTitle;
- HWND htab = GetDlgItem(hwnd,IDC_TAB1);
- snprintf(szTitle, 29, TEXT("第一页")); //转换格式
- TabCtrl_InsertItem(htab, 0, &tie); //插入第一个标题
- snprintf(szTitle, 29, TEXT("第二页"));
- TabCtrl_InsertItem(htab, 1, &tie);
- snprintf(szTitle, 29, TEXT("第三页"));
- TabCtrl_InsertItem(htab, 3, &tie);
2、做属性页
1)做属性页可以理解为做一个没有标题栏的对话框,然后把这个对话框移动到原TAB控件的客户区。可以每一个选项卡对应一个属性页。
- RECT rt;
- HWND hTabSheet =
- CreateDialog(hinst,(LPCTSTR)IDD_DIALOG_SHEET,htab,(DLGPROC)TabSheetProc);
- GetClientRect(htab, &rt);
- TabCtrl_AdjustRect(htab, false, &rt);
- MoveWindow(g_hTabSheet[i], rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top,
- false);
TabCtrl_AdjustRect宏可以计算Tab控制的显示区域.因为假如一个客户区分给Tab控制,而Tab控制本身(如标签,padding,margin)要用一部分空间,所以要想和控制在外观上不冲突,必须把别的窗口放在控制的显示区域里面.在精准定位时需要这个宏.
这样就可以在不同的属性页中放置不同的控件,在TabSheetProc中控制各控件。
2)点击TabControl的个选项卡,会向窗口中发送WM_NOTIFY消息。wParam传递TAB控件ID,(LPNMHDR) lParam)->code = TCN_SELCHANGE;使用函数TabCtrl_GetCurSel(htab)取得当前正选择哪一个选项卡。使用ShowWindow(g_hTabSheet,true)控制属性页显示。
阅读(458) | 评论(0) | 转发(0) |