例说WIN32 Tab控件使用

今天查找了一天关于SDK下,TAB控件的使用,到处都是MFC,C++的,本人还没开始学习C++,所以只能学习SDK方式使用TAB控件,搞了一天终于搞定了 ,现在在这里记录下,以便后来人有需要。

先直接上效果图:


就是当点击本地列表的时候,弹出左图,点击网络收藏的时候弹出右图。然后在相应的标签页点击响应的按钮,弹出个对话框,来响应子对话框的消息.

具体实现见下面代码:

#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include "resource.h"
#include "MainDlg.h"
#include "commctrl.h" //高级控件都要加该头文件

HINSTANCE hinstance;  //程序实例句柄
HWND hDlg_intab[2];	//两个要载入到TAB控件中的对话框句柄
HWND htabctrl;	// TAB控件的句柄

BOOL WINAPI tab1_dlg_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);//两个子窗口的窗口处理过程函数申明
BOOL WINAPI tab2_dlg_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
typedef BOOL(WINAPI *DIALOGPROC)(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); //定义一个 函数指针
DIALOGPROC DlgProc[2]={tab1_dlg_proc,tab2_dlg_proc};

BOOL WINAPI Main_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{	
//NMHDR *nm = (NMHDR *)lParam; 
  hinstance=GetModuleHandle(NULL); //获取程序实例 传给全局变量hinstance
    switch(uMsg)
    {
        HANDLE_MSG(hwnd, WM_INITDIALOG, Main_OnInitDialog);//初始化函数
	HANDLE_MSG(hwnd, WM_COMMAND, Main_OnCommand);//命令接收函数
	HANDLE_MSG(hwnd,WM_CLOSE, Main_OnClose);//关闭对话框函数
	case WM_NOTIFY:		 //TAB控件切换发生时传送的消息
	{	
		if((INT)wParam==IDC_TAB) //这里也可以用一个NMHDR *nm = (NMHDR *)lParam这个指针来获取 句柄和事件
		{					//读者可自行查找NMHDR结构
			if(((LPNMHDR)lParam)->code==TCN_SELCHANGE) //当TAB标签转换的时候发送TCN_SELCHANGE消息
			{	
				
				int sel=TabCtrl_GetCurSel(htabctrl);
			  switch(sel)	//根据索引值查找相应的标签值,干相应的事情
				{	
					
					case 0: //TAB1标签时,我们要显示 tab1标签页面
						{
							ShowWindow(hDlg_intab[0],TRUE); //显示窗口用ShowWindow函数
							ShowWindow(hDlg_intab[1],FALSE);
							break;
						}
					case 1://TAB2标签时,我们要显示 tab2标签页面
						{
							ShowWindow(hDlg_intab[0],FALSE);
							ShowWindow(hDlg_intab[1],TRUE);
							break;
						}
				}
					
			}
		}
		break;
		}
    }

    return FALSE;
}

//初始化对话框,加载两个TAB标签页 显示
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{	
	  显示tab标签
	htabctrl=GetDlgItem(hwnd,IDC_TAB);
	TCITEM tie;//设置tab标签的属性
	LPSTR tabname[3]={"本地列表","网络收藏","网络电台"}; //定义一个二维数组 存放tab标签名字
	//具体开始设置 tie的字段 Mask psztext,ccxtextmax,image,lparam
	tie.mask=TCIF_TEXT|TCIF_IMAGE;//psztext字段有效
	  tie.iImage = -1; 
	for(INT i=0;i<3;i++)
	{
		tie.pszText=tabname[i];
		TabCtrl_InsertItem(htabctrl,i,&tie);
	}
	//
   
	//在tab标签中显示 别的控件
	RECT rect;//存放tab控件的区域位置
	GetClientRect(htabctrl,&rect);
	// 将两个窗口往 tab控件位置移动
	for(i=0;i<2;i++)
	{
		hDlg_intab[i]=CreateDialog(hinstance,MAKEINTRESOURCE(IDD_DIALOG1+i),htabctrl,DlgProc[i]);
		MoveWindow(hDlg_intab[i],2,29,rect.right - rect.left-6,rect.bottom - rect.top-35,FALSE);
	}

	ShowWindow(hDlg_intab[0],SW_SHOW); 
    return TRUE;
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_OK:
		{	
			MessageBox(hwnd,TEXT("你按了主对话框的确定"),TEXT(""),MB_OK);
			 break;
		}
        default:
		break;
    }
}

void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}


BOOL WINAPI tab1_dlg_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  
{	
	switch(uMsg)
	{	
		case WM_INITDIALOG:
			return TRUE;
    	case WM_COMMAND:
			switch(wParam)
			{
				case IDC_HELLO_TAB1:
				{
					MessageBox(hwnd,TEXT("你按了tab1标签问好"),TEXT(""),MB_OK);
					break;
				}
			}
			break;
		case WM_CLOSE:
			EndDialog(hwnd,0);	
		return FALSE;
	}
	return FALSE;
}

BOOL WINAPI tab2_dlg_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  
{
	switch(uMsg)
	{	
		case WM_INITDIALOG:
			return TRUE;
    	case WM_COMMAND:
			switch(wParam)
			{
				case IDC_HELLO_TAB2:
				{
					MessageBox(htabctrl,TEXT("你按了tab2标签问好"),TEXT(""),MB_OK);
					break;
				}
			}
			break;
		case WM_CLOSE:
			EndDialog(hwnd,0);
			return FALSE;
	}
	return FALSE;
}


评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值