几个关于控件的问题

时间:2021-04-27 19:07:33
1、CListCtrl控件
    当给这个控件加了 网格 属性时,如果有水平滚动条且滚动滚动条时,有时网格线显示不全,即某条竖线显示不出来,而有时又不会出现这种情况?不知各位有没有遇到过这样的问题?如果每次在滚动滚动条时都重画ITEMS ,则会闪烁得较利害!
2、edit控件
   我派生了一个EDIT控件,将其用在CListCtrl控件中(EDIT的父窗口设为CListCtrl),即当用户点击CListCtrl控件的某行某列时,就动态创建它,用于输入,但出现如下问题:
  A:edit控件没有光标(本edit控件第一次建立时有光标,只要一失去焦点,以后就算以后再获得焦点也没有光标了)
  B:当滚动条滚动时拥有输入焦点的edit控件也跟着滚动,为了保持其显示位置和实际位置相同,需要重新计算edit控件的位置,并通过MoveWindow(rtNewEditRect,TRUE)设置,当滚动条收到SB_PAGELEFT  SB_PAGERIGHT时edit控件显示正常,但如果收到SB_LINELEFT等其它消息时显示就出现问题,就好象控件向左或向右移动一样,但其实际位置没有移动,连插入符的位置都没变,后来我就在
MoveWindow(rtNewEditRect,TRUE)后面紧跟着一句RedrawWindow()才解决,并且如果改为:RedrawWindow(rteditRect)都不行,其中rteditRect为edit控件的矩形
 C:为什么动态创建的EDIT控件显示不出三维的凹凸外观(我已经加了WS_BORDER属性了)

如果哪位大哥大姐明白,请一定要帮帮忙,我已经闷了几天了!先行道谢了!

11 个解决方案

#1


都不会,帮不了你,呵呵

#2


问题1、CListCtrl控件 重载OnVScroll函数
void CxxxListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
if((nSBCode == SB_PAGEDOWN)  || (nSBCode == SB_PAGEUP)
|| (nSBCode == SB_LINEDOWN) || (nSBCode == SB_LINEUP))
{
LockWindowUpdate();
CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
UnlockWindowUpdate();
return;
}
CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
}

#3


问题2、edit控件
m_pWndEdit->Create(ES_AUTOHSCROLL | ES_NOHIDESEL | WS_CHILD | WS_BORDER | FMT, CRect(0, 0, 1, 1), this, 0)
使用上面的参数试试

#4


1,ReDraw();先禁止刷新,插入后,再刷新

#5


3,用第三方库

#6


to  koko1998(追印) 
问题1,用你说的方法试了几次,没出现我说的现象,但闪烁得太厉害!和用RedrawItems()差水多,
问题2,问题也解决了,以前我是控件动态建立后,不用时就用ShowWindow(SW_HIDE)禁显示,用时再用
ShowWindow(SW_SHOW)显示,结果不行,现在不用时就删除它,结果就行了!

问题已经基本解决,只是只知这样做可以却不知为什么,希望大家能讨论一下!

#7


问题1, 你说你刷新得很厉害,是不是你使用了刷新函数或类似的函数啊,如Invalidate等等
我以前也做过得好像也没有所说得特别闪烁的现象。
可以的话,给我看看代码:tiger_mhu@hotmail.com

#8


to  koko1998(追印):
     代码已发给你,麻烦你了!

#9


看到了
你那个算是正常刷新。
至于...的问题,以前看过,忘记了。
问问高手吧!

#10


忘记说了,你最好加一个edit失去焦点的事件,这样可能更好些。特别是滚动条滚动的时候。

#11


忘记说了,你最好加一个edit失去焦点的事件,这样可能更好些。特别是滚动条滚动的时候。


to koko1998(追印) :
     已经加了。你给我的例子已经收到,谢谢了!

#1


都不会,帮不了你,呵呵

#2


问题1、CListCtrl控件 重载OnVScroll函数
void CxxxListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
if((nSBCode == SB_PAGEDOWN)  || (nSBCode == SB_PAGEUP)
|| (nSBCode == SB_LINEDOWN) || (nSBCode == SB_LINEUP))
{
LockWindowUpdate();
CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
UnlockWindowUpdate();
return;
}
CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
}

#3


问题2、edit控件
m_pWndEdit->Create(ES_AUTOHSCROLL | ES_NOHIDESEL | WS_CHILD | WS_BORDER | FMT, CRect(0, 0, 1, 1), this, 0)
使用上面的参数试试

#4


1,ReDraw();先禁止刷新,插入后,再刷新

#5


3,用第三方库

#6


to  koko1998(追印) 
问题1,用你说的方法试了几次,没出现我说的现象,但闪烁得太厉害!和用RedrawItems()差水多,
问题2,问题也解决了,以前我是控件动态建立后,不用时就用ShowWindow(SW_HIDE)禁显示,用时再用
ShowWindow(SW_SHOW)显示,结果不行,现在不用时就删除它,结果就行了!

问题已经基本解决,只是只知这样做可以却不知为什么,希望大家能讨论一下!

#7


问题1, 你说你刷新得很厉害,是不是你使用了刷新函数或类似的函数啊,如Invalidate等等
我以前也做过得好像也没有所说得特别闪烁的现象。
可以的话,给我看看代码:tiger_mhu@hotmail.com

#8


to  koko1998(追印):
     代码已发给你,麻烦你了!

#9


看到了
你那个算是正常刷新。
至于...的问题,以前看过,忘记了。
问问高手吧!

#10


忘记说了,你最好加一个edit失去焦点的事件,这样可能更好些。特别是滚动条滚动的时候。

#11


忘记说了,你最好加一个edit失去焦点的事件,这样可能更好些。特别是滚动条滚动的时候。


to koko1998(追印) :
     已经加了。你给我的例子已经收到,谢谢了!