当前位置:C++技术网 > 资讯 > 利用ModifyStyle函数创建MFC封装默认的滚动轮

利用ModifyStyle函数创建MFC封装默认的滚动轮

更新时间:2016-01-29 21:18:18浏览次数:1+次

ModifyStyle,调用这个函数修改窗口的风格,此函数的厉害之处在于可以在窗口创建完成后修改窗口风格,虽然也有一些属性改不了。

BOOL ModifyStyle
(
DWORD dwRemove,
DWORD dwAdd,
UINT nFlags=0
);
dwRemove 指定修改时要删除的窗风格。
dwAdd 指定修改时将要增加的窗口风格。
nFlags 该参数将被传给SetWindowPos,否则为0,如果SetWindowPos不被调用的话,一般该参数默认值
4.返回值:
如果该函数成功调用返回一个非0值,否则返回0;
此函数有些不足,在某些特定的控件中有时候修改不了属性,由于本文主旨不是讲这个函数的局限性,因此,就不做讨论,读者可以试着自己研究,或许以后我开发程序用到这个函数,那时候就有必要做深入的研究了。学习其实就是这样,其实,我们工作就是这样的过程,一边开发一边学习。
新建一个对话框的功能,并且新建一个对话框关联一个类命名为Test。在此类中,添加OnInitDialog虚函数消息。然后写代码:
BOOL CTest::OnInitDialog()
{
CDialogEx::OnInitDialog();

// TODO:  在此添加额外的初始化
this->ModifyStyle(0,WS_VSCROLL,0);
return TRUE;  // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
运行之后,你会发现并没有滚动条,难道是这个函数有问题?遇到了所谓的函数局限性?然后我又测试了一遍,利用WS_MINIMIZEBOX风格,此时运行成功了,之后我在查了资料之后,发现,此函数需要添加一个函数才能显示出滚动条风格——ShowScrollBar。我们看看具体的代码:
BOOL CTest::OnInitDialog()
{
CDialogEx::OnInitDialog();

// TODO:  在此添加额外的初始化
this->ShowScrollBar(SB_VERT);
this->ModifyStyle(0,WS_VSCROLL,0);
return TRUE;  // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

运行之后,有了滚动条。

不过我们并没有因此就结束了这篇文章,下面我们来测试一个结构体,为我们的下篇文章提前准备好资料。

添加一个消息函数:
void CTest::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
int nCurpos,nMin,nMax,nThumbWidth;
SCROLLINFO siInfo;
GetScrollInfo(SB_VERT,&siInfo);
nCurpos = siInfo.nPos;
nMin = siInfo.nMin;
nMax = siInfo.nMax;
nThumbWidth = siInfo.nPage;
switch (nSBCode)
{
case SB_THUMBTRACK:
nCurpos = GetScrollPos(SB_VERT);
ScrollWindow(0,-(nPos-nCurpos));
SetScrollPos(SB_VERT,nPos); 
break;

case SB_LINELEFT:
nCurpos = GetScrollPos(SB_VERT);
SetScrollPos(SB_VERT,nCurpos-1);
if (nCurpos !=0)
ScrollWindow(0,1);
break;
case SB_LINERIGHT:
nCurpos = GetScrollPos(SB_VERT);
SetScrollPos(SB_VERT,nCurpos+1);
if (nCurpos+nThumbWidth < nMax)
ScrollWindow(0,-1); 
break;
case SB_PAGELEFT: //在滚动块的上方空白滚动区域单击,增量为6
SetScrollPos(SB_VERT,nCurpos-6);
if (nCurpos+nThumbWidth >0)
ScrollWindow(0,6);
break;
case SB_PAGERIGHT: //在滚动块的下方空白滚动区域单击,增量为6
SetScrollPos(SB_VERT,nCurpos+6);
if (nCurpos+nThumbWidth < nMax)
ScrollWindow(0,-6);
break;
case SB_LEFT: 
SetScrollPos(SB_VERT,0);
ScrollWindow(0,nCurpos);
break;
}
CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}
在nMin,nMax,nThumbWidth三个变量处设置断点,看看每个的值,经测试得到,nMin,nMax,nThumbWidth分别为0,100,0;在这里我需要特别强调下nThumbWidth,这个是我们的滑块大小,可是,它竟然为0,这是为什么?哈哈,憋急(还是喜欢东北人说这句,(⊙o⊙)…,我在东北读书,听人说惯了,还是挺有意思的)。在下篇文章中,我会为大家解释,这不是本篇的重点,重点已经完了,就是几句代码。
在这里,检讨下自己,这一个礼拜,太放纵了,没有静下心来好好学习,哎,忍得了寂寞,才能守得住繁华。加油!