如下所示,OnColumnclickListSubvib响应LVN_COLUMNCLICK
现在的问题是,每次点击列表头排序时,进入程序的第一次点击无效,一定到第二次时才会有效
void CSubVibDlg::OnColumnclickListSubvib(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
//获取列的排序数据
PLISTSORTNODE_SubVib pItem = &m_tSortColumns[pNMListView->iSubItem];
pItem->pList = &m_ctrlSubVib;
pItem->nColum = pNMListView->iSubItem;
int iSub=pNMListView->iSubItem;
//设置三角头
CImageList *ImgHeaders = new CImageList;
ImgHeaders->Create(8,8,ILC_MASK,1,1);
ImgHeaders->Add(AfxGetApp()->LoadIcon(IDI_UP));
ImgHeaders->Add(AfxGetApp()->LoadIcon(IDI_DOWN));
enum { sizeOfBuffer = 256 };
TCHAR lpBuffer[sizeOfBuffer];
HDITEM hdi;
hdi.pszText = lpBuffer;
hdi.cchTextMax = sizeOfBuffer;
CHeaderCtrl *pHdCtrl = m_ctrlSubVib.GetHeaderCtrl();
pHdCtrl->SetImageList(ImgHeaders);
ImgHeaders->Detach();//脱离掉才能显示出图片来!
ImgHeaders->DeleteImageList();
hdi.mask = HDI_TEXT | HDI_IMAGE;
pHdCtrl->GetItem(iSub, &hdi);
if ( pItem->nOrder == 0 )
{
pItem->nOrder = 1;
hdi.iImage=1;
}
else
{
pItem->nOrder = 0;
hdi.iImage=0;
}
m_ctrlSubVib.SortItems(Compositor,(LPARAM)pItem); hdi.mask = HDI_IMAGE | HDI_FORMAT | HDI_TEXT/* | HDI_WIDTH*/;
hdi.fmt = HDF_LEFT | HDF_IMAGE | HDF_STRING;
pHdCtrl->SetItem(iSub,&hdi );
for (int i=0; i < m_ctrlSubVib.GetItemCount(); i++) //根据索引调整内容,不影响原有数据
m_ctrlSubVib.SetItemData(i, i);
*pResult = 0;
}
现在的问题是,每次点击列表头排序时,进入程序的第一次点击无效,一定到第二次时才会有效
void CSubVibDlg::OnColumnclickListSubvib(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
//获取列的排序数据
PLISTSORTNODE_SubVib pItem = &m_tSortColumns[pNMListView->iSubItem];
pItem->pList = &m_ctrlSubVib;
pItem->nColum = pNMListView->iSubItem;
int iSub=pNMListView->iSubItem;
//设置三角头
CImageList *ImgHeaders = new CImageList;
ImgHeaders->Create(8,8,ILC_MASK,1,1);
ImgHeaders->Add(AfxGetApp()->LoadIcon(IDI_UP));
ImgHeaders->Add(AfxGetApp()->LoadIcon(IDI_DOWN));
enum { sizeOfBuffer = 256 };
TCHAR lpBuffer[sizeOfBuffer];
HDITEM hdi;
hdi.pszText = lpBuffer;
hdi.cchTextMax = sizeOfBuffer;
CHeaderCtrl *pHdCtrl = m_ctrlSubVib.GetHeaderCtrl();
pHdCtrl->SetImageList(ImgHeaders);
ImgHeaders->Detach();//脱离掉才能显示出图片来!
ImgHeaders->DeleteImageList();
hdi.mask = HDI_TEXT | HDI_IMAGE;
pHdCtrl->GetItem(iSub, &hdi);
if ( pItem->nOrder == 0 )
{
pItem->nOrder = 1;
hdi.iImage=1;
}
else
{
pItem->nOrder = 0;
hdi.iImage=0;
}
m_ctrlSubVib.SortItems(Compositor,(LPARAM)pItem); hdi.mask = HDI_IMAGE | HDI_FORMAT | HDI_TEXT/* | HDI_WIDTH*/;
hdi.fmt = HDF_LEFT | HDF_IMAGE | HDF_STRING;
pHdCtrl->SetItem(iSub,&hdi );
for (int i=0; i < m_ctrlSubVib.GetItemCount(); i++) //根据索引调整内容,不影响原有数据
m_ctrlSubVib.SetItemData(i, i);
*pResult = 0;
}
解决方案 »
- 关于listcontrol控件的问题,大神来啊
- 请高手指教一下如何控制IE页面元素!
- 如何把tc代码转成vc?
- HTTP通讯的HttpSendRequest什么条件下会失败。现象诡秘,往高手指教
- PING的问题
- 请问如何使DOC(文档)保存的时候预先定义为保存成TXT格式?
- 如何使用系统的颜色选择对话框?
- 关于程序员考试,请过来人指点
- 求教:VC++的编辑控件如何设置成多行操作,为什么要加CTR+ENTER才能换行,能不能自己设置成只用ENTER来换行?谢谢!
- 简单的常识问题,可我还是不懂,求教!
- MFC中如何enable edit label和disable edit label
- 如何打开SDI的主窗口
与此帖中问题相同,有没有人遇到过或者提供点思路呢~
第二次点击有效因为已经选中焦点。就会触发你的代码了。直接说解决方法吧:
可以在该控件父窗体的PretranslateMessage的地方截获该消息触发你的函数内容。
传入坐标可以用HitTest来做模拟点击控件内容
试下在HDN_ITEMCLICK消息中处理
代码好累赘哦!
最好 将“//设置三角头”部分放到 m_ctrlSubVib控件的初始化位置去。你的问题(点击2次才排序)。因为排序前要先设置排序用的序号Data。
调整代码顺序!!!
…………
for (int i=0; i < m_ctrlSubVib.GetItemCount(); i++)
m_ctrlSubVib.SetItemData(i, i);
m_ctrlSubVib.SortItems(Compositor,(LPARAM)pItem);
…………