<!-- [if !mso]>
<style>
v/:* {behavior:url(#default#VML);}
o/:* {behavior:url(#default#VML);}
w/:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><!-- [if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!-- [if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]--><!-- [if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
// HitTestEx
- Determine the row index and column index for a point
// Returns
- the row index or -1 if point is not over a row
// point
- point to be tested.
// col
- to hold the column index
//
考虑到滚动条的情况
int
CMyListCtrl::HitTestEx(CPoint &point, int
*col) const
{
int
colnum = 0;
int
row = HitTest( point, NULL );
if
( col ) *col = 0;
// Make sure that the ListView is in LVS_REPORT
if
( (GetWindowLong(m_hWnd, GWL_STYLE) & LVS_TYPEMASK) != LVS_REPORT )
return
row;
// Get the top and bottom row visible
row = GetTopIndex();
int
bottom = row + GetCountPerPage();
if
( bottom > GetItemCount() )
//
么有滚动条
bottom = GetItemCount();
// Get the number of columns
CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
int
nColumnCount = pHeader->GetItemCount();
// Loop through the visible rows
for
( ;row <= bottom;row++)
{
// Get bounding rect of item and check whether point falls in it.
CRect rect;
GetItemRect( row, &rect, LVIR_BOUNDS );
if
( rect.PtInRect(point) )
{
// Now find the column
for
( colnum = 0; colnum < nColumnCount; colnum++ )
{
int
colwidth = GetColumnWidth(colnum);
if
( point.x >= rect.left
&& point.x <= (rect.left + colwidth ) )
{
if
( col ) *col = colnum;
return
row;
}
rect.left += colwidth;
}
}
}
return
-1;
}
CListCtrl
类成员
CListCtrl::HitTest
int HitTest(LVHITTESTINFO* pHitTestInfo) const
int HitTest(CPoint pt,UINT* pFlags=NULL) const
返回值:
返回参数pHitTestInfo
指定位置的项的索引,否则为-1
。
参数: pHitTestInfo
含有要进行击中测试的位置以及接受击中测试有关结果信息的LVHITTESTINFO
结构的地址。
pt
被测试的指针。
pFlags
指向接受测试结果信息的整数的指针。请参阅联机文档“
平台SDK”
中有关LVHITTESTINFO
结构的flags
成员的注解。
说明:
如果有,则决定哪一个列表视图项在指定的位置上。
可以通过使用结构中flags
成员的LVHT_ABOVE,
LVHT_BELOW,LVHT_TOLEFT
以及LVHT_TORIGHT
的值来决定是否滚动列表视图控件的内容。上述两种标志可以自由组合,例如,假设其位于客户区域的左上角。
可以通过测试结构中flags
成员的LVHT_ONITEM
值来决定是否给定的位置位于列表视图项的上方。该数值通过结构flags
成员中的 LVHT_ONITEMICON
,LVHT_ONITEMLABEL,LVHT_ONITEMSTATEICON
的值的位或运算而获取。
如何使CListCtrl
完全可编辑
专题1:
如何使CListCtrl
完全可编辑?
1.
背景 :
我们知道如果CListCtrl
是报表样式,
那么CListCtrl
所提供的编辑功能只局限于第一列.
也就是说只有第一列可编辑.
这样显然无法满足一般数据库的要求.
我们想要每个子项都能编辑.
2.
思路 :
CEdit
是一个很好的可控制编辑控件.
如何把CEdit
和我们的CListCtrl
联系起来?
一种很好的想法是------
一般我们如果想编辑某一项,
那么就应该去双击.
双击以后就让CEdit
在那里显示,
当然要把大小调整和子项表格一样.
如果CEdit
失去了焦点,
表示修改完毕,
那么立即更改子项的数据,
同时让CEdit
隐藏.
因为每次只能编辑一项,
所以只需要一个CEdit
就够了.
3.
方法:
(1)
首先从CListCtrl
派生一个类,
其他已经有的变量或者函数设置我已经介绍,
如果不清楚的读者,
可以去参考”
基础篇”.
(2)
有一点可以肯定,
我们必须响应双击事件:
void
Cmylist::OnLButtonDblClk(UINT nFlags, CPoint point)
{
int
index;
//
行号
int
colnum;
//
列号
GetWindowRect(r);
//
稍后说明
GetParent()->ScreenToClient(r);
//
稍后说明
if((index=HitTestEx(point,&colnum))!=-1)
EditSubItem(index,colnum);
CListCtrl::OnLButtonDblClk(nFlags,
point);
}
其中HitTestEx
是用来求出双击点所在的行列号,
如果行号不为-1,
那么就调用函数EditSubItem.
这个函数会根据行列号求出该子项具体坐标,
方便CEdit
调整位置.
(3)
如何求出行列号?
行号是很好求出来的 ,
但是列号就不是很简单了,
必须详细判断.
int Cmylist::HitTestEx(CPoint &point, int *pcolumn)
{
int
columnNum=0;
//
获取页面内首行索引号,
不一定是0,
要考虑滚动条的情况
int row=GetTopIndex();
// GetCountPerPage()
获取在页面内行的总数
int
bottom=row+this->GetCountPerPage();
//
防止超出范围
if(bottom>this->GetItemCount())
bottom=GetItemCount();
//
获取列的总数
int
ncolumncount=this->GetHeaderCtrl()->GetItemCount();
//
可以肯定双击点肯定在页面内,
因此从页面首行索引号开始判断
for(;row<=bottom;++row)
{
CRect
rect;
//
求出行的rect
GetItemRect(row,&rect,LVIR_BOUNDS);
//
点是否在行的矩形内
if(rect.PtInRect(point))
//
如果点在行的矩形内,
求出点在哪一列
for(columnNum=0;columnNum<ncolumncount;columnNum++)
{
//
求出列的宽度
int
colwidth=this->GetColumnWidth(columnNum);
if(point.x>=rect.left&&point.x<=(rect.left+colwidth))
{
*pcolumn=columnNum;
return
row;
}
rect.left+=colwidth;
}
}
return
-1;
}
当然上面那种方法有点复杂,
是完全从头开始判断.
其实我们可以先利用CListCtrl
提供的函数求出行号,
再求列号,
这样稍微简单点
int
Cmylist::HitTestEx(CPoint &point, int *pcolumn)
{
int
columnNum=0;
int row=HitTest(point);//
求出行号
int ncolumncount=this->GetHeaderCtrl()->GetItemCount();
LVHITTESTINFO Info;
Info.pt=point;
this->SubItemHitTest(&Info);
*pcolumn=Info.iSubItem;
if(*pcolumn>=0&&*pcolumn<ncolumncount)
return row;
else
return -1;
/* int ncolumncount=this->GetHeaderCtrl()->GetItemCount();
CRect
rect;
GetItemRect(row,&rect,LVIR_BOUNDS);
if(rect.PtInRect(point))
for(columnNum=0;columnNum<ncolumncount;columnNum++)
{
int
colwidth=this->GetColumnWidth(columnNum);
if(point.x>=rect.left&&point.x<=(rect.left+colwidth))
{
*pcolumn=columnNum;
return
row;
}
rect.left+=colwidth;
}*/
}
(4)
求出具体CEdit
移动坐标
int
Cmylist::Item_X(int row, int column,CRect& rect_X)
{
int
offset=0;
for(int
i=0;i<column;i++)
offset+=GetColumnWidth(i);
CRect
rect;
GetItemRect(row,rect,LVIR_BOUNDS);
//
注意水平滚动条的影响,
如果已经移动了水平滚动条,
可能left
为0,
或者超出总大小
if(offset+rect.left<0||offset+rect.left>client_rect.right)
{
CSize
size;
//offset
肯定为正,
如果出现了rect.left
为负
if(offset+rect.left>0)
size.cx=-
(offset+rect.left);
else
size.cx=offset+rect.left;
size.cy=0;
//
垂直不用管
//
如果某一列的一半在滚动条左边,
一半在右边,
就再次调整滚动条的位置.
Scroll(size);
rect.left
- =size.cx;
}
rect.left+=offset+2;
rect.right=rect.left+GetColumnWidth(column)-2;
//bottom
和top
不用管
rect_X=rect;
return
rect.right;
}
(5)
移动CEdit
void Cmylist::EditSubItem(int Item, int
Column)
{
CRect
rect;
//
求出行列所在rect
this->Item_X(Item,Column,rect);
EditCellShow(rect,Item,Column,r);
}
void Cmylist::EditCellShow(CRect rect, int
Item, int Column,CRect r)
{
//
还记得r
吗?
在开始的双击函数OnLButtonDblClk
中,
它是CListCtrl
在父窗口中的位置
rect.left+=r.left;
rect.top+=r.top+2;
rect.right+=r.left;
rect.bottom+=r.top+2;
//pedit
是CEdit
对象的指针,
提供接口,
只要在程序中让pedit
指向一个对象即可
pedit->MoveWindow(rect,TRUE);
pedit->ShowWindow(TRUE);
pedit->SetFocus();
}
^_^!
这样就完成了.
效果还可以.
当然你还要去响应CEdit
失去焦点和得到焦点的事件.
这个就不是我的任务了,
因为每个人的要求不一样啊!
看看我的效果!
分享到:
相关推荐
预约win10等级加速活动 QQ额外获得0.2天等级加速.docx
使用已知的B0→D′0π+π-的分支分数,B(B0→D′0K + K-)=(6.1±0.4±0.3±0.3)×10-5和B(Bs0→D′ 得到0K + K-)=(5.7±0.5±0.4±0.5)×10-5,其中第三不确定性来自衰减模式B0→D′0π+π-和B0→D0K +的...
两只调压器串联获得0~284V电压、电子技术,开发板制作交流
三只调压器星形接线获得0~433V电压、电子技术,开发板制作交流
得到0至n-1不重复的随机次序的整数,常在初始化时用到 是把0到n-1这些数随机打乱得到的一个数字序列 类似matlab中的randperm函数,只是matlab是从1到n python 随机矩阵,随机整数矩阵 见:...
我获得0f 的CRC校验值为 09 a9所以要发送的数据为 0f 09 a9 00 00 00 00 00 DES解密之后的数据为 cb 64 3f d0 30 e6 87 da >54 CB 64 3F D0 30 E6 87 DA 成功,说明我的DES和CRC16的算法没有问题
如何在Titanic Kaggle挑战中获得0.8134分:泰坦尼克号Kaggle竞赛的解决方案
用 M8 去控制它可得到一个电压从 0 一 20V,最大 电流 1.5A的稳压电源。 基本原理,用M8的PWM作数模转换,经过两级RC滤波后得到0一5V的控制电压,PWM 是用 M8 的定时器 1 来实现的,有 10 位的分辨能力,控制电压从 0 一...
益智游戏 - 猜数字 Ver1.2 Build302 ==================================================== ...直到你猜到0123时,才会得到4A0B的提示,而这时你就猜到了全部四个数字以及它们的顺序,也就胜利了! 祝你好运!
表达式为 1 时得到 0,为 0 时得到 1。A = [0 9 6; 1 3 0];B = [1 4 3; 1 5 0];12使用逻辑运算符对两个数组进行运算A & B1运行过程:在使用&运算符对两个数组进行运算时,要注意 &运算符的使用,& 两边的表达式的...
而后通过使用“rand()”或“rand()0”来获得一个0到9的一位整数随机值或得到0到99的两位整数随机值来为用户出题。还可进一步对用户所做算术题的对错次数进行记录,结束程序时给出一个某种形式的成绩。
为了研究不同类型元件组成系统后元件各自的维修率,同时考虑工作环境因素对维修率的...对一个混联系统进行分析,说明了p0范围依赖于系统结构并计算得到0.087≤p0≤0625,也得到了系统中三个不同元件的维修率分布。
0, NULL); 计算机上的USB主控制器以HCD1,HCD2等命名。通过控制器名称,使用CCreateFile 打开它。使用DeviceIoControl即可得到其驱动程序名,以及与它连接的HUB的名称。用CCreateFile打开HUB,获得连接信息。再...
如何得到其它进程的启动命令行参数.vc这个程序可以得到其他进程的命令行参数_NtQueryInformationProcess第二个参数为0
base64编码是将原来24位扩展成32位,得到0-64之间的索引值,按特定码表重新编码后来实现。所有长度会增加1/3。优点:编码解码简单,速度快,体积小。缺点:不安全。优点就不说了,说一说为什么会不安全。不安全体现在两个...
信号源产生 0、 1 等概分布的随机信号,映射到 16QAM 的星座图上,同时一路信号已经被分成了 I 路和 Q 路,后边的处理建立在这...最后经过 采样,判决,得到 0、1 信号,同原信号进行比较,给出 16QAM 数字系统的误码。
esp8266获取网络时间,时间类型String,时间格式可调,连接阿里NTP授时服务器,连接更稳定,基本不掉线
针对现有方法中第二跳中继转发信息容易被窃听的问题, 提出一种基于协作波束成型的中继分组协作物理层安全方案。... 相同功率下该方法能获得0. 6 bps/Hz的性能提升。因此该方案能够有效提升协作中继系统的安全性。
获得网站WEBSHELL权限的截图0.pdf