第八课、客户端界面的设计和编写
1.9 为对话框添加入工具条
1.创建工具条资源(ToolBar) ID: IDR_TOOLBAR_MAIN 更改 Height:48 Width:48
点击一下“颜色选择工具”点选一下工作区中的那个大的方块,然后选择“铅笔工具”,点一下上面最后新生成的那个小方块,然后再点击一下下面的左面的小方块
就成功复制了一个,就这样直到复制13个为止。
在第九个和第十个中间设置一个分割条:点选第十个方块向右拖动一点即可
共12个工具条 9+3
2.添加BMP资源(制作好的工具栏图片用于替换我们刚才绘制的工具栏):
ID: IDB_BITMAP_MAIN
3.复制别人写好的处理图片工具栏的类:TrueColorToolBar(含CPP和.h)文件,添加这两个文件到现有项目中去.
4.Dlg头文件中添加:
#include "TrueColorToolBar.h"
5.声明变量:
proceted:
CTrueColorToolBar m_ToolBar;
6.添加专门用与产生我们我图片工具栏的CreateToolBar()函数
7.分析CTrueColorToolBar类继承于CToolBar,是网友写好的专门用于显示纯真图片工具栏的类,很好使的
8.CreateToolBar()函数中写入代码:
if (!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_ToolBar.LoadToolBar(IDR_TOOLBAR_MAIN))
{
TRACE0("Failed to create toolbar\n");
return; // fail to create
}
m_ToolBar.ModifyStyle(0, TBSTYLE_FLAT); //Fix for WinXP
m_ToolBar.LoadTrueColorToolBar
(
48, //加载真彩工具条
IDB_BITMAP_MAIN,
IDB_BITMAP_MAIN,
IDB_BITMAP_MAIN
);
RECT rt,rtMain;
GetWindowRect(&rtMain);
rt.left=0;
rt.top=0;
rt.bottom=80;
rt.right=rtMain.right-rtMain.left+10;
m_ToolBar.MoveWindow(&rt,TRUE);
m_ToolBar.SetButtonText(0,"文件管理");
m_ToolBar.SetButtonText(1,"进程管理");
m_ToolBar.SetButtonText(2,"窗口管理");
m_ToolBar.SetButtonText(3,"桌面管理");
m_ToolBar.SetButtonText(4,"终端管理");
m_ToolBar.SetButtonText(5,"语音管理");
m_ToolBar.SetButtonText(6,"视频管理");
m_ToolBar.SetButtonText(7,"服务管理");
m_ToolBar.SetButtonText(8,"注册表管理");
m_ToolBar.SetButtonText(10,"参数设置");
m_ToolBar.SetButtonText(11,"生成服务端");
m_ToolBar.SetButtonText(12,"帮助");
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
10.为了使我们创建的图形工具栏也具有自适应大小功能,所以在OnSize中添加以下代码:
if(m_ToolBar.m_hWnd!=NULL) //工具条
{
CRect rc;
rc.top=rc.left=0;
rc.right=cx;
rc.bottom=80;
m_ToolBar.MoveWindow(rc); //设置工具条大小位置
}
11.Oninitdialog 中添加CreateToolBar
12,解决最小化程序崩溃的问题,是因为最小化时也会产生以个窗口改变的消息WM_SIZE,这样我们在ONsize()函数中做的一些处理,如:获取
的cx,cy为0,然而我们全然不知,这样就自然会崩溃了
所以在onsize()函数的一开始添加如下代码(红色)
void CVeryEvilDlg::OnSize(UINT nType, int cx, int cy)
{//cx代表改变大小后的整个界面的宽度,cy代表改变大小后的整个界面的高度
CDialogEx::OnSize(nType, cx, cy);
//如果用户点击了最小化造成了改变,就什么也不做
if (SIZE_MINIMIZED == nType)
{
return;
}
...............................
}
13.我们都知道vs系列中工具条是不能直接添加命令响应函数的,只能把文字菜单工具栏的ID和快捷(图形)工具栏的ID值设为一样,只有
这样才能达到让图形工具栏响应命令函数的目的(ID相同的响应同一个消息函数)
14,综上我们为了让图形工具栏具有和上线主机列表控件的右键菜单具有相同的快捷功能,所以我们,把图形工具栏的ID全部改为和
菜单栏一样的ID
第九课、客户端界面的设计和编写
1.10 为程序添加系统托盘
1.创建菜单资源 ID: IDR_MENU_NOTIFY
添加子菜单 显示 IDM_NOTIFY_SHOW
退出 IDM_NOTIFY_CLOSE
2.认识一个API
Shell_NotifyIcon
BOOL Shell_NotifyIcon( //向系统托盘中加入图标
DWORD dwMessage, //状态
PNOTIFYICONDATA lpdata //含有图标 消息响应 的一个结构体
);
3.认识NOTIFYICONDATA 结构体:
typedef struct _NOTIFYICONDATA {
DWORD cbSize; //结构体自身大小
HWND hWnd; //托盘的父窗口 托盘发出的消息由哪一个窗口响应
UINT uID; //显示图标的ID
UINT uFlags; //托盘的状态 (如有图标,有气泡提示,有消息响应等)
UINT uCallbackMessage; //托盘事件的消息响应函数
HICON hIcon; //图标的变量
TCHAR szTip[64]; //气泡的显示文字
DWORD dwState; //图标的显示状态
DWORD dwStateMask; //图标的显示状态
TCHAR szInfo[256]; //气泡的显示文字 (可以忽略)
union {
UINT uTimeout;
UINT uVersion;
};
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem;
HICON hBalloonIcon;
} NOTIFYICONDATA, *PNOTIFYICONDATA;
4,在Dlg中声明一个:
protected:
NOTIFYICONDATA nid;//托盘图标结构体变量
5.在oninitdialog函数中写入加入系统脱盘的代码:
nid.cbSize = sizeof(nid); //大小赋值
nid.hWnd = m_hWnd; //父窗口
nid.uID = IDR_MAINFRAME; //icon ID
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; //托盘所拥有的状态
nid.uCallbackMessage = UM_ICONNOTIFY; //回调消息
nid.hIcon = m_hIcon; //icon 变量
CString str="PCRemote远程协助软件........."; //气泡提示
lstrcpyn(nid.szTip, (LPCSTR)str, sizeof(nid.szTip) / sizeof(nid.szTip[0]));
Shell_NotifyIcon(NIM_ADD, &nid); //显示托盘
5,stdafx.h文件中加入自定义消息的定义
//自定义消息
enum
{
UM_ICONNOTIFY= WM_USER+0x100,
};
6.在.h消息映射中声明消息处理函数:
afx_msg void OnIconNotify(WPARAM wParam,LPARAM lParam);
7,在cpp文件中添加消息映射
ON_MESSAGE(UM_ICONNOTIFY, (LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM))OnIconNotify)
8. cpp文件中写入消息处理函数代码:
void CVeryEvilDlg::OnIconNotify(WPARAM wParam, LPARAM lParam)
{
switch ((UINT)lParam)
{
case WM_LBUTTONDOWN: // click or dbclick left button on icon
case WM_LBUTTONDBLCLK: // should show desktop
if (!IsWindowVisible())
ShowWindow(SW_SHOW);
else
ShowWindow(SW_HIDE);
break;
case WM_RBUTTONDOWN: // click right button, show menu
CMenu menu;
menu.LoadMenu(IDR_MENU_NOTIFY);
CPoint point;
GetCursorPos(&point);
SetForegroundWindow();
menu.GetSubMenu(0)->TrackPopupMenu(
TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
point.x, point.y, this, NULL);
PostMessage(WM_USER, 0, 0);
break;
}
}
6,为菜单添加消息响应函数
void CVeryEvilDlg::OnNotifyClose()
{//退出
// TODO: 在此添加命令处理程序代码
PostMessage(WM_CLOSE);
}
void CVeryEvilDlg::OnNotifyShow()
{//显示
// TODO: 在此添加命令处理程序代码
ShowWindow(SW_RESTORE);
}
7.为了解决程序退出后托盘托图标还在的问题,给dlg添加WM_CLOSE消息并写入代码:
Shell_NotifyIcon(NIM_DELETE, &nid); ////程序退出时销毁图标