首页
社区
课程
招聘
[求助]自己写了一个属性表单的例子,运行一闪而过,求助ing..
发表于: 2011-9-9 14:17 7029

[求助]自己写了一个属性表单的例子,运行一闪而过,求助ing..

2011-9-9 14:17
7029
看了MSDN,也在网上找到了一些翻译资料,有些简短的实例代码,自己按照理解写个demo,发现运行一闪而过,但是不晓得哪里有问题,总感觉怪怪的,来此求助大家,源程序可以正常编译,因此把工程放上来,顺便把搜到的翻译资料也一起放上来吧,希望得到大家都指点,三克油!
贴一下代码吧:

// pagesheet.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "pagesheet.h"
#include <Prsht.h>
#include <commctrl.h>
#pragma comment(lib,"Comctl32.lib")

#define MAX_LOADSTRING 100
#define IDC_BTN 1000

// 全局变量:
HINSTANCE hInst;								// 当前实例
TCHAR szTitle[MAX_LOADSTRING];					// 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];			// 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK DialogFunc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DialogFunc2(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DialogFunc3(HWND,UINT,WPARAM,LPARAM);

HWND hDlg;
HPROPSHEETPAGE hPs[3];
HWND hPropSheet;
HWND hPage[3];
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);
	INITCOMMONCONTROLSEX cc;
	cc.dwSize=sizeof(INITCOMMONCONTROLSEX);
	cc.dwICC=ICC_TAB_CLASSES;
	InitCommonControlsEx(&cc);
	hInst=hInstance;
 	// TODO: 在此放置代码。
	MSG msg;
	HACCEL hAccelTable;

	// 初始化全局字符串
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_PAGESHEET, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// 执行应用程序初始化:
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_PAGESHEET));

	// 主消息循环:
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int) msg.wParam;
}



//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
//  注释:
//
//    仅当希望
//    此代码与添加到 Windows 95 中的“RegisterClassEx”
//    函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
//    这样应用程序就可以获得关联的
//    “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PAGESHEET));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_PAGESHEET);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // 将实例句柄存储在全局变量中

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND	- 处理应用程序菜单
//  WM_PAINT	- 绘制主窗口
//  WM_DESTROY	- 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	PROPSHEETPAGE PropSheet[3];
	PROPSHEETHEADER PropHdr;

	switch (message)
	{
	/*case WM_CREATE:
		CreateWindow(TEXT("button"),TEXT("点我"),WS_VISIBLE|WS_CHILD,0,0,60,25,hWnd,(HMENU)IDC_BTN,hInst,NULL);
		break;*/
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 分析菜单选择:
		switch (wmId)
		{
		case IDM_DIALOG:
			PropSheet[0].dwSize   =   sizeof(PROPSHEETPAGE);                     
			PropSheet[0].dwFlags   =   PSP_DEFAULT;                     
			PropSheet[0].hInstance   =   hInst;                     
			PropSheet[0].pszTemplate   =   TEXT("MyDB ");                     
			PropSheet[0].pszIcon   =   NULL;                     
			PropSheet[0].pfnDlgProc   =   (DLGPROC)   DialogFunc;                     
			PropSheet[0].pszTitle   =   TEXT(" "); 
			PropSheet[0].lParam   =   0;                     
			PropSheet[0].pfnCallback   =   NULL;                         
			PropSheet[1].dwSize   =   sizeof(PROPSHEETPAGE);                     
			PropSheet[1].dwFlags   =   PSP_DEFAULT;                     
			PropSheet[1].hInstance   =   hInst;                     
			PropSheet[1].pszTemplate   =   TEXT("MyDB2 ");                     
			PropSheet[1].pszIcon   =   NULL;                     
			PropSheet[1].pfnDlgProc   =   (DLGPROC)   DialogFunc2;                     
			PropSheet[1].pszTitle   =   TEXT(" ");                     
			PropSheet[1].lParam   =   0;                     
			PropSheet[1].pfnCallback   =   NULL;                     
			PropSheet[2].dwSize   =   sizeof(PROPSHEETPAGE);                     
			PropSheet[2].dwFlags   =   PSP_DEFAULT;                     
			PropSheet[2].hInstance   =   hInst;                     
			PropSheet[2].pszTemplate   =   TEXT("MyDB3 ");                     
			PropSheet[2].pszIcon   =   NULL;                     
			PropSheet[2].pfnDlgProc   =(DLGPROC)   DialogFunc3;                     
			PropSheet[2].pszTitle   = TEXT(" ");                     
			PropSheet[2].lParam   =   0;                     
			PropSheet[2].pfnCallback   =   NULL; 
			hPs[0]   =   CreatePropertySheetPage(&PropSheet[0]);                     
			hPs[1]   =   CreatePropertySheetPage(&PropSheet[1]);                     
			hPs[2]   =   CreatePropertySheetPage(&PropSheet[2]);                         
			PropHdr.dwSize   =   sizeof(PROPSHEETHEADER);                     
			PropHdr.dwFlags   =   PSP_DEFAULT; 
			PropHdr.hwndParent   =   hWnd;                     
			PropHdr.hInstance   =   hInst;                     
			PropHdr.pszIcon   =   NULL;                     
			PropHdr.pszCaption   =   TEXT("Sample   Property   Sheet ");                     
			PropHdr.nPages   =   3;                     
			PropHdr.nStartPage   =   0;                     
			PropHdr.phpage   =   hPs;                     
			PropHdr.pfnCallback   =   NULL;                   
			PropertySheet(&PropHdr);                   

			break;
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: 在此添加任意绘图代码...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(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)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}

BOOL CALLBACK DialogFunc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch(message)
	{
	case WM_INITDIALOG:
		MessageBox(hWnd,TEXT("ooo"),TEXT("xxx"),MB_OKCANCEL);//仅仅测试用
		return TRUE;
	case WM_NOTIFY:
		switch(((NMHDR*)lParam)->code)
		{
		case PSN_SETACTIVE:
			hPropSheet=((NMHDR*)lParam)->hwndFrom;
			//ShowWindow(hPropSheet,SW_NORMAL);
			SetWindowLong(hWnd,DWL_MSGRESULT,0);
			return 1;
		case PSN_KILLACTIVE:
			SetWindowLong(hWnd,DWL_MSGRESULT,0);
			return 1;
		}
		break;
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDM_ONE:
			PropSheet_SetCurSel(hPropSheet,hPs[0],0);
			return 1;
		}
	}
		return 0;
}

