在MFC中,滚动条响应BS_PAGE...系列翻页消息时,点击滚动条空白区域翻页时,为什么会出现短暂的黑色条状!

作者&投稿:胡詹 (若有异议请与网页底部的电邮联系)
mfc滚动条的相关问题~

首先你要有一个主Wnd CExtendMainWnd ,里面放一个子Wnd CExtendWnd m_wndExtend和一个CScrollBar m_vScrollBar,Cedit都放在子Wnd中,子Wnd跟主Wnd的高度和Y坐标都是相同的,宽度留一个地方放ScrollBar.拖动滚动条的时候,把子Wnd MoveWindow到相应的位置。你的CEdit每个都有高度的,可以根据N个CEdit高度和与ParentWnd.GetClientRect 的高度进行比较,如果和超过了客户端的高度,
CScrollBar.ShowWindow(SW_SHOW)(之前先把CScrollBar 创建好后 Hide).
后面再来响应ON_WM_VSCROLL()

主要的代码:
void CExtendMainWnd::CreateWnd(CWnd* pParent,int iColorLevel,CRect& rect,int iDefItemHeight )
{
CWnd::Create(NULL,NULL,WS_CHILD|WS_VISIBLE,rect,pParent,1001);
m_wndExtend.CreateWnd(this,m_iColorlevel,rect,iDefItemHeight);
m_vScrollBar.Create(WS_CHILD|SB_VERT,CRect(0,0,0,0),this,1002);
}
每次添加完一个CEdit
void CExtendWnd::AddItemWnd(CBaseItemWnd* pBaseItemWnd)
{
//我这里是动态添加的
ExtendItem* pExtendItem = new ExtendItem;
pExtendItem->m_pBaseWnd = pBaseItemWnd;
pExtendItem->m_pBaseWnd->CreateWnd(CRect(0,0,0,0),m_iColorLevel,this,m_uIDWnd );
m_uIDWnd ++;//

Arrange();
GetParent()->SendMessage(WM_WHETHERNEEDSCROLL,0,0);//加完给父窗口发消息去知道需不需要加滚动条
}
消息处理
LRESULT CExtendMainWnd::OnWhetherNeedScroll(WPARAM wParam,LPARAM lParam)
{
UpdataScrollBar();
Arrange();
return 0;
}



就UpdataScrollBar();
void CExtendMainWnd::UpdataScrollBar()
{
CRect rtParent;
GetWindowRect(&rtParent);
CRect rtWindow;
m_wndExtend.GetWindowRect(&rtWindow);
if ( m_wndExtend.GetDisplayHeight() > rtParent.Height() )
{

SCROLLINFO info;
info.cbSize = sizeof(SCROLLINFO);
info.fMask = SIF_ALL;
info.nMin = 0;
info.nMax = m_wndExtend.GetDisplayHeight();
info.nPage = rtParent.Height();
info.nPos = m_iScrollBarPos;
m_vScrollBar.SetScrollInfo(&info);
m_vScrollBar.ShowWindow(SW_SHOW);
m_bNeedScrollBar = TRUE;
}
else
{
m_vScrollBar.ShowWindow(SW_HIDE);
m_bNeedScrollBar = FALSE;
}
}

拖动滚动条的消息响应
void CExtendMainWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
SCROLLINFO si;
m_vScrollBar.GetScrollInfo(&si);
CRect rtParent;
CRect rtChild;
GetClientRect(&rtParent);
m_wndExtend.GetWindowRect(&rtChild);
ScreenToClient(&rtChild);
switch(nSBCode)
{
case SB_TOP:
{
si.nPos = si.nMin;
}
break;
case SB_BOTTOM:
{
si.nPos = si.nMax;
}
break;
case SB_LINEUP:
{
si.nPos -= 1;
}
break;
case SB_LINEDOWN:
{
si.nPos += 1;
}
break;
case SB_PAGEUP:
{
si.nPos -= si.nPage;
}
break;
case SB_PAGEDOWN:
{
si.nPos += si.nPage;
}
break;
case SB_THUMBTRACK:
{
si.nPos += nPos;
}
break;
}
if(si.nPos > (int)(si.nMax-si.nMin-si.nPage+1))
si.nPos = si.nMax-si.nMin-si.nPage+1;
if(si.nPos < si.nMin)
si.nPos=si.nMin;
m_iScrollBarPos = si.nPos;
m_vScrollBar.SetScrollInfo(&si);
m_wndExtend.MoveWindow(rtParent.left,rtParent.top - si.nPos,rtChild.Width(),rtChild.Height());
//Invalidate(FALSE);
CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}

