在对话框上实现属性页(property pages),看了下MSDN,下面贴出代码:
// 属性页的测试.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "stdafx.h"
#include "resource.h"
#include "PrSht.h"
#pragma comment(lib,"comctl32.lib")
HINSTANCE g_hInst;
INT_PTR CALLBACK LogInProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
int DoPropertySheet(HWND hDlg)
{
PROPSHEETPAGE psp[2];
PROPSHEETHEADER psh;
psp[0].dwSize = sizeof(PROPSHEETPAGE);
psp[0].dwFlags =PSP_USETITLE;
psp[0].hInstance = g_hInst;
psp[0].pszTemplate = MAKEINTRESOURCE(IDD_DIALOG1);
psp[0].pszIcon = NULL;
psp[0].pfnDlgProc =LogInProc;
psp[0].pszTitle =TEXT("test1");
psp[0].lParam = 0;
psp[0].pfnCallback =NULL;
psp[1].dwSize = sizeof(PROPSHEETPAGE);
psp[1].dwFlags = PSP_USETITLE ;
psp[1].hInstance = g_hInst;
psp[1].pszTemplate =MAKEINTRESOURCE(IDD_DIALOG2);
psp[1].pszIcon = NULL;
psp[1].pfnDlgProc = NULL;
psp[1].pszTitle = TEXT("test2");
psp[1].lParam = 0;
psp[1].pfnCallback = NULL;
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPSHEETPAGE;
psh.hwndParent = hDlg;
psh.hInstance = g_hInst;
psh.pszIcon =NULL;
psh.pszCaption = _T( "Cell Properties");
psh.nPages = sizeof(psp)/sizeof(PROPSHEETPAGE);
psh.nStartPage = 0;
psh.ppsp = (LPCPROPSHEETPAGE) &psp;
psh.pfnCallback = NULL;
int code=PropertySheet(&psh);
return code;
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
g_hInst=hInstance;
return DoPropertySheet(NULL);
}
INT_PTR CALLBACK LogInProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch(message)
{
case WM_INITDIALOG:
{
return (INT_PTR)TRUE;
}
case WM_COMMAND:
{
if (LOWORD(wParam)==IDOK || LOWORD(wParam)==IDCANCEL)
{
MessageBox(NULL,TEXT(""),TEXT(""),MB_OK);
EndDialog(hDlg,LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
}
return (INT_PTR)FALSE;
}
还有另外一种方法(参考高手博客,下面的代码是不能直接运行的,你懂的):
利用API 创建:CreatePropertySheetPage
代码如下:
#include "stdafx.h"
#include "完美属性页.h"
#include <windowsx.h>
#include <commctrl.h>
#include <shlobj.h>
#pragma comment(lib, "shell32.lib")
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
#pragma comment(lib, "ole32.lib")
#include "PrSht.h"
#pragma comment(lib,"comctl32.lib")
typedef struct {
LPCTSTR dlgid;
DLGPROC dlgproc;
} PAGE_INFO;
TCHAR szCaption[] = TEXT("属性");
DWORD CALLBACK InstallProc(LPVOID lpParam);
INT_PTR CALLBACK PropPageProc1(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK PropPageProc2(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK PropPageProc3(HWND, UINT, WPARAM, LPARAM);
PAGE_INFO pageinfo[] = { { MAKEINTRESOURCE(IDD_DLG1), PropPageProc1 },
{ MAKEINTRESOURCE(IDD_DLG2), PropPageProc2 },
{ MAKEINTRESOURCE(IDD_DLG3), PropPageProc3 }
};
const int N_PAGES = sizeof(pageinfo) / sizeof(PAGE_INFO);
// 全局变量:
HINSTANCE hInst; // 当前实例
/
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
PROPSHEETHEADER psh;
PROPSHEETPAGE psp[N_PAGES];
HPROPSHEETPAGE ahpsp[N_PAGES];
INITCOMMONCONTROLSEX iccex;
iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
iccex.dwICC = ICC_STANDARD_CLASSES | ICC_WIN95_CLASSES;;
InitCommonControlsEx(&iccex);
for (int i = 0; i < N_PAGES; i++) {
psp[i].dwSize = sizeof(PROPSHEETPAGE);
psp[i].dwFlags = PSP_DEFAULT;
psp[i].hInstance = hInstance;
psp[i].pszTemplate = pageinfo[i].dlgid;
psp[i].pfnDlgProc = pageinfo[i].dlgproc;
ahpsp[i] = CreatePropertySheetPage(&psp[i]);
}
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_DEFAULT;
psh.hwndParent = GetDesktopWindow();
psh.phpage = ahpsp;
psh.nPages = N_PAGES;
psh.pszCaption = szCaption;
return PropertySheet(&psh);
}
INT_PTR CALLBACK PropPageProc1(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static TCHAR szPath[MAX_PATH];
switch (msg) {
case WM_INITDIALOG:
{
HWND hwndEdit;
hwndEdit = GetDlgItem(hwnd, 1003);
if (SUCCEEDED(CoInitialize(NULL))) {
SHAutoComplete(hwndEdit, SHACF_FILESYSTEM);
}
if (ExpandEnvironmentStrings(TEXT("%PROGRAMFILES%\\Internet Explorer"), szPath, MAX_PATH) > 0) {
SendMessage(hwndEdit, WM_SETTEXT, 0, (LPARAM)szPath);
}
}
break;
case WM_COMMAND:
switch (wParam) {
case MAKEWPARAM(1004, BN_CLICKED):
{
PIDLIST_ABSOLUTE pidl;
BROWSEINFO bi = { 0 };
bi.hwndOwner = hwnd;
bi.lpszTitle = TEXT("选择安装软件的目标文件夹:");
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_DONTGOBELOWDOMAIN;
pidl = SHBrowseForFolder(&bi);
if (pidl != NULL) {
if (SHGetPathFromIDList(pidl, szPath)) {
SetDlgItemText(hwnd, 1003, szPath);
}
}
}
break;
default:
break;
}
break;
case WM_DESTROY:
CoUninitialize();
break;
default:
break;
}
return 0;
}
INT_PTR CALLBACK PropPageProc2(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_COMMAND:
switch (wParam) {
case MAKEWPARAM(1004, BN_CLICKED):
{
}
break;
default:
break;
}
break;
default:
break;
}
return 0;
}
INT_PTR CALLBACK PropPageProc3(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_INITDIALOG:
CreateThread(NULL, 0, InstallProc, hwnd, 0, NULL);
break;
case WM_COMMAND:
switch (wParam) {
case MAKEWPARAM(3002, BN_CLICKED):
ShowWindow(GetDlgItem(hwnd, 3002), SW_HIDE);
ShowWindow(GetDlgItem(hwnd, 3003), SW_SHOW);
break;
default:
break;
}
break;
default:
break;
}
return 0;
}
DWORD CALLBACK InstallProc(LPVOID lpParam)
{
for (UINT i = 0; i++ < 100; Sleep(50)) {
int index;
TCHAR szText[32];
wsprintf(szText, TEXT("已完成 %u%%..."), i);
SendDlgItemMessage((HWND)lpParam, 3000, WM_SETTEXT, 0L, (LPARAM)szText);
SendDlgItemMessage((HWND)lpParam, 3001, PBM_SETPOS, i, 0L);
index = SendDlgItemMessage((HWND)lpParam, 3003, LB_ADDSTRING, 0, (LPARAM)szText);
SendDlgItemMessage((HWND)lpParam, 3003, LB_SETCURSEL, index, 0);
}
return 0;
}