`
hcmfys
  • 浏览: 356315 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

得到0

 
阅读更多

<!-- [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_ONITEMICONLVHT_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);

// 注意水平滚动条的影响, 如果已经移动了水平滚动条, 可能left0, 或者超出总大小

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

    另外,如果用户预约升级Win10,即使不下载电脑管家,也能额外获得0.2天的等级加速。 其次,活动时间是在2021年3月18日至8月31日之间。在这段时间内,每天使用QQ账号登录Windows 10升级助手并保持30分钟的在线时间,...

    QQ等级计算规则(最新版).docx

    1. **与Q+同时在线**:如果用户一天中与Q+同时在线满5小时,可以额外获得0.2天的活跃天数。 2. **非隐身在线**:用户当天非隐身状态累计在线满2小时,也能额外得到0.2天的活跃天数。 这些活跃行为鼓励用户更多地...

    Bs0→D′0K + K-衰变的观测

    使用已知的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的乘法PPT课件.ppt

    而"两个因数的末尾有几个零,积的末尾至少有几个零"是正确的,因为至少会和0相乘得到0。 通过这样的学习,学生不仅能掌握因数中间或末尾有0的乘法计算,还能理解简便写法,以及如何根据因数末尾0的数量推断积末尾0...

    0~24V可调直流稳压电源电路的设计方法

    该电路采用可控硅作为第一级调压元件,用稳压电源芯片 LM317、LM337 作为第二级调压元件,通过 AT89CS51 单片机控制继电器改变电阻网络的阻值,从而改变调压元件的外围参数,并加上软启动电路,获得 0~24 V,0.1 V ...

    python把0到n-1这些数随机打乱得到的一个数字序列

    得到0至n-1不重复的随机次序的整数,常在初始化时用到 是把0到n-1这些数随机打乱得到的一个数字序列 类似matlab中的randperm函数,只是matlab是从1到n python 随机矩阵,随机整数矩阵 见:...

    Desfire d40芯片手册

    我获得0f 的CRC校验值为 09 a9所以要发送的数据为 0f 09 a9 00 00 00 00 00 DES解密之后的数据为 cb 64 3f d0 30 e6 87 da &gt;54 CB 64 3F D0 30 E6 87 DA 成功,说明我的DES和CRC16的算法没有问题

    0-20V简易数控电源.rar

    用 M8 去控制它可得到一个电压从 0 一 20V,最大 电流 1.5A的稳压电源。 基本原理,用M8的PWM作数模转换,经过两级RC滤波后得到0一5V的控制电压,PWM 是用 M8 的定时器 1 来实现的,有 10 位的分辨能力,控制电压从 0 一...

    益智游戏——猜数字 Ver1.2

    益智游戏 - 猜数字 Ver1.2 Build302 ==================================================== ...直到你猜到0123时,才会得到4A0B的提示,而这时你就猜到了全部四个数字以及它们的顺序,也就胜利了! 祝你好运!

    优秀资料(2021-2022年收藏)小学二年级数学加减混合500道.doc

    8. 19 - 18 - 1:连续减法,得到1,再减1得到0。 9. 73 + 15 - 26:先加15得到88,再减去26得到62。 10. 25 - 18 - 4:连续减法,先减去18得到7,再减去4得到3。 11. 87 - 48 - 14:先减去48得到39,再减去14得到25...

    七年级数学上册1.2.4绝对值-化简绝对值填空题专项练习二(人教版,含解析).pdf

    1. 第一题中,通过数轴判断a+b&lt;0, a+b+c&lt;0, c-a&gt;0,从而化简表达式得到2a-c。 2. 第二题中,根据数轴判断出a, b, a-c的正负,从而化简绝对值得到-a+b-c。 3. 第三题中,由于b, a&gt;2,因此可以去掉绝对值符号进行化简...

    小数乘法除法练习题参照.pdf

    同样地,0.34乘以0.126需要将0.34和0.126相乘,得到0.04284,然后小数点向左移动三位,得到0.004284。 2. **乘数中间有“0”的乘法**:当乘数中有0时,可以先忽略0,进行乘法运算,然后根据0的个数确定小数点的位置...

    计算机进制转换月考试题.pdf

    56除以2得到28余0,28除以2得到14余0,14除以2得到7余0,7除以2得到3余1,3除以2得到1余1,1除以2得到0余1。二进制表示为111000,所以正确答案是A) 111000。 4. 至19. 与前面类似,通过短除法可以得到以下转换结果...

    matlab数组运算相关知识及代码(可运行)

    表达式为 1 时得到 0,为 0 时得到 1。A = [0 9 6; 1 3 0];B = [1 4 3; 1 5 0];12使用逻辑运算符对两个数组进行运算A & B1运行过程:在使用&运算符对两个数组进行运算时,要注意 &运算符的使用,& 两边的表达式的...

    无限循环小数如何化为分数.doc

    乘以10得到3.33...,两者相减得到0,即: 0.33... × 10 - 0.33... = 3.33... - 0.33... 这可以表示为(10-1) × 0.33... = 3,从而得出0.33... = 3/9 = 1/3。对于更复杂的纯循环小数,如0.4747...,我们可以使用...

    十进制数转换为其他进制数.docx

    对于二进制转换,用2去除4009,依次得到余数1、0、1、0、1、1、1、1、1、0、1,因此4009 = (111110101001)2。 对于小数部分的转换,例如将0.891转换为十六进制,同样运用长除法,但需处理小数部分。通过不断乘以16...

    计算机中的信息表示PPT学习教案.pptx

    例如,将0.375转换为二进制,我们乘以2得到0.75,取整为0,然后0.75乘以2得到1.5,取整为1,再乘以2得到1,取整为1,最后乘以2得到0,不再有整数部分。所以,(0.375)10 = (0.011)2。 将整数和小数部分的二进制数...

    在草稿上进行两位数乘一位数的乘法PPT学习教案.pptx

    36乘以0得到0,而36乘以10得到360,将这两部分相加得到最终的1080。这种方法同样适用于其他有0的乘法,如28×40和86×30。 在做练习时,学生应该先在草稿纸上进行计算,然后再对照答案进行核对。这样不仅可以锻炼...

    无限循环小数如何化为分数.概要.pdf

    对于0.325656...,通过乘以100和10000再相减,得到0.325656...=3224/9900。 方法二:方程法 1. 假设无限循环小数为X,并将其拆分为已知的有限部分和无限循环部分,然后建立一元一次方程求解。例如,设X=0.232323......

Global site tag (gtag.js) - Google Analytics