Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18963
  • 博文数量: 5
  • 博客积分: 168
  • 博客等级: 入伍新兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-12 17:03
文章分类

全部博文(5)

文章存档

2012年(5)

我的朋友

分类: WINDOWS

2012-11-28 14:32:04

  最近公司要求用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)。例子代码如下

点击(此处)折叠或打开

  1. TCITEM tie;                          //创建一个TCITEM结构的实例
  2. TCHAR szTitle[30];                   //标题名称缓冲区

  3. tie.mask = TCIF_TEXT;                 //此时只有pszText有效
  4. tie.pszText = szTitle;               
  5. HWND htab = GetDlgItem(hwnd,IDC_TAB1);
  6. snprintf(szTitle, 29, TEXT("第一页")); //转换格式
  7. TabCtrl_InsertItem(htab, 0, &tie);    //插入第一个标题
  8. snprintf(szTitle, 29, TEXT("第二页"));
  9. TabCtrl_InsertItem(htab, 1, &tie);
  10. snprintf(szTitle, 29, TEXT("第三页"));
  11. TabCtrl_InsertItem(htab, 3, &tie);
   2、做属性页
      1)做属性页可以理解为做一个没有标题栏的对话框,然后把这个对话框移动到原TAB控件的客户区。可以每一个选项卡对应一个属性页。

点击(此处)折叠或打开

  1. RECT rt;
  2. HWND hTabSheet =
  3.     CreateDialog(hinst,(LPCTSTR)IDD_DIALOG_SHEET,htab,(DLGPROC)TabSheetProc);
  4. GetClientRect(htab, &rt);
  5. TabCtrl_AdjustRect(htab, false, &rt);
  6. MoveWindow(g_hTabSheet[i], rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top,
  7.  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) |
给主人留下些什么吧!~~