例說WIN32 Tab控制元件使用

YunShell發表於2013-07-14

今天查詢了一天關於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;
}


相關文章