滚动条控件
主要内容见导图
编写程序首先了解应当事先什么功能
比如滚动条控件,我们编写滚动条控件的程序实现的功能就是依据滚动条对编辑框内的内容进行更改
对于一个滚动条我们首先要确定它的范围,然后要确定它的初始化位置,为了使得编辑框获得位置信息,则应该调用相关函数对位置消息进行相关获取
滚动条控件为窗口操作的常用工具,形式上分为窗口滚动条和子窗口滚动条控件,窗口滚动条由系统进行创建,位置和尺寸固定;子窗口滚动条由应用程序创建,位置和尺寸由程序员决定
下面为准备实现的滚动条控件,实现功能直接看按钮就可以
对于滚动条方面应当实现滚动条与编辑框的相关通信以及初始化
第一步就是初始化,初始化需要的内容就是首先设置编辑框的范围,然后设置编辑框的默认位置
上面两个分别由SetScrollRange和SetScrollPos达到。还有一个就是实现初始化显示,这些都是在一开始就要出现的,无关于其他消息响应
因此在OnInitDialog()中写上初始化函数如下面,需要实现显示的函数为ChangeDisplayInfo(m_scrollbar.GetScrollPos());
BOOL C滚动条控件testDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
m_ScrollBar.SetScrollRange(0, 20);
m_ScrollBar.SetScrollPos(10);
ChangeDisplayInfo(m_ScrollBar.GetScrollPos());
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
然后我们想想怎么去编写显示函数,GetScrollPos返回int型参数,所以形参为int 在下面注意在该函数当中_itow有不安全因素,暂且使用_CRT_SECURE_NO_WARNINGS将报错去除
通过类向导添加函数如下
void C滚动条控件testDlg::ChangeDisplayInfo(int pos)
{
TCHAR sPos[10];
_itow(pos, sPos, 10);//将数值pos按照十进制的形式转化到字符串sPos当中
m_dispinfo.SetSel(0, -1);
m_dispinfo.ReplaceSel(sPos);
UpdateData(FALSE);//将与空间绑定的内容显示到屏幕上
}
接下来响应关于滚动条的消息:VScroll
每次点击箭头或者中间线消息分别设置不同位置与编辑框响应,注意不同的响应函数与响应消息
void C滚动条控件testDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
int iNowPos;
switch (nSBCode)
{
if (pScrollBar == &m_ScrollBar)
{
case SB_THUMBTRACK://拖动滚动滑块时
m_ScrollBar.SetScrollPos(nPos);
ChangeDisplayInfo(m_ScrollBar.GetScrollPos());
case SB_LINEDOWN://单击滚动条向下的箭头
iNowPos = m_ScrollBar.GetScrollPos();
iNowPos = iNowPos + 1;
if (iNowPos>20)
iNowPos = 20;
m_ScrollBar.SetScrollPos(iNowPos);
ChangeDisplayInfo(m_ScrollBar.GetScrollPos());
break;
case SB_LINEUP: //单击滚动条向上的箭头
iNowPos = m_ScrollBar.GetScrollPos();
iNowPos = iNowPos - 1;
if (iNowPos<0)
iNowPos = 0;
m_ScrollBar.SetScrollPos(iNowPos);
ChangeDisplayInfo(m_ScrollBar.GetScrollPos());
break;
case SB_PAGEDOWN://单击滚动条下面的箭头与滚动块之间区域
iNowPos = m_ScrollBar.GetScrollPos();
iNowPos = iNowPos + 3;
if (iNowPos>20)
iNowPos = 20;
m_ScrollBar.SetScrollPos(iNowPos);
ChangeDisplayInfo(m_ScrollBar.GetScrollPos());
break;
case SB_PAGEUP://单击滚动条上面的箭头与滚动块之间的区域
iNowPos = m_ScrollBar.GetScrollPos();
iNowPos = iNowPos - 3;
if (iNowPos<0)
iNowPos = 0;
m_ScrollBar.SetScrollPos(iNowPos);
ChangeDisplayInfo(m_ScrollBar.GetScrollPos());
break;
}
}
CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}
后续依据功能写下列代码
void C滚动条控件testDlg::OnBnClickedExitButton()
{
// TODO: 在此添加控件通知处理程序代码
OnOK();
}
void C滚动条控件testDlg::OnBnClickedResetButton()
{
// TODO: 在此添加控件通知处理程序代码
m_ScrollBar.SetScrollPos(10);
ChangeDisplayInfo(m_ScrollBar.GetScrollPos());
}
void C滚动条控件testDlg::OnBnClickedBottomButton()
{
// TODO: 在此添加控件通知处理程序代码
m_ScrollBar.SetScrollPos(20);
ChangeDisplayInfo(m_ScrollBar.GetScrollPos());
}
void C滚动条控件testDlg::OnBnClickedTopButton()
{
// TODO: 在此添加控件通知处理程序代码
m_ScrollBar.SetScrollPos(0);
ChangeDisplayInfo(m_ScrollBar.GetScrollPos());
}
静态控件
静态空间是一种包含正文或者图形的小窗口,应用程序通常使用静态控件标记其他控制窗口或者分割不同组别的控件
一般情况下静态控件不接受用户消息也不发出消息,然而应用程序可以设置静态控件的样式从而使得用户能够响应输入
静态文本像超链接一样响应用户的输入,则应该加入SS_NOTIFY样式从而允许静态控件向父窗口发送WM_COMMAND消息
初始化函数中代码编写
BOOL C静态控件Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
m_bmp.ModifyStyle(0, SS_BITMAP);
HBITMAP hBmp = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));
m_bmp.SetBitmap(hBmp);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
响应BN_CLICKED代码编写
void C静态控件Dlg::OnStnClickedStaticBmp()
{
// TODO: 在此添加控件通知处理程序代码
BITMAP bmp;
GetObject(m_bmp.GetBitmap(), sizeof(BITMAP), &bmp);
CString msg;
msg.Format(L"Image Size%d*%d", bmp.bmWidth, bmp.bmHeight);
AfxMessageBox(msg);
}
列表框控件
初始化代码如下
BOOL C静态控件Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
DWORD cchCurDir = MAX_PATH;
//MAX_PATH是C语言运行时库中通过#define指令定义的一个宏常量,它定义了编译器所支持的最长全路径名的长度
LPTSTR lpszCurDir;//表示指向字符/字符串的指针
TCHAR tchBuffer[MAX_PATH];
lpszCurDir = tchBuffer;
GetCurrentDirectory(cchCurDir, lpszCurDir);
//DWORDGetCurrentDirectory(DWORDnBufferLength,//sizeofdirectorybuffer
//LPTSTRlpBuffer//directorybuffer
// );
DlgDirList(lpszCurDir, IDC_LIST_DIR, IDC_STATIC_DIR, 0);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
删除条目代码如下
void C静态控件Dlg::OnLbnDblclkListDir()
{
// TODO: 在此添加控件通知处理程序代码
int i = m_list.GetCurSel();//获取光标的位置
CString str;
m_list.GetText(i, str);//定位才能获取文件名
m_list.DeleteString(i);
CString msg = L"Item" + str + L"deleted!";
AfxMessageBox(msg);
}