我做了一个类,从CStatic继承下来,目的是实现CScrollView的功能在CStatic画图没有什么问题,很正常。
但是在滚动条的处理上遇到了一些困难。
我使用了两种方法创建滚动条,都能够在CStatic上产生滚动条,但是滚动条无法控制,也不相应WM_VSCROLL、WM_HSCROLL、WM_MOUSEWHEEL消息,只能相应STN_CLICKED。
这样一来就郁闷了,不能控制滚动条也就无法实现视图的滚动。我是这样创建滚动CStatic的:
///////////////////////
//1 在Create时定义WS_HSCROLL
CStatic static; //.h文件中定义一个类成员static.Create("mmm",
WS_CHILD|WS_VISIBLE|SS_NOTIFY|WS_HSCROLL|WS_VSCROLL,
CRect(10,10,300,300), this,1234);///////////////////////
//2 手动创建滚动条SCROLLINFO info;
info.cbSize = sizeof(SCROLLINFO);
info.fMask = SIF_PAGE|SIF_RANGE;
info.nMin = 0;
info.nPage = 20;
info.nMax = 100;
if (!static.SetScrollInfo(SB_HORZ, &info, TRUE))
static.SetScrollRange(SB_HORZ, 0, 100, TRUE);
////////////////////////////
请大家帮忙看看
谢谢
但是在滚动条的处理上遇到了一些困难。
我使用了两种方法创建滚动条,都能够在CStatic上产生滚动条,但是滚动条无法控制,也不相应WM_VSCROLL、WM_HSCROLL、WM_MOUSEWHEEL消息,只能相应STN_CLICKED。
这样一来就郁闷了,不能控制滚动条也就无法实现视图的滚动。我是这样创建滚动CStatic的:
///////////////////////
//1 在Create时定义WS_HSCROLL
CStatic static; //.h文件中定义一个类成员static.Create("mmm",
WS_CHILD|WS_VISIBLE|SS_NOTIFY|WS_HSCROLL|WS_VSCROLL,
CRect(10,10,300,300), this,1234);///////////////////////
//2 手动创建滚动条SCROLLINFO info;
info.cbSize = sizeof(SCROLLINFO);
info.fMask = SIF_PAGE|SIF_RANGE;
info.nMin = 0;
info.nPage = 20;
info.nMax = 100;
if (!static.SetScrollInfo(SB_HORZ, &info, TRUE))
static.SetScrollRange(SB_HORZ, 0, 100, TRUE);
////////////////////////////
请大家帮忙看看
谢谢
当然要处理滚动条消息了,可是问题就是收不到HSCROLL消息。cpio:
你说的方法我也试过了,从CWnd继承之后,在控件Create的时候,Create函数第一个参数是Window的类型。 CWnd* pWnd = new CWnd;
pWnd->Create(_T("STATIC"), "Hi", WS_CHILD | WS_VISIBLE,
CRect(0, 0, 20, 20), this, 1234);_T("STATIC"),不用它用什么好呢?
As I have said: Static control is a dumb control for displaying text or image that once assigned does not change. That is why is called static. It is not as functional as other controls.
You would have to write a code to redesign static control and I do not think it is desirable and moreover justifiable.If you have a code already written in your CStatic derived class you can easily port it.But if you insist, do this:
Remove WS_HSCROLL and WS_VSCROLL and let static control create own scroll bars.
In PreSubclassWindow override in derived class for example:
Code:
CStatic::PreSubclassWindow(); UINT uiHHeight = GetSystemMetrics(SM_CYHSCROLL);
UINT uiVWidth = GetSystemMetrics(SM_CXVSCROLL);
CRect rectClient, rectH, rectV;
GetClientRect(rectClient);
rectH = rectClient;
rectH.top = rectH.bottom - uiHHeight;
rectH.right -= uiVWidth; rectV = rectClient;
rectV.left = rectV.right - uiVWidth;
rectV.bottom -= uiHHeight; m_HScroll.Create(SBS_HORZ | SBS_BOTTOMALIGN | WS_CHILD | WS_VISIBLE, rectH, this, 1100);
m_VScroll.Create(SBS_VERT | SBS_RIGHTALIGN | WS_CHILD | WS_VISIBLE, rectV, this, 1101); SCROLLINFO sci;
memset(&sci, 0, sizeof(sci)); sci.cbSize = sizeof(SCROLLINFO);
sci.fMask = SIF_ALL;
sci.nMax = 1000;
sci.nPage = 200; m_HScroll.SetScrollInfo(&sci, TRUE);
m_VScroll.SetScrollInfo(&sci, TRUE);
我试了一下,CWnd是可以的,用NULL指定Window类型就行了
岁月催人老哦~~~ ^_^
你说的方法原理上十分诱人,运行时出现非法 呵呵AgedBOY:
谢谢你的指教,很中肯。但我觉得奇怪,CStatic本来就是从Cwnd继承的,为什么不能实现滚动呢
因为其WM_NCHITTEST处理函数默认返回HTTRANSPARENT
作了7、8年,再搞纯技术,没钱途啊,俺现在作公司,VC都是以前的老本了。楼主在创建Static时指定了SS_NOTIFY风格,WM_NCHITTEST处理函数返回的是HTCLIENT。
本来想多快好省的创建一个带滚动条的Static控件,结果反而绕了路。
如果是Create生成的需要在Create函数里面生成滚动条
我们单位用VC十几年的一大把,领导都是不会VC的,呵呵
-------------------------------------------------------------- 看来需要转行了,用VC怎么也不可能到"领导"位子了
class COutPutEdit : public CEdit
{
// Construction
public:
COutPutEdit();// Attributes
public:// Operations
public:// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(COutPutEdit)
//}}AFX_VIRTUAL// Implementation
public:
void AddString(const char * str);
virtual ~COutPutEdit(); // Generated message map functions
protected:
//{{AFX_MSG(COutPutEdit)
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnOutputClear();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG DECLARE_MESSAGE_MAP()
};.cpp文件,在OnCreate函数中加上this->ShowScrollBar(SB_BOTH,TRUE);就行了
int COutPutEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CEdit::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
this->ShowScrollBar(SB_BOTH,TRUE);
return 0;
}
自带滚动条的处理方法我觉得不可行,即使指定了SS_NOTIFY也没用,SS_NOTIFY只能向父窗口发送鼠标消息而已。
直接从CWnd继承,省得烦啦这几年代码写的很少,以前写程序一直用Visual Assis X,结果现在想用什么函数连个名字都记不起来。孔子说,日知其所无,月无忘其所能。统统没能做到哦。
懒得写了。准备上网搜搜,看看有没有现成的代码如果谁知道有现成的代码可以用的,麻烦到
http://community.csdn.net/Expert/topic/4740/4740663.xml?temp=.5188562
告诉我一声这个帖子只有200分,分数太少了怕对不起大家,所以准备结帖,另开一个200的帖子。这里就不要留言了。谢谢大家