📄 regview.cpp
字号:
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 + -