BOOL CExtendMainWnd::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
CRect rtParent;
CRect rtChild;
GetClientRect(&rtParent);
m_wndExtend.GetWindowRect(&rtChild);
ScreenToClient(&rtChild);
SCROLLINFO si;
m_vScrollBar.GetScrollInfo(&si);
if (zDelta > 0)
{
zDelta = LINE_COUNT;
}
else
{
zDelta = -LINE_COUNT;
}
si.nPos += -zDelta;
if(si.nPos > (int)(si.nMax-si.nMin-si.nPage+1))
si.nPos = si.nMax-si.nMin-si.nPage+1;
if(si.nPos < si.nMin)
si.nPos=si.nMin;
m_iScrollBarPos = si.nPos;
m_vScrollBar.SetScrollInfo(&si);
m_wndExtend.MoveWindow(rtParent.left,rtParent.top - si.nPos,rtChild.Width(),rtChild.Height());

return CWnd::OnMouseWheel( nFlags, zDelta, pt);
}

重新定义下滚动条的函数,里面加上Invalidate(FALSE);update(true)这两个是要求重绘的,自己去了解下用法

是不是OnDraw里面处理的东西太多了?所以整页滚动的时候重画会延时呢?
如果是这样,解决办法如下:通过CreateCompatibleDC创建并使用内存DC,将需要画的内容都画到内存DC上面。在OnDraw中,不再对pDC每次都画很多东西,只是用内存DC复制到pDC,这样显示会快很多,应该就不会有黑条了。


在MFC中,滚动条响应BS_PAGE...系列翻页消息时,点击滚动条空白区域翻页...
如果是这样,解决办法如下:通过CreateCompatibleDC创建并使用内存DC,将需要画的内容都画到内存DC上面。在OnDraw中,不再对pDC每次都画很多东西,只是用内存DC复制到pDC,这样显示会快很多,应该就不会有黑条了。

在MFC中如何为滚动条添加消息事件处理程序:onvscroll
滚动条控件的滚动事件是由其父对话框来响应的 所以,直接响应对话框的WM_VSCROLL和WM_HSCROLL消息就可以了 若对话框中有多个滚动条,则可以用WM_VSCROLL和WM_HSCROLL消息响应函数中的参数CScrollBar pScrollBar来进行判断

在MFC中如何为滚动条添加消息事件处理程序:onvscroll
在你的类上点右键,再在这里找 添加就可以了

