MFC滚动条

今天折腾了一天就学了个滚动条,没有想到挺麻烦的........虽然老师说以后用控件,现在做真够费劲的!

为窗口添加滚动条

为窗口添加滚动条非常的简单,只需在创建窗口时指定窗口的样式中加上WS_VSCROLL或WS_HSCROLL或是两者皆有即可。

设置选项

通过SetScrollInfo函数来设置滚动条

使滚动条大小适应窗口变化变化

在WM_ONSIZE消息处理中动态改变滚动条大小

滚动

在ON_VSCROLL消息处理函数中使滚动条进行滚动,并激活窗口重绘

贴个自己写的程序,以后忘了再回来看看...

编写程序,在窗口中显示部分的鼠标与键盘消息列表,一行显示一个消息...

messageshow.h 文件

class CMessageShowApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};

class CMessageShowWindow:public CFrameWnd
{
public:
CMessageShowWindow();
protected:
afx_msg void OnPaint();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnChar(UINT nChar,UINT nRepCnt,UINT nFlags);
afx_msg void OnSize(UINT nType,int cx,int cy);
afx_msg void OnVScroll(UINT nSBCode,UINT nPosl,CScrollBar *pScorllBar);
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg void OnLButtonUp(UINT nFlags,CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlg,CPoint point);
afx_msg BOOL OnMouseWheel(UINT nFlags,short zDelta,CPoint pt);
DECLARE_MESSAGE_MAP()
};

messaeshow.cpp 文件

#include<afxwin.h>
#include"messageshow.h"
#include<afxcoll.h>

CMessageShowApp theApp;

SCROLLINFO si;
UINT g_nLines;
UINT g_nLineHeight;
CStringList g_csList;

BOOL CMessageShowApp::InitInstance()
{
m_pMainWnd = new CMessageShowWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();

return TRUE;
}

CMessageShowWindow::CMessageShowWindow()
{
Create(NULL,_T("Message show"),WS_OVERLAPPEDWINDOW|WS_VSCROLL);

}

BEGIN_MESSAGE_MAP(CMessageShowWindow,CFrameWnd)
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_CHAR()
ON_WM_SIZE()
ON_WM_VSCROLL()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDBLCLK()
ON_WM_MOUSEWHEEL()
END_MESSAGE_MAP()

int CMessageShowWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{

TEXTMETRIC tm;
GetTextMetrics(GetDC()->m_hDC,&tm); // 获得文本信息
g_nLineHeight = tm.tmHeight + tm.tmExternalLeading; // 文本高度

GetScrollInfo(SB_VERT,&si);
si.cbSize = sizeof(SCROLLINFO);
si.nMin = 1;
si.nMax = 100;
si.nPage = -1; //我把它赋值为 -1 ,开始没有那么多内容不显示 滚动条

SetScrollInfo(SB_VERT,&si);

return 0;
}

void CMessageShowWindow::OnPaint()
{
CPaintDC dc(this);

// 链表不能随机取数 ,只好用个迭代器
POSITION pos = g_csList.GetHeadPosition();
int count = g_csList.GetCount();
if(count<=g_nLines)
{
for(int i = 0;i<count;i++)
{
dc.DrawText(g_csList.GetNext(pos),-1,
&CRect(30,i*g_nLineHeight,500,(i+1)*g_nLineHeight),DT_LEFT|DT_VCENTER);
}
} else {
int npos = si.nPos;
while(npos>1) { g_csList.GetNext(pos);npos--;} //npos 必须大于 1
for(int i = 0;i<si.nPage;i++)
{
dc.DrawText(g_csList.GetNext(pos),-1,
&CRect(30,i*g_nLineHeight,500,(i+1)*g_nLineHeight),DT_LEFT|DT_VCENTER);
}
}

}
void CMessageShowWindow::OnChar(UINT nChar,UINT nRepCnt,UINT nFlags)
{
CString str;
str.Format(" WM_CHAR %c : %u",TCHAR(nChar),nChar);
g_csList.AddTail(str);

if(g_csList.GetCount()>g_nLines)
{
// 把滚动条的位置同时向下移动 一个 单位
si.nPos = g_csList.GetCount() - g_nLines+1;
si.nPage = g_nLines;
si.nMax = g_csList.GetCount();
SetScrollInfo(SB_VERT,&si);
}
Invalidate();

}

