⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regview.cpp

📁 ce系统下面的一个浏览注册表的应用程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			return DoMainNotifyListV(hWnd,idCtl,hwndCtl,pHdr);
		case ID_TREEV:					// 树型视图ID
			return DoMainNotifyTreeV(hWnd,idCtl,hwndCtl,pHdr);
		default:
			break;
		}
		break;

	case WM_ICONNOTIFY:						// 托盘图标消息
		switch(lParam)
		{
		case WM_LBUTTONDBLCLK:				// 左键显示程序
			bFlag = IsWindowVisible(hWnd);
			if(!bFlag)
			{
				//MessageBox(hWnd,_T("LeftButton DBLCLK"),NULL,MB_OK|MB_TOPMOST);
				SetWindowPos(hWnd,HWND_TOPMOST,
					0,0,0,0,
					SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
				//ShowWindow(hWnd,SW_RESTORE);
				SetForegroundWindow(hWnd);
			}
			return 0;

		case WM_RBUTTONUP:					// 右键菜单	
			return PopupMenu(hWnd,ID_MENU1,0,1);			

		default:
			return FALSE;
		}
		break;

	case WM_CLOSE:
		ShowWindow(hWnd,SW_HIDE);
		return 0;

	case WM_DESTROY:
		// 删除托盘图标
		nid.cbSize = sizeof(nid);
		nid.hWnd = hWnd;
		nid.uID	= IDI_ICON;					// 确保删除的图标是正确的
		Shell_NotifyIcon(NIM_DELETE, &nid);
		
		return DoDestroyMain(hWnd,wMsg,wParam,lParam);

	default:
		break;
	}
	return DefWindowProc(hWnd,wMsg,wParam,lParam);
}

/************************************************************************
** 函数:BOOL CALLBACK AboutDlgProc(HWND hWnd, 
                                    UINT wMsg, 
									WPARAM wParam,
									LPARAM lParam)
** 输入:
** 输出:
** 功能:帮组对话框窗口过程函数
** 作者:XZP
** 日期:07.9.5
** 备注:一般情况下,对话框过程函数应该在处理了消息的情况下返回TRUE,
如果没有处理,则返回FALSE。如果对话框返回了FALSE,那么对话框管理器为
这个消息准备了默认处理。
************************************************************************/
BOOL CALLBACK AboutDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
	TCHAR szText1[MAX_PATH],szText2[MAX_PATH],szTemp[1024];
	HWND hwndEdit;
	switch(wMsg)
	{
	case WM_INITDIALOG:
		hwndEdit = GetDlgItem(hWnd,IDC_EDIT);
		LoadString(hInst,IDS_DELETE,szText1,sizeof(szText1)/sizeof(TCHAR));
		LoadString(hInst,IDS_RENAME,szText2,sizeof(szText2)/sizeof(TCHAR));
		_stprintf(szTemp,_T("%s\n%s"),szText1,szText2);
		SetWindowText(hwndEdit,szTemp);
		return TRUE;
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDOK:
		case IDCANCEL:
			EndDialog(hWnd,0);
			return TRUE;
		}
		break;
	}

	return FALSE;
}

