MFC工作学习笔记(更新ing)

有时候遇到一些问题,当时抓耳挠腮半天找不到头绪,最后问题解决了,没记录,以后遇到了又抓耳挠腮(码农记性不好,不知是不是通病?)。故开此贴,聊以记录所遇问题及解决方法。


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;
}



最近使用VS2012写DLL,需要创建一个对话框,显示网页,使用了CWebBrowser2控件。当对话框添加OCX控件后,对话框DoModal失败,返回-1,不显示对话框。懊恼一整天,终于找到原因,就是那么2句话。该死的MS,TM就不能自动添加吗吗吗~~~~



TO BE CONTINUE......

你可能感兴趣的:(C++,mfc)