有时候遇到一些问题,当时抓耳挠腮半天找不到头绪,最后问题解决了,没记录,以后遇到了又抓耳挠腮(码农记性不好,不知是不是通病?)。故开此贴,聊以记录所遇问题及解决方法。
2013-5-29
TREECTRL控件NM_CLICK事件,获取当前选中ITEM时错误(只有第一次是正确,因为选中的第一条),发现GetSelectedItem获得的ITEM都是上一次选中的。想来这个NM_CLICK单击消息发送顺序在选中消息之前。改为TVN_SELCHANGED事件,OK了。
2013-5-30
TABCTRL控件TCN_SELCHANGING消息事件的返回值。我希望处理TCN_SELCHANGING消息,在一定条件下不要切换TAB页。
然后我查了MSDN说:
Return Value
TRUE prevents the selection from changing. FALSE allows the selection to change.
可是用ClassWizard添加的响应函数却是无返回值的:
void CDlgMain::OnSelchangingTabXXX(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here *pResult = 0; }
是的,这里的*pResult就是返回值。系统默认*pResult = 0,也就是FALSE。只需要将*pResult = TRUE就OK了。
另外提醒下,将*pResult = TRUE放在系统默认*pResult = 0语句的后面……
2013-6-3
多线程与计时器的区别。
如果需要处理大量数据或需要耗费大量时间时,我会用多线程。如果需要做个监控,计时器、多线程都可用。那么各有什么区别呢?
计时器的优点:
使用方便,傻瓜相机。
计时器的缺点:
1、计时器触发的WM_TIMER消息,与WM_PAINT消息一样是低优先级的,当前消息队列没有其他消息时,才会轮到处理WM_TIMER消息;
2、计时器在主线程(UI线程)内,使用UI线程资源。如果UI线程堵塞、挂起,计时器也就暂停了。反过来也会导致UI线程假死。
多线程的优点:
1、对CPU利用率高,速度快;
2、不占用UI线程资源。
多线程缺点:
需要处理好同步问题,否则你会抓狂。单反相机不是随随便便就能用的呦!
2013-6-21
改变ListCtrl任意行的颜色
我这里用Report样式,所有记录按ID号排序,当ID号一样的记录有多条时,我希望将第一条用颜色标记。
为了省事,我这里用了nImage变量做标识符,当然大家如果用了nImage那就自定义个变量好了。
第一条需要标记颜色的记录InsertItem时,nImage参数传-1,不需要的传0或者不传(因为不传时系统默认为0)。
接下来重写OnCustomDraw
void CListCtrlEx::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = CDRF_DODEFAULT; LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW) pNMHDR; //Before the painting cycle begins if (lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT) { *pResult = CDRF_NOTIFYITEMDRAW; } else if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) //Before an item is drawn. { *pResult = CDRF_NOTIFYSUBITEMDRAW; } else if (lplvcd->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM)) // { if (this->m_bUseFont) ::SelectObject(lplvcd->nmcd.hdc, this->m_hFont); CString strValue; int nItem = lplvcd->nmcd.dwItemSpec; rgbBackColor = RGB(142, 219, 150);//你的颜色 LVITEM pItem; pItem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM; pItem.iItem = nItem; pItem.iSubItem = lplvcd->iSubItem; pItem.pszText = new char[1024]; pItem.cchTextMax = 1023; if (this->GetItem(&pItem)) { switch (pItem.iImage) { case 0: { lplvcd->clrTextBk = RGB(255, 255, 255); *pResult = CDRF_NEWFONT; } break; case -1: { lplvcd->clrTextBk = rgbBackColor; *pResult = CDRF_NEWFONT; } break; default: break; } } delete pItem.pszText; } }
2014-5-5
在Dll里创建含有OCX的对话框,需要在InitInstance函数中添加
BOOL CMFCLibrary1App::InitInstance() { CoInitialize(NULL); //需添加 AfxEnableControlContainer(); //需添加 CWinApp::InitInstance(); return TRUE; }
TO BE CONTINUE......