/************************************************************************
** 函数:LRESULT CALLBACK CompareFunc(LPARAM lParam1, 
									  LPARAM lParam2, 
									  LPARAM lParamSort)
** 参数:
		lParam1[in]:第一个要比较的项的参数
		lParam2[in]:第二个要比较的项的参数
		lParamSort[in]:ListView_SortItems函数传来的参数,标志被点击的列索引号
lParam1和lParam2是在插入列表视图时LVITEM结构的lParam参数。
** return:
		-1:第一项应在第二项的前面返回负值
		1: 第一项应在第二项的后面返回正值
		0: 第一项与第二项相等返回0
** 功能:对列表视图排序用到的比较函数,安字典排序
** 作者:XZP
** 日期:07.7.12
** 备注:这里,需要注意的是,回调函数是在对什么进行比较.回调函数进行比较的两项,是
在插入列表项的参数数据项。也就是说,在插入列表项时,必须设置参数项(LVIF_PARAM).
这样才能对列表项的每一项进行比较,而这往往是我们忽略的参数。
************************************************************************/
LRESULT CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	int nItem1 = -1,nItem2 = -1,i;
	LVFINDINFO lvfi;
	HWND hwndLV;
	TCHAR szText1[MAX_PATH],szText2[MAX_PATH];

	memset(&lvfi,0,sizeof(lvfi));
	hwndLV = GetDlgItem(FindWindow(_T("RegView"),NULL),ID_LISTV);
	
    lvfi.flags = LVFI_PARAM; 
    lvfi.lParam = lParam1; 
    nItem1 = ListView_FindItem(hwndLV,-1,&lvfi) ;
    lvfi.lParam = lParam2; 
    nItem2 = ListView_FindItem(hwndLV,-1,&lvfi) ;
	
	if((nItem1 == -1) || (nItem2 == -1))
	{
		MessageBox(FindWindow(_T("RegView"),NULL),_T("找不到"),_T("ERR"),MB_OK|MB_TOPMOST|MB_ICONWARNING);
		return 0;
	}
	
	ListView_GetItemText(hwndLV,nItem1,lParamSort,szText1,sizeof(szText1));
	ListView_GetItemText(hwndLV,nItem2,lParamSort,szText2,sizeof(szText2));

	i = _tcscmp(szText1,szText2);
	if(g_bSortFlag)
	{
		if(i <0)
			return 1;
		if(i > 0)
			return -1;
		else
			return 0;
	}
	else
	{
		if(i <0)
			return -1;
		if(i > 0)
			return 1;
		else
			return 0;
	}
	
}
/************************************************************************
** 函数:LRESULT DoCreateMain (HWND hWnd, 
                               UINT wMsg, 
							   WPARAM wParam,
							   LPARAM lParam)
** 输入:
** 输出:WM_CREATE消息,必须return 0,返回-1则该窗口被释放并且
   CreateWindow将返回NULL
** 功能:主窗口WM_CREATE消息处理函数
** 作者:XZP
** 日期:07.9.3
************************************************************************/
LRESULT DoCreateMain(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
	HWND hwndCB,hwndChild;
	int nHeight;
	RECT rect;
	LPCREATESTRUCT lpcs;

	// WM_CREATE消息的lParam参数指向CREATESTRUCT结构体的指针
	lpcs = (LPCREATESTRUCT)lParam;

	// 创建命令栏,包含菜单、关闭按钮。
	hwndCB = CommandBar_Create(hInst,hWnd,IDC_CMDBAR);		// 创建命令栏
	CommandBar_InsertMenubar(hwndCB,hInst,ID_MENU,0);		// 插入菜单
	CommandBar_AddAdornments(hwndCB,0,0);					// 添加关闭按钮
	nHeight = CommandBar_Height(hwndCB);

	// 创建托盘图标
    nid.cbSize = sizeof(nid);
	nid.hWnd = hWnd;
	nid.uCallbackMessage = WM_ICONNOTIFY;
    nid.uID	= IDI_ICON1;				// 被显示图标ID,必须是16×16
    nid.uFlags = NIF_ICON | NIF_TIP |	// uFlags指明其余的几个成员(hIcon、
				 NIF_MESSAGE;			// uCallBackMessage和szTip)的值是否有效
    //nid.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON2));
	nid.hIcon = (HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_ICON1),
		IMAGE_ICON,
		16,16,0);
	_tcscpy(nid.szTip,_T("测试程序"));	//图标提示为"测试程序"
    
	Shell_NotifyIcon(NIM_ADD,&nid);		// NIM_ADD - 向任务栏添加托盘图标
	
	
	// 将一个图标分配给窗口
	HICON hIcon = (HICON)SendMessage(hWnd,WM_GETICON,ICON_SMALL,0);
	if(hIcon == 0)
	{
		hIcon = (HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_ICON3),IMAGE_ICON,16,16,0);
		SendMessage(hWnd,WM_SETICON,ICON_SMALL,(LPARAM)hIcon);
	}	
	
	// 在左边创建一树型视图控件
	SetRect(&rect,0,nHeight,lpcs->cx/3,lpcs->cy-nHeight);
	hwndChild = CreateTV(hWnd,&rect);
	if(!IsWindow(hwndChild)) // 如果树形视图控件没有创建成功,释放主框架
	{
		DestroyWindow(hWnd);
		return 0;
	}
	
	// 在右边创建列表视图控件
	SetRect(&rect,lpcs->cx/3,nHeight,(lpcs->cx * 2)/3,lpcs->cy - nHeight);
	hwndChild = CreateLV(hWnd,&rect);
	if(!IsWindow(hwndChild))
	{
		DestroyWindow(hWnd);
		return 0;
	}

	// 在树形视图控件中插入基本的根键
	InsertTV(hWnd,NULL,_T("HKEY_CLASSES_ROOT"),(LPARAM)HKEY_CLASSES_ROOT,1);
	InsertTV(hWnd,NULL,_T("HKEY_CURRENT_USER"),(LPARAM)HKEY_CURRENT_USER,1);
	InsertTV(hWnd,NULL,_T("HKEY_LOCAL_MACHINE"),(LPARAM)HKEY_LOCAL_MACHINE,1);
	InsertTV(hWnd,NULL,_T("HKEY_USERS"),(LPARAM)HKEY_USERS,1);
	
	// 处理WM_CREATE消息,必须return 0,返回-1则该窗口被释放并且CreateWindow将返回NULL
	return 0;
}