BOOL CALLBACK DialogFunc2(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
		switch(message)
	{
	case WM_NOTIFY:
		switch(((NMHDR*)lParam)->code)
		{
		case PSN_SETACTIVE:
			hPropSheet=((NMHDR*)lParam)->hwndFrom;
			SetWindowLong(hWnd,DWL_MSGRESULT,0);
			return 1;
		case PSN_KILLACTIVE:
			SetWindowLong(hWnd,DWL_MSGRESULT,0);
			return 1;
		}
		break;
	}
		return 0;
}

BOOL CALLBACK DialogFunc3(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
		switch(message)
	{
	case WM_NOTIFY:
		switch(((NMHDR*)lParam)->code)
		{
		case PSN_SETACTIVE:
			hPropSheet=((NMHDR*)lParam)->hwndFrom;
			SetWindowLong(hWnd,DWL_MSGRESULT,0);
			return 1;
		case PSN_KILLACTIVE:
			SetWindowLong(hWnd,DWL_MSGRESULT,0);
			return 1;
		}
		break;
	}
		return 0;
}

虽说有点小长,但是大部分都是很浅显的,比如最后3个回调函数。。

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是不是应该ctrl+F5我下来试试再补充
2011-9-9 14:55
0
雪    币: 351
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
回调函数无效

VC++深入详解\第八章
2011-9-9 16:24
0
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
first ,thx.第八章看了,没有找到相关的信息啊。你记错了吧
调试发现这里有点问题;
PropertySheet(&PropHdr);   
n_Error=GetLastError();
错误号:1400-----无效句柄,很迷茫,不知道代表啥意思。

另外在对话框1的窗口过程处打了断点,发现程序运行没进入WM_INITDIALOG消息,根据MSDN的解释:
When a page is created, its dialog box procedure receives a WM_INITDIALOG message. The message's lParam parameter is a pointer to a copy of the PROPSHEETPAGE structure that is defined when the page is created. In particular, when a page is created, the structure's lParam member can be used to pass application-defined information to the dialog box procedure. With the exception of the lParam member, this structure must be treated as read-only. Modifying anything other than lParam will have unpredictable consequences.

事实证明:确实 a page is created,我的证据:
PropSheetPageProc Callback Function
Specifies an application-defined callback function that a property sheet calls when a page is created and when it is about to be destroyed. An application can use this function to perform initialization and cleanup operations for the page.

Syntax
UINT CALLBACK PropSheetPageProc(
  HWND hwnd,
  __in     UINT uMsg,
  __inout  LPPROPSHEETPAGE ppsp
);

针对这点测试了一下:

PropSheet[0].pfnCallback   =   PropSheetPageProc;

UINT CALLBACK PropSheetPageProc(
  HWND hwnd,
   UINT uMsg,
  LPPROPSHEETPAGE ppsp
)
{
	MessageBox(hwnd,TEXT("XXX"),TEXT("AA"),0);
	return 0;
}

运行输出了内容。
这个到底是啥子情况呢?前后不一致么?哪里出了错误了呢,求帮忙。。。
2011-9-9 18:01
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哥回的不是贴,是寂寞,字数补丁,颜色补丁,闪人补丁...
2011-9-9 19:03
0
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
自己顶一下,不然看样子要沉了
2011-9-10 20:47
0
雪    币: 3080
活跃值: (5104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你的人品不好,有人理会你才怪,自己什么都不懂呢,还乱骂别人垃圾!
2011-9-12 00:31
0
雪    币: 1683
活跃值: (674)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
帮LZ调了一下,是LZ的pszTemplate有问题,ID不是你强转个STRING,也不是你弄个“”给括起来,然后弄成TEXT()就OK了,改成MAKEINTRESOURCE去转换就OK了。ID不要加“”
2011-9-12 11:08
0
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
9
感谢楼上这位兄台。中秋快乐!
2011-9-12 21:30
0
游客
登录 | 注册 方可回帖
返回
//