void CMessageShowWindow::OnSize(UINT nType,int cx,int cy)
{
CRect rect;
GetClientRect(&rect);

//客户区所能显示的文本行数
g_nLines = rect.Height()/g_nLineHeight;

// 如果 g_csList 消息行数 > 客户区能够显示的 消息行数 ,那么 nPage 设置行数,同时设置 nMax 为 消息总数
si.nPage = g_csList.GetCount()>g_nLines?g_nLines:-1;
si.nMax = g_csList.GetCount()>g_nLines?g_csList.GetCount():100;

// 在客户区 纵向 变大的时候 ,有可能 在 nPos 后面 的消息 总数 少于 刚刚设置的
// nPage ,这是个错误,检查并纠正................
if(si.nPage>g_csList.GetCount() - si.nPos)
si.nPos = si.nPage - (g_csList.GetCount() - si.nPos);
SetScrollInfo(SB_VERT,&si);
}

void CMessageShowWindow::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar *pScrollBar)
{

switch(nSBCode)
{
case SB_LINEDOWN:
si.nPos++;
break;
case SB_LINEUP:
si.nPos--;
break;
case SB_PAGEDOWN:
si.nPos += si.nPage;
break;
case SB_PAGEUP:
si.nPos += si.nPage;
break;
case SB_THUMBTRACK:
si.nPos = nPos;
break;
case SB_THUMBPOSITION:
si.nPos = nPos;
break;
}

SetScrollInfo(SB_VERT,&si);
Invalidate();
}

void CMessageShowWindow::OnLButtonDown(UINT nFalgs,CPoint point)
{
CString str;
str.Format(" WM_LBUTTONDOWN %ld : %ld",point.x,point.y);
g_csList.AddTail(str);

if(g_csList.GetCount()>g_nLines)
{
si.nPos = g_csList.GetCount() - g_nLines+1;
si.nPage = g_nLines;
si.nMax = g_csList.GetCount();
SetScrollInfo(SB_VERT,&si);
}
Invalidate();
}

void CMessageShowWindow::OnLButtonUp(UINT nFlags,CPoint point)
{
CString str;
str.Format(" WM_LBUTTONUP %ld : %ld",point.x,point.y);
g_csList.AddTail(str);

if(g_csList.GetCount()>g_nLines)
{
si.nPos = g_csList.GetCount() - g_nLines+1;
si.nPage = g_nLines;
si.nMax = g_csList.GetCount();
SetScrollInfo(SB_VERT,&si);
}
Invalidate();
}

void CMessageShowWindow::OnLButtonDblClk(UINT nFlag,CPoint point)
{
CString str;
str.Format(" WM_LBUTTONDBLCLK %ld : %ld",point.x,point.y);
g_csList.AddTail(str);

if(g_csList.GetCount()>g_nLines)
{
si.nPos = g_csList.GetCount() - g_nLines+1;
si.nPage = g_nLines;
si.nMax = g_csList.GetCount();
SetScrollInfo(SB_VERT,&si);
}
Invalidate();
}

BOOL CMessageShowWindow::OnMouseWheel(UINT nFlags,short zDelta,CPoint pt)
{
CString str;
str.Format(" WM_MOUSEWHEEL %ld : %ld %d",pt.x,pt.y,zDelta);
g_csList.AddTail(str);

if(g_csList.GetCount()>g_nLines)
{
si.nPos = g_csList.GetCount() - g_nLines+1;
si.nPage = g_nLines;
si.nMax = g_csList.GetCount();
SetScrollInfo(SB_VERT,&si);
}
Invalidate();
return TRUE;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC中,可以利用滚动条来实现对图片的浏览和滚动功能。 首先,我们需要在MFC应用程序中添加一个滚动条控件。可以在资源视图中的对话框资源上添加一个滚动条控件,然后在代码中声明和绑定该控件。 接下来,我们需要加载要显示的图片。可以使用CImage类来加载图片文件,或者使用其他类似的方法来获取需要显示的图片数据。 在将图片显示到MFC窗口的过程中,我们可以利用滚动条的滚动事件来实现图片的滚动功能。滚动条的范围可以根据图片的大小来确定,用户通过拖动滑块来改变滚动条的位置,从而实现图片的滚动。 在滚动条的滚动事件响应函数中,可以根据滚动条的当前位置来确定需要显示的图片的位置。可以使用CImage的Draw函数将需要显示的部分绘制到MFC窗口中。 需要注意的是,对于较大的图片,为了避免性能问题,可以在滚动过程中只绘制可见部分的图片,当滚动条的位置发生改变时再进行绘制,这样可以减少不必要的绘制操作,提高程序的效率。 另外,还可以根据需要添加其他功能,例如放大缩小图片、旋转图片等,以增加用户的交互体验。 总而言之,使用MFC滚动条来实现图片滚动功能可以让用户方便地浏览较大尺寸的图片,提升用户体验。以上是一个简单的实现思路,具体实现需要根据具体的需求和MFC版本进行调整
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值