/************************************************************************
** 函数:LRESULT DoSizeMain (HWND hWnd, 
                             UINT wMsg, 
							 WPARAM wParam,
							 LPARAM lParam)
** 输入:
** 输出:处理WM_SIZE消息,必须return 0
** 功能:主窗口WM_SIZE消息处理函数,当窗体大小改变是会发送该消息,用于重绘窗口
** 作者:XZP
** 日期:07.9.5
** 备注:
************************************************************************/
LRESULT DoSizeMain (HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)
{
	HWND hwndLV,hwndTV;		// hwndLV - 列表视图句柄;hwndTV - 树形视图句柄
	RECT rect;
	int nDivPos;			// 注册表左边树形视图的宽度

	// 获得列表视图和树形视图句柄
	hwndLV = GetDlgItem(hWnd,ID_LISTV);
	hwndTV = GetDlgItem(hWnd,ID_TREEV);
	
	// 获得客服区位置和大小并调整列表视图和树形视图
	GetClientRect(hWnd,&rect);
	rect.top += CommandBar_Height(GetDlgItem(hWnd,IDC_CMDBAR));
	nDivPos = ((rect.right - rect.left)*nDivPct)/100;

	SetWindowPos(hwndTV,				// 要改变的窗口的句柄 - 树形视图
				 NULL,					// hWndInsertAfter调整窗口Z轴的位置
				 rect.left,rect.top,	// 窗口水平面位置和大小
				 nDivPos,rect.bottom - rect.top,
				 SWP_NOZORDER);			// 保留Z轴位置,忽略参数hWndInsertAfter 
	SetWindowPos(hwndLV,
				 NULL,
				 nDivPos,rect.top,
				 rect.right - rect.left - nDivPos,
				 rect.bottom - rect.top,
				 SWP_NOZORDER);
	
	return 0;
}

/************************************************************************
** 函数:LPARAM DoMainCommandExit(HWND hWnd,
								  WORD idItem,
								  HWND hwndCtl,
								  WORD wNotifyCode)
** 输入:
** 输出:对应处理所有的WM_COMMAND消息,都要return 0
** 功能:菜单栏"Exit"菜单响应函数,退出程序
** 作者:XZP
** 日期:07.9.5
** 备注:通用向主窗口发送WM_CLOSE退出窗口
************************************************************************/
LPARAM DoMainCommandExit(HWND hWnd,WORD idItem,HWND hwndCtl,WORD wNotifyCode)
{
	SendMessage(hWnd,WM_CLOSE,NULL,NULL);
	return 0;
}

/************************************************************************
** 函数:LPARAM DoMainCommandAbout(HWND hWnd,
								   WORD idItem,
								   HWND hwndCtl,
								   WORD wNotifyCode)
** 输入:
** 输出:对应处理所以的WM_COMMAND消息,都要return 0
** 功能:菜单栏"About"菜单响应函数,退出程序
** 作者:XZP
** 日期:07.9.5
** 备注:通过DialogBox()显示帮助对话框,DialogBox()第二个参数可以是这个对
话框的名称,也可是是它的ID。在资源文件里的aboutbox DIALOG DISCARDABLE如果
定义了#define aboutbox 104,那么aboutbox就是个ID,没有定义就是对话框资源
模板的名称。
************************************************************************/
LPARAM DoMainCommandAbout(HWND hWnd,WORD idItem,HWND hwndCtl,WORD wNotifyCode)
{
	DialogBox(hInst,_T("aboutbox"),hWnd,AboutDlgProc);
	//DialogBox(hInst,MAKEINTRESOURCE(aboutbox),hWnd,AboutDlgProc);
	return 0;
}