举例说明在MFC应用程序中操作滚动条所必须的重要操作(MFC)
SetScrollSizes() MFC 库函数,设置滚动条属性。参数含义参见 MSDN 。void SetScrollSizes(int nMapMode,\/\/ 影射模式。SIZE sizeTotal,\/\/ 滚动范围,即所有 page 加起来的高度或宽度 const SIZE& sizePage = sizeDefault,\/\/ 每页的大小。根据模式的不同,度量的尺度不同 const SIZE& sizeLine = size...

求高手解救MFC中关于滚动条的问题。
m_List.InsertColumn(0,"11111");m_List.InsertColumn(1,"22222");m_List.InsertColumn(2,"33333");m_List.InsertColumn(3,"44444");for(int n=0;n<4;n++)m_List.SetColumnWidth(n,80);另外注意空间属性如图设置

在MFC中怎么让编辑框的滚动条置底端显示,能不能详细点
右键->属性->样式->在排列文本中选择“多行”,然后在右侧只选中水平滚动就可以了。

MFC如何弄滚动滑动条然后在静态文本框中显示文字?
1、滚动条是自己创建窗口时要加的一个参数,用函数CreateWindow 2、在static控件中显示文字用函数SetWindowText ,注意不要弄错句柄,这个函数好像不需要句柄,自己看MSDN

mfc 滚动条去除!!
m_clist,初始化的时候加入代码;m_clist.ShowScrollBar(SB_HORZ, FALSE);这个你可能试过,可以隐藏到水平滚动条,但是如果你界面太小,或者你拖拽了列宽...这个水平滚条还是会出来,似乎没有什么很好的解决办法;建议你固定好每列的宽度,不要超过显示的页面,这样就不会出现滚动条了;

MFC 对话框中,自带的滚动条滑块长度的设置
滑块的长度是根据SetScrollRange设置来变化的。改变SetScrollRange设置就可以改变滑块的长度。

MFC中我想要重绘窗口中的滚动条,该怎么做?
方法1,利用系统消息 重绘(系统钩子)方法2,禁止系统的滚动条,增加新的滚动条代替系统的滚动条

枝江市18075123664: 在MFC中,滚动条响应BS - PAGE...系列翻页消息时,点击滚动条空白区域翻页时,为什么会出现短暂的黑色条状! -
贺蒲脂必: 是不是OnDraw里面处理的东西太多了?所以整页滚动的时候重画会延时呢?如果是这样,解决办法如下:通过CreateCompatibleDC创建并使用内存DC,将需要画的内容都画到内存DC上面.在OnDraw中,不再对pDC每次都画很多东西,只是用内存DC复制到pDC,这样显示会快很多,应该就不会有黑条了.

枝江市18075123664: 在mfc中关于滚动条的创建和响应 -
贺蒲脂必: CClientDC dc(this);dc.DrawText(str,rect,DT_RIGHT);str字符串;rect;你建的矩形区域;DT_RIGHT是延伸方式!你看MSDN.

枝江市18075123664: MFC我在对话框里建了一个水平滚动条,可是没找到滚动条的消息处理函数 -
贺蒲脂必: 你在这个滚动条控件的属性里当然是找不到这个响应函数的 这个响应函数是在 滚动条控件 所在的对话框的属性中添加的

枝江市18075123664: 在MFC中如何为滚动条添加消息事件处理程序onvscroll -
贺蒲脂必: 滚动条控件的滚动事宜是由其父对话框来响应的所以直接响应对话框的WM_VSCROLL和WM_HSCROLL消息就可以了 若对话框中有多个滚动条则可以用WM_VSCROLL和WM_HSCROLL消息响应函数中的参数CScrollBar* pScrollBar来进行断定

枝江市18075123664: 举例说明在MFC应用程序中操作滚动条所必须的重要操作(MFC) -
贺蒲脂必: 、 建立工程时,将 View 类继承自 CScrollView 2、 在 OnInitialUpdate 中添加初始化时 Scroll 的相关属性值 CSize sizeTotal(0,0); SetScrollSizes(MM_TEXT,sizeTotal); 3、 打开文件 ( 图像后 ) 根据图像的大小,设置滚动属性值 ...

枝江市18075123664: MFC中滚动条怎么使用???
贺蒲脂必: 当然可以了,你把滚动条控件“画”到什么地方,它就在什么地方了. 加上滚动条的初始化,和消息响应就可以了.

枝江市18075123664: 在MFC中:静态文本类;按纽类;编辑框类;滚动条类;列表框类;组合框类等所对应的类名以及其功能 -
贺蒲脂必: MFC是这些 1.静态文本类 - CStatic 显示文本 2.按钮类 - CButton 按钮,功能,嘿嘿 3.编辑框类 - CEdit 接收输入 4.滚动条类 - CScrollBar 滚动窗口 5.列表框类 - CListBox 同时显示多条信息 6.组合框类 - CComboBox 显示(编辑)一条信息,有多条可选 7.树控件 - CTreeCtrl 树,供增删改选 8.列表控件 - CListCtrl 列表分项显示,供增删改选 9.检查框、单选框 都是CButton ,可以通过GetCheck()来获取是否选择.....

枝江市18075123664: MFC编程中Dialognbsp;based下面的进度条如何操作
贺蒲脂必: 右键点击对话框空白部分,选ClassWizard,选第2个标签,双击进度条的ID,为进度条控件关联上变量,变量类型要选Control,以后就可以直接用这个变量来操作进度条了.这个变量就是CProgressCtrl类的,可以调用StepIt这些成员方法了.或者就在你原来的代码上加上强制转换((CProgressCtrlnbsp;*)GetDlgItem(IDC_PROGRESS))-amp;gt;StepIt();

枝江市18075123664: MFC如何弄滚动滑动条然后在静态文本框中显示文字? -
贺蒲脂必: 1、滚动条是自己创建窗口时要加的一个参数,用函数CreateWindow2、在static控件中显示文字用函数SetWindowText ,注意不要弄错句柄,这个函数好像不需要句柄,自己看M...

枝江市18075123664: MFC中WM - KEYUP和WM - KEYDOWN的用法 -
贺蒲脂必: 有几个东西你得明白一下:一,WM_KEYUP和WM_KEYDOWN是消息 二,在MFC中,消息是由类响应的,你在对话框中按键了,你可以对话框类中进行响应(也就是对一整型变量+1) 以下为在主框架类中进行WM_KEYUP响应.你用MFC建...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网