先直接上效果图:
就是当点击本地列表的时候,弹出左图,点击网络收藏的时候弹出右图。然后在相应的标签页点击响应的按钮,弹出个对话框,来响应子对话框的消息.
具体实现见下面代码:
#include "stdafx.h"
#include
#include
#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;
}