/************************************************************************
** 函数:LPARAM DoMainNotifyListV(HWND hWnd,
								  WORD idItem,
								  HWND hwndCtl,
								  LPNMHDR pnmh)
** 输入:
		hWnd:		主窗口句柄	
		idItem:		列表视图ID
		hwndCtrl:	列表视图句柄	
		pnmh:		与列表视图消息相关的结构体
** 输出:
** 功能:注册表右边的列表视图的消息响应函数。
** 作者:XZP
** 日期:07.9.5
** 备注:
************************************************************************/
LPARAM DoMainNotifyListV(HWND hWnd,WORD idItem,HWND hwndCtl,LPNMHDR pnmh)
{
	int nCount = 0;			// 列表视图被选中项的个数
	LPNMLISTVIEW pnmv;
	LPARAM lParamSort;
	LVHITTESTINFO lvhti = {0};
	RECT rect = {0};
	POINT point= {0},point1= {0};
	int nItem = 0,nSubItem = 0;
	HWND hwndEdit = NULL;
	DWORD dwStyle = 0;
	HMENU hMenu,hSubMenu;
	TCHAR szText[MAX_PATH]={'\0'};

	switch(pnmh->code)
	{
	case NM_RCLICK:			// 列表视图右键菜单
		nCount = ListView_GetSelectedCount(hwndCtl);
		if(nCount)			// 有选择列表框中的项而点击右键
		{
			if(nCount>1)	// 选择了多项,灰显修改和重命名菜单
			{
				GetCursorPos(&point);
				hMenu = LoadMenu(hInst,MAKEINTRESOURCE(ID_MENU1));
				hSubMenu = GetSubMenu(hMenu,2);		// 取得一个弹出式菜单的句柄,它位于菜单中指定的位置
				SetForegroundWindow(hWnd);
				EnableMenuItem(hSubMenu,IDM_MODIFY,MF_GRAYED);
				EnableMenuItem(hSubMenu,IDM_RENAME,MF_GRAYED);
				TrackPopupMenu(hSubMenu,			// 显示一个弹出式菜单
					TPM_RIGHTALIGN | TPM_BOTTOMALIGN,
					point.x,point.y,0,hWnd,NULL);
				DestroyMenu(hMenu);					// 删除菜单并释放资源
				return 0;
			}
			else
				return PopupMenu(hWnd,ID_MENU1,2,1);
		}
		else				// 如果没有选择列表框的项而点击右键
			return PopupMenu(hWnd,ID_MENU1,1,1);
		
	case NM_DBLCLK:			// 左键双击,使列表视图指定项可编辑
		/*GetCursorPos(&point);// 获得当前鼠标位置
		ScreenToClient(hwndCtl,&point);	// 坐标转换,不转换将出现坐标混乱现象
		memset(&lvhti,0,sizeof(lvhti));
		lvhti.pt = point;
		// 测试鼠标当前选中的ITEM和SUBITEM
		nItem = ListView_SubItemHitTest(hwndCtl,&lvhti);
		if(nItem == -1)
			return 1;
		nItem = lvhti.iItem;
		nSubItem = lvhti.iSubItem;
		// 获取选中位置的区域
		//ListView_GetSubItemRect(hwndCtl,nItem,nSubItem,LVIR_LABEL,&rect);
		//point1.x = rect.left;
		//point1.y = rect.top;
		//ClientToScreen(hwndCtl,&point1);
		// 显示Edit编辑框,只需要创建一次EDIT控件,如果控件没有创建,
		// 就创建EDIT.如果控件已经创建了,就控制是显示还是隐藏
		// ClientToScreen(hwndCtl,)
		/*dwStyle = ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER;
		
	
		hwndEdit = GetDlgItem(hwndCtl,ID_EDIT);
		if(hwndEdit == NULL)
		{
			CreateWindowEx(0,		// dwStyleEx
					_T("edit"),		// 创建编辑框时发送_T("edit")类名
					NULL,
					dwStyle,		// dwStyle
					rect.left,		// 位置及大小
					rect.top,
					rect.right-rect.left,
					rect.bottom-rect.top,
					hwndCtl,		// 父窗口句柄

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -