找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 5170|回复: 1

【C】简单的Tab控件实例

[复制链接]
发表于 2015-7-12 22:38:20 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
20150712223555.png
  1. #include<Windows.h>
  2. #include<CommCtrl.h>

  3. HINSTANCE g_hInst=NULL;

  4. void AddItemToTabCtl(HWND hTab,int iItem,UINT mask,DWORD dwState,DWORD dwStateMask,LPTSTR pszText,int cchTextMax,int iImage,LPARAM lParam)
  5. {
  6.         TCITEM Item;
  7.         Item.mask=mask;
  8.         Item.dwState=dwState;
  9.         Item.dwStateMask=dwStateMask;
  10.         Item.pszText=pszText;
  11.         if(cchTextMax)
  12.                 Item.cchTextMax=cchTextMax;
  13.         else
  14.                 Item.cchTextMax=lstrlen(pszText);
  15.         Item.iImage=iImage;
  16.         Item.lParam=lParam;
  17.         TabCtrl_InsertItem(hTab,iItem,&Item);
  18. }

  19. LRESULT CALLBACK WndProc(HWND hWnd,UINT Msg,WPARAM wp,LPARAM lp)
  20. {
  21.         switch(Msg)
  22.         {
  23.         default:
  24.                 return DefWindowProc(hWnd,Msg,wp,lp);
  25.         case WM_CREATE:
  26.                 InitCommonControls();
  27.                 do{
  28.                         HWND hTab=CreateWindowEx(0,WC_TABCONTROL,TEXT("tab"),WS_CHILD|WS_VISIBLE,0,0,600,100,hWnd,(HMENU)233,g_hInst,NULL);//窗口句柄
  29.                        
  30.                         AddItemToTabCtl(hTab,0,TCIF_TEXT,0,0,TEXT("选项1"),0,-1,0);
  31.                         AddItemToTabCtl(hTab,1,TCIF_TEXT,0,0,TEXT("选项2"),0,-1,0);
  32.                         AddItemToTabCtl(hTab,2,TCIF_TEXT,0,0,TEXT("选项3"),0,-1,0);
  33.                         AddItemToTabCtl(hTab,3,TCIF_TEXT,0,0,TEXT("选项4"),0,-1,0);
  34.                         AddItemToTabCtl(hTab,4,TCIF_TEXT,0,0,TEXT("选项5"),0,-1,0);

  35.                         //Tab刚创建出来的时候字体像屎一样,所以要设置成系统默认字体。
  36.                         SendMessage(hTab,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),TRUE);

  37.                 }while(0);
  38.                 break;
  39.         case WM_NOTIFY:
  40.                 if(LOWORD(wp)==233)
  41.                 {
  42.                         //正要改变选项
  43.                         if(((LPNMHDR)lp)->code==TCN_SELCHANGING)
  44.                         {
  45.                                 switch(TabCtrl_GetCurSel(((LPNMHDR)lp)->hwndFrom))
  46.                                 {
  47.                                 case 0:MessageBox(hWnd,TEXT("选项1"),TEXT("之前的选项"),MB_OK);break;
  48.                                 case 1:MessageBox(hWnd,TEXT("选项2"),TEXT("之前的选项"),MB_OK);break;
  49.                                 case 2:MessageBox(hWnd,TEXT("选项3"),TEXT("之前的选项"),MB_OK);break;
  50.                                 case 3:MessageBox(hWnd,TEXT("选项4"),TEXT("之前的选项"),MB_OK);break;
  51.                                 case 4:MessageBox(hWnd,TEXT("选项5"),TEXT("之前的选项"),MB_OK);break;
  52.                                 }
  53.                         }
  54.                         //已经改变选项
  55.                         if(((LPNMHDR)lp)->code==TCN_SELCHANGE)
  56.                         {
  57.                                 switch(TabCtrl_GetCurSel(((LPNMHDR)lp)->hwndFrom))
  58.                                 {
  59.                                 case 0:MessageBox(hWnd,TEXT("选项1"),TEXT("新的选项"),MB_OK);break;
  60.                                 case 1:MessageBox(hWnd,TEXT("选项2"),TEXT("新的选项"),MB_OK);break;
  61.                                 case 2:MessageBox(hWnd,TEXT("选项3"),TEXT("新的选项"),MB_OK);break;
  62.                                 case 3:MessageBox(hWnd,TEXT("选项4"),TEXT("新的选项"),MB_OK);break;
  63.                                 case 4:MessageBox(hWnd,TEXT("选项5"),TEXT("新的选项"),MB_OK);break;
  64.                                 }
  65.                         }
  66.                 }
  67.                 break;
  68.         case WM_DESTROY:
  69.                 PostQuitMessage(0);
  70.                 break;
  71.         }
  72.         return 0;
  73. }

  74. int APIENTRY WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szCmd,int nCmd)
  75. {
  76.         WNDCLASSEX WCEx={sizeof(WNDCLASSEX),0,WndProc,0,0,g_hInst=hInst,NULL,LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW)),(HBRUSH)COLOR_BTNFACE,NULL,TEXT("tuttab"),NULL};//窗口类
  77.         MSG msg;
  78.         HWND hWnd=CreateWindowEx(0,MAKEINTATOM(RegisterClassEx(&WCEx)),TEXT("tuttab"),WS_OVERLAPPEDWINDOW,
  79.                 CW_USEDEFAULT,CW_USEDEFAULT,700,200,NULL,NULL,hInst,NULL);//窗口句柄
  80.         ShowWindow(hWnd,nCmd);
  81.         UpdateWindow(hWnd);
  82.         while(GetMessage(&msg,NULL,0,0))//消息循环
  83.         {
  84.                 TranslateMessage(&msg);
  85.                 DispatchMessage(&msg);
  86.         }
  87.         return msg.wParam;
  88. }

  89. //美化控件
  90. #if defined _M_IX86
  91. #pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'"")
  92. #elif defined _M_IA64
  93. #pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'"")
  94. #elif defined _M_X64
  95. #pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'"")
  96. #else
  97. #pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"")
  98. #endif
复制代码
BIN: tuttab.exe (9.5 KB, 下载次数: 15)
SRC: tuttab.7z (6.95 KB, 下载次数: 18)


TAB控件其实并不是一个容器,它就是帮你显示了一个选项卡而已。你需要做的,就是在创建了Tab以后,通过切换选项卡的过程调用的回调函数,将不同的子窗口显示到最顶部。
所以你需要创建若干子窗口,把控件布局放进子窗口,然后在Tab被点击的时候,将指定的子窗口显示出来(并把其它子窗口藏起来)就行了。
其实Tab选项卡控件是支持带小图标的选项卡的。。。但是这有点画蛇添足了。其实要弄的话,添加图片的方法和工具栏(ToolBar)是一样的。

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2015-7-12 22:48:13 | 显示全部楼层
厉害额
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-24 07:08 , Processed in 0.038372 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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