妈妈正在做年夜饭,坐等好吃的上桌
第六课、客户端界面的设计和编写
1.6 添加菜单消息响应,从列表中删除条目
1.添加菜单消息响应的函数(在Dlg类上右键属性,右边的事件):
终端管理 进程管理 窗口管理 桌面管理 文件管理 语音管理 视频管理 服务管理 注册表管理 断开连接
2.删除列表中的条目(断开连接函数的处理函数):
用到的CListCtrl 成员函数
(1)DeleteItem
BOOL DeleteItem(
int nItem //列表的索引 从0开始
);
(2)GetSelectionMark
int GetSelectionMark( ); //得到用户选中的条目索引
(3) GetItemText
CString GetItemText(
int nItem, //哪一行
int nSubItem //行中的那个子列
) const;
3.添加下线菜单 断开连接 ID: IDM_ONLINE_DELETE
4.在断开连接选项的响应函数添加代码:
void CVeryEvilDlg::OnOnlineDelete()
{//断开连接
// TODO: 在此添加命令处理程序代码
CString strIP;
int iSelect=m_CList_Online.GetSelectionMark( );//得到用户当前选定的条目索引
strIP=m_CList_Online.GetItemText(iSelect,ONLINELIST_IP);//得到选定行的IP列的内容
m_CList_Online.DeleteItem(iSelect);
strIP+=" 主机断开连接";
ShowMessage(true,strIP);
}
第六课、客户端界面的设计和编写
1.7 为对话框添加菜单栏并添加事件响应
1.创建菜单的资源 ID: IDR_MENU_MAIN
2.添加菜单: 文件--退出(IDM_MAIN_CLOSE)
设置--参数设置(IDM_MAIN_SET)----生成服务端(IDM_MAIN_BUILD)
帮助--关于(IDM_MAIN_ABOUT)
3.为对话框添加代码,显示菜单:
(1) 认识几个API函数:
HMENU LoadMenu( //载入菜单
HINSTANCE hInstance, //资源所在文件模块的句柄标识 (DLL文件时用到此参数,EXE文件用不到)
LPCTSTR lpMenuName //资源ID
);
BOOL SetMenu( //为窗口设置菜单
HWND hWnd, //要设置菜单的窗口句柄
HMENU hMenu //菜单标识
);
BOOL DrawMenuBar( //显示菜单
HWND hWnd //要显示菜单的窗口句柄
);
(2)在OnInitialDlg()中添加菜单的代码
HMENU hmenu;
hmenu=LoadMenu(NULL,MAKEINTRESOURCE(IDR_MENU_MAIN)); //载入菜单资源
::SetMenu(this->GetSafeHwnd(),hmenu); //为窗口设置菜单
::DrawMenuBar(this->GetSafeHwnd()); //显示菜单
3.为每一个菜单添加事件响应
4.添加消息响应函数代码:
退出菜单代码:
BOOL PostMessage( HWND hWnd, //标识向那个窗口发送消息
UINT Msg, //消息内容
WPARAM wParam, //消息参数
LPARAM lParam //消息参数
);
PostMessage(WM_CLOSE,0,0);
关于菜单代码:
CAboutDlg dlgAbout;
dlgAbout.DoModal();
其他代码用MessageBox代替
注意:在编译Edit控件的文字时可以在字符串中用\r\n来达到换行的目的
第七课、客户端界面的设计和编写
1.8 为对话框添加状态条并在态条上显示文字
1.创建字符串资源 ID: IDR_STATUSBAR_STRING 标题 : 就绪
2.添加状态条变量:
Protected:
CStatusBar m_wndStatusBar; //状态条
3.查看MSDN:
CStatusBar SetIndicators
BOOL SetIndicators( //在状态条中加入对应字符串ID
const UINT* lpIDArray, //字符串ID
int nIDCount //个数
);
void SetPaneInfo( //设置状态条的显示状态
int nIndex, //状态条的索引
UINT& nID, //状态条的字符ID
UINT& nStyle, //状态条的样式
int& cxWidth //状态条的宽度
) const;
4.写入代码创建状态条的代码:
(1) 创建字符ID的数组
static UINT indicators[] =
{
IDR_STATUSBAR_STRING
};
(2)添加CreatStatusBar自定义函数用于创建我们的状态栏:
void CVeryEvilDlg::CreatStatusBar(void)
{//参见MSDN样列代码
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT))) //创建状态条并设置字符资源的ID
{
TRACE0("Failed to create status bar\n");
return ; // fail to create
}
CRect rc;
::GetWindowRect(m_wndStatusBar.m_hWnd,rc);
m_wndStatusBar.MoveWindow(rc); //移动状态条到指定位置
}
然后在OnInitalDialog()函数中调用该函数
(3)在OnSize 中添加代码:
if(m_wndStatusBar.m_hWnd!=NULL){ //当对话框大小改变时 状态条大小也随之改变
CRect rc;
rc.top=cy-20;
rc.left=0;
rc.right=cx;
rc.bottom=cy;
m_wndStatusBar.MoveWindow(rc);
m_wndStatusBar.SetPaneInfo(0, m_wndStatusBar.GetItemID(0),SBPS_POPOUT, cx-10);
}
5.写入状态上显示文字的代码:
.h中添加变量
protected:
int iCount //上线主机总数
在Dlg的构造函数中出事化为0
iCount = 0;//初始化上线主机总数为0
6,在ShowMessage()函数中统计在线主机数量,代码如下:
CString strStatusMsg;
if (strMsg.Find("上线")>0) //处理上线还是下线消息
{
iCount++;
}else if (strMsg.Find("下线")>0)
{
iCount--;
}else if (strMsg.Find("断开")>0)
{
iCount--;
}
iCount=(iCount<=0?0:iCount); //防止iCount 有-1的情况
strStatusMsg.Format("在线主机: %d",iCount);
m_wndStatusBar.SetPaneText(0,strStatusMsg); //在状态条上显示上线主机数
7.列表中添加条目时产生日志:
在Addlist()函数 中添加
ShowMessage(true,strIP+"主机上线");