??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (CTLCOLOR_STATIC == nCtlColor)
{
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
// TODO: 如果默认的不是所需ȝQ则q回另一个画W?/span>
return hbr;
}
效果如图Q?br>
在大多数情况下这U方法都没问题,但是Q当需要动态更攚w(rn)态文本框中的内容时就?x)出现这L(fng)问题Q?br>
也就是出C(jin)文字重叠现象?br>
其原因出?#8220;透明”w上。一般情况下在绘制界面时?x)先l制对话框的背景然后才会(x)l制子控Ӟ而子控g通常都会(x)自绘其背景的Q于是子控gl制完之后就?x)盖住对话框原先所l制的一部分内容Q所?#8220;透明”效果是靠禁止子控g自绘背景而实现的?br>
?jin)解?#8220;透明”后,再来回到刚才的问题上。因为现在静(rn)态文本框不会(x)L除背景而只是绘制出文字Q于是之前的“试”׃(x)D留在对话框背景上,只有引v对话框背景重l时才能L。于是,我们应该在设|完文本框的文字后再让对话框重绘背景才行?br>修改一?#8220;更改文本”按钮响应函数Q?br>
{
CString tmp;
GetDlgItemText(IDC_EDIT1 , tmp);
SetDlgItemText(IDC_STATIC1 , tmp);
// 一下ؓ(f)新添加内宏V只需局部重l背景即?br> CRect rect;
GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect);
ScreenToClient(&rect);
InvalidateRect(&rect);
UpdateWindow();
}
q样一来就更好的实C(jin)“透明”?br>
以上只是弟的一些理解,如果有什么地方说的不对,或者你有更好的Ҏ(gu)来实?#8220;透明”Q还望告知,弟先谢q了(jin) : P
]]>
一般来_(d)用Visual C++~制需要打印的E序Ӟ在用AppWizard生成工程文g时就加入打印和打印预览选项Q该选项在AppWizard的第四步Q。若用手工加入,则稍微麻?ch)些?
MFC对于打印的支持是在视cCView中实现的Q该cM有如下几个成员函数是与打印或打印预览有关的:(x)
BOOL OnPreparePrinting(CPrintInfopInfo)
void OnBeginPrinting(CDCpDC, CPrintInfopInfo)
void OnPrepareDC(CDCpDC, CPrintInfopInfo)
void OnPrint(CDCpDC, CPrintInfopInfo)
void OnEndPrinting(CDCpDC, CPrintInfopInfo)
其中QpDC是打印或昄的设备场指针QpInfo是打印过E信息指针。pInfo包含许多有用的信息,如打印的总页数、当前打印页的页码、是打印q是打印预览、是否l打印等Q具体参数内容和意义可以参考MFC联机手册?
以上几个函数都是虚函敎ͼ可以重蝲。若在用AppWizard生成工程文g旉择?jin)打印和打印预览选项Q则函数OnPreparePrinting、OnBeginPrinting、OnEndPrinting自动地被AppWizard插入C的视cM加以重蝲。另外两个函数则可以手工加入Q如果用的是Visual C++ 4.0以上版本Q可以通过ClassWizard加入到视cM?
q几个函数在用户选择打印命o(h)时由应用框架自动调用Q用L(fng)序不用显式调用。下面讲q这几个函数在打印过E中的调用顺序及(qing)其意义?
1.OnPreparePrinting
OnPreparePrinting函数最先被调用Q用来初始化打印机等。比如,若没有安装打印机Q则该函数将提示用户安装打印机。用L(fng)序可以向其中加入别的初始化代码,比如Q计打C的文档所需要的总页敎ͼ然后调用视类中的打印机初始化函数BOOL DoPreparePrinting(CPrintInfopInfo)卛_。而用AppWizard生成的代码中QOnPreparePrinting函数只是调用函数DoPreparePrintingQƈ传递参数?
2.OnBeingPrinting
OnBeingPrinting函数是开始打印文档前调用的函敎ͼ用户可以在其中加入另一些对于打印过E的初始化代码,比如分配打印q程中将要用的“W?#8221;QCPenQ?#8220;刷子”QCBrushQ等Q默认的代码中该函数直接返回?
3.OnEndPrinting
OnEndPrinting函数是与OnBeginPrinting函数相对应的函数Q它在打印完成后由应用框架调用,用于释放在OnBeginPrinting中分配的“对象”Q如“W?#8221;?#8220;刷子”{,光认的代码中该函数直接返回?
4.OnPrepareDC
OnPrepareDC函数用于在打印前准备打印讑֤场,如窗口大、原点,视图大小、原点等。同时该函数在视cLC文档内Ҏ(gu)也被调用Q默认的代码中该函数调用基类中的OnPrepareDC函数?
5.OnPrint
OnPrint函数则是具体的打印过E,它利用前面准备好的设备场q行打印?
q几个函CQOnPreparePrinting、OnBeginPrinting、OnEndPrinting函数在一ơ打印过E中只被调用一ơ,不管q一ơ打印内Ҏ(gu)多少,而OnPrepareDC、OnPrint函数则每打印一都被调用一ơ,q种调用ơ序对于打印是很有用的?
在编E中Q相信大家只要用好这几个基本函数Q一定会(x)~制出满意的Windows打印E序?
]]>
“
Only windows that have the CS_DBLCLKS
”?br>
看到q行文字后,我便认ؓ(f)是进度条的wndclass对象中没有CS_DBCLKSQ经下面代码认Q证明了(jin)我的正确
Z(jin)让进度条可以获取鼠标双击Q只需在OnInitDialog中加入如下两行代码便可以?jin)?x)
2Q?如果在同一个线E内QPostMessage发送消息时Q消息要先放入线E的消息队列Q然后通过消息循环Dispatch到目标窗口。SendMessage发送消息时Q系l直接调用目标窗口的消息处理E序Qƈ结果返回。SendMessage在同一U程中发送消息ƈ不入U程消息队列?如果在不同线E内。最好用PostThreadMessage代替PostMessage,他工作的很好。SendMessage发送消息到目标H口所属的U程的消息队列,然后发送消息的U程{待(事实上,他应该还在做一些监工作,比如监视QS_SENDMESSAGE标志)Q直到目标窗口处理完q且l果q回Q发送消息的U程才l运行。这是SendMessage的一般情况,事实上,处理q程要复杂的多。比如,当发送消息的U程监测到有别的H口SendMessage一个消息到来时Q他直接调用H口处理q程(重入)Qƈ处理结果返?q个q程不需要消息@环中GetMessage{的支持)?
3Q?msdn: If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail.
如果发送的消息码在WM_USER之下(非自定义消息)且消息参C带有指针Q那么PostMessage,SendNotifyMessage,SendMessageCallbackq些异步消息发送函数将?x)调用失败?最好不要用PostMessage发送带有指针参数的消息?/font>
在上面的代码中,可以在DoSomethingBeforeMsgLoop()函数中用ShowWindow()来隐藏窗口,同时q可以执行其它一些操作,也可以直接在DoSomethingBeforeMsgLoop()函数调用处调用ShowWindow()函数来隐藏窗口?/p>
也有人提Z(jin)其它Ҏ(gu)。比如仍然用模态对话框Q但使用计数器设定很短一个时间来触发事gQƈ在处理该计数器事件中隐藏H口。该Ҏ(gu)可行Q但太麻?ch),没有上面的方法方ѝ?/p>
首先你需要设|列表控件所使用的ImageListQ如果你使用大图标显C风|你就需要以如下形式调用Q?
CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL);
如果使用其它三种风格昄而不xC图标你可以不进行Q何设|,否则需要以如下形式调用Q?
CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL);
通过调用int InsertItem( int nItem, LPCTSTR lpszItem );可以在列表控件中nItem指明位置插入一,lpszItem为显C字W。除LVS_REPORT风格外其他三U风格都只需要直接调?InsertItem可以了(jin)Q但如果使用报表风格必d讄列表控g中的列信息?/p>
通过调用int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubItem);可以插入列。iCol为列的位|,从零开始,lpszColumnHeading为显C的列名QnFormat为显C对齐方式, nWidth为显C宽度,nSubItem为分配给该列的列索引?
在有多列的列表控件中需要ؓ(f)每一Ҏ(gu)明其在每一列中的显C字W,通过调用
BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );可以讄每列的显C字W。nItem|的的位置QnSubItem为列位置QlpszText为显C字W。下面的代码演示?jin)如何设|多列ƈ插入数据Q?
m_list.SetImageList(&m_listSmall,LVSIL_SMALL);//讄ImageList
m_list.InsertColumn(0,"Col 1",LVCFMT_LEFT,300,0);//讄?br>m_list.InsertColumn(1,"Col 2",LVCFMT_LEFT,300,1);
m_list.InsertColumn(2,"Col 3",LVCFMT_LEFT,300,2);
m_list.InsertItem(0,"Item 1_1");//插入?br>m_list.SetItemText(0,1,"Item 1_2");//讄该行的不同列的显C字W?br>m_list.SetItemText(0,2,"Item 1_3");
此外CListCtrlq提供了(jin)一些函数用于得?修改控g的状态?
COLORREF GetTextColor( )/BOOL SetTextColor( COLORREF cr );用于得到/讄昄的字W颜艌Ӏ?
COLORREF GetTextBkColor( )/BOOL SetTextBkColor( COLORREF cr );用于得到/讄昄的背景颜艌Ӏ?
void SetItemCount( int iCount );用于得到dq列表中的数量?
BOOL DeleteItem(int nItem);用于删除某一,BOOL DeleteAllItems( );删除所有项?
BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent);用于讄背景位图?
CString GetItemText( int nItem, int nSubItem );用于得到某项的显C字W?
列表控g的消息映同样用ON_NOTIFY宏,形式如同QON_NOTIFY( wNotifyCode, id, memberFxn )QwNotifyCode为通知代码QidZ生该消息的窗口IDQmemberFxn为处理函敎ͼ函数的原型如同void OnXXXList(NMHDR* pNMHDR, LRESULT* pResult)Q其中pNMHDRZ数据l构Q在具体使用旉要{换成其他cd的结构。对于列表控件可能取值和对应的数据结构ؓ(f)Q?
关于ON_NOTIFY有很多内容,在以后的内容中q行详细讲解?
关于动态提供结Ҏ(gu)昄的字W:(x)首先你在Ҏ(gu)需要指明lpszItem参数为:(x) LPSTR_TEXTCALLBACK。在控g昄该结Ҏ(gu)?x)通过发送TVN_GETDISPINFO来取得所需要的字符Q在处理该消息时先将参数 pNMHDR转换为LPNMLVDISPINFOQ然后填充其中item.pszText。通过item中的iItem,iSubItem可以知道当前昄的ؓ(f)那一V下面的代码演示?jin)这U方法:(x)
关于~辑某项的显C字W:(x)Q在报表风格中只对第一列有效)(j)首先需要设|列表控件的 LVS_EDITLABELS风格Q在开始编辑时该控件将?x)发送LVN_BEGINLABELEDITQ你可以通过在处理函Cq回TRUE来取消接下来的编辑,在编辑完成后?x)发送LVN_ENDLABELEDITQ在处理该消息时需要将参数pNMHDR转换为LPNMLVDISPINFOQ然后通过其中的item.pszText得到~辑后的字符Qƈ重置昄字符。如果编辑在中途中取消该变量ؓ(f)NULL。下面的代码说明如何处理q些消息Q?
上面讲述的方法所q行的消息映必d父窗口中q行Q同样WM_NOTIFY的所有消息都需要在父窗口中处理Q?
如何得到当前选中位|:(x)在列表控件中没有一个类gListBox中GetCurSel()的函敎ͼ但是可以通过调用GetNextItem( -1, LVNI_ALL | LVNI_SELECTED);得到选中位|?/p>
下面是一些例?/p>
作者:(x)lixiaosan
旉Q?4/06/2006
以下未经说明Qlistctrl默认view 风格为report
相关cd(qing)处理函数
MFCQCListCtrlc?/p>
SDKQ以 “ListView_”开头的一些宏。如 ListView_InsertColumn
--------------------------------------------------------------------------------
1. CListCtrl 风格
LVS_ICON: 为每个item昄大图?br> LVS_SMALLICON: 为每个item昄图?br> LVS_LIST: 昄一列带有小图标的item
LVS_REPORT: 昄item详细资料
直观的理解:(x)windows资源理器,“查看”标签下的“大图标,图标,列表Q详l资?#8221;
--------------------------------------------------------------------------------
2. 讄listctrl 风格?qing)扩展风?br> LONG lStyle;
lStyle. = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前H口style
lStyle. &= ~LVS_TYPEMASK; //清除昄方式?br> lStyle.|= LVS_REPORT; //讄style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//讄style
DWORD dwStyle. = m_list.GetExtendedStyle();
dwStyle.|= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrlQ?br> dwStyle.|= LVS_EX_GRIDLINES;//|格U(只适用与report风格的listctrlQ?br> dwStyle.|= LVS_EX_CHECKBOXES;//item前生成checkbox控g
m_list.SetExtendedStyle(dwStyle); //讄扩展风格
注:(x)listview的styleh阅msdn
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp
--------------------------------------------------------------------------------
3. 插入数据
m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入?br> m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );
int nRow = m_list.InsertItem(0, “11”);//插入?br> m_list.SetItemText(nRow, 1, “jacky”);//讄数据
--------------------------------------------------------------------------------
4. 一直选中item
选中style中的Show selection alwaysQ或者在上面W?点中讄LVS_SHOWSELALWAYS
--------------------------------------------------------------------------------
5. 选中和取消选中一?/strong>
int nIndex = 0;
//选中
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
//取消选中
m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
--------------------------------------------------------------------------------
6. 得到l(f)istctrl中所有行的checkbox的状?/strong>
m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))
{
str.Format(_T("W?d行的checkbox为选中状?), i);
AfxMessageBox(str);
}
}
--------------------------------------------------------------------------------
7. 得到l(f)istctrl中所有选中行的序号
Ҏ(gu)一Q?br> CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
{
str.Format(_T("选中?jin)?d?), i);
AfxMessageBox(str);
}
}
Ҏ(gu)二:(x)
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)
TRACE0("No items were selected!\n");
else
{
while (pos)
{
int nItem = m_list.GetNextSelectedItem(pos);
TRACE1("Item %d was selected!\n", nItem);
// you could do your own processing on nItem here
}
}
--------------------------------------------------------------------------------
8. 得到item的信?/strong>
TCHAR szBuf[1024];
LVITEM lvi;
lvi.iItem = nItemIndex;
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT;
lvi.pszText = szBuf;
lvi.cchTextMax = 1024;
m_list.GetItem(&lvi);
关于得到讄item的状态,q可以参考msdn文章
Q173242: Use Masks to Set/Get Item States in CListCtrl
http://support.microsoft.com/kb/173242/en-us
--------------------------------------------------------------------------------
9. 得到l(f)istctrl的所有列的header字符串内?br> LVCOLUMN lvcol;
char str[256];
int nColNum;
CString strColumnName[4];//假如??/p>
nColNum = 0;
lvcol.mask = LVCF_TEXT;
lvcol.pszText = str;
lvcol.cchTextMax = 256;
while(m_list.GetColumn(nColNum, &lvcol))
{
strColumnName[nColNum] = lvcol.pszText;
nColNum++;
}
--------------------------------------------------------------------------------
10. 使listctrl中一可见,x动滚动条
m_list.EnsureVisible(i, FALSE);
--------------------------------------------------------------------------------
11. 得到l(f)istctrl列数
int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();
--------------------------------------------------------------------------------
12. 删除所有列
Ҏ(gu)一Q?br> while ( m_list.DeleteColumn (0))
因ؓ(f)你删除了(jin)W一列后Q后面的列会(x)依次向上Ud?/p>
Ҏ(gu)二:(x)
int nColumns = 4;
for (int i=nColumns-1; i>=0; i--)
m_list.DeleteColumn (i);
--------------------------------------------------------------------------------
13. 得到单击的listctrl的行列号
dlistctrl控g的NM_CLICK消息相应函数
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// Ҏ(gu)一Q?br> /*
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
int nItem = m_list.SubItemHitTest(&lvinfo);
if(nItem != -1)
{
CString strtemp;
strtemp.Format("单击的是W?d行第%d?, lvinfo.iItem, lvinfo.iSubItem);
AfxMessageBox(strtemp);
}
*/
// Ҏ(gu)?
/*
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
CString strtemp;
strtemp.Format("单击的是W?d行第%d?,
pNMListView->iItem, pNMListView->iSubItem);
AfxMessageBox(strtemp);
}
*/
*pResult = 0;
}
--------------------------------------------------------------------------------
14. 判断是否点击在listctrl的checkbox?/strong>
dlistctrl控g的NM_CLICK消息相应函数
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
UINT nFlag;
int nItem = m_list.HitTest(point, &nFlag);
//判断是否点在checkbox?br> if(nFlag == LVHT_ONITEMSTATEICON)
{
AfxMessageBox("点在listctrl的checkbox?);
}
*pResult = 0;
}
--------------------------------------------------------------------------------
15. 右键点击listctrl的item弹出菜单
dlistctrl控g的NM_RCLICK消息相应函数
void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
CMenu menu;
VERIFY( menu.LoadMenu( IDR_MENU1 ) );
CMenu* popup = menu.GetSubMenu(0);
ASSERT( popup != NULL );
popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );
}
*pResult = 0;
}
--------------------------------------------------------------------------------
16. item切换焦点?包括用键盘和鼠标切换item?Q状态的一些变化顺?/strong>
dlistctrl控g的LVN_ITEMCHANGED消息相应函数
void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CString sTemp;
if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED &&
(pNMListView->uNewState & LVIS_FOCUSED) == 0)
{
sTemp.Format("%d losted focus",pNMListView->iItem);
}
else if((pNMListView->uOldState & LVIS_FOCUSED) == 0 &&
(pNMListView->uNewState & LVIS_FOCUSED) == LVIS_FOCUSED)
{
sTemp.Format("%d got focus",pNMListView->iItem);
}
if((pNMListView->uOldState & LVIS_SELECTED) == LVIS_SELECTED &&
(pNMListView->uNewState & LVIS_SELECTED) == 0)
{
sTemp.Format("%d losted selected",pNMListView->iItem);
}
else if((pNMListView->uOldState & LVIS_SELECTED) == 0 &&
(pNMListView->uNewState & LVIS_SELECTED) == LVIS_SELECTED)
{
sTemp.Format("%d got selected",pNMListView->iItem);
}
*pResult = 0;
}
--------------------------------------------------------------------------------
17. 得到另一个进E里的listctrl控g的item内容
http://www.codeproject.com/threads/int64_memsteal.asp
--------------------------------------------------------------------------------
18. 选中listview中的item
Q131284: How To Select a Listview Item Programmatically
http://support.microsoft.com/kb/131284/en-us
--------------------------------------------------------------------------------
19. 如何在CListView中用CListCtrl的派生类
http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/
--------------------------------------------------------------------------------
20. listctrl的subitemd图标
m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
m_list.SetItem(..); //具体参数请参考msdn
--------------------------------------------------------------------------------
21. 在CListCtrl昄文gQƈҎ(gu)文gcd来显C图?/strong>
|上扑ֈ的代码,share
BOOL CTest6Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
HIMAGELIST himlSmall;
HIMAGELIST himlLarge;
SHFILEINFO sfi;
char cSysDir[MAX_PATH];
CString strBuf;
memset(cSysDir, 0, MAX_PATH);
GetWindowsDirectory(cSysDir, MAX_PATH);
strBuf = cSysDir;
sprintf(cSysDir, "%s", strBuf.Left(strBuf.Find("\\")+1));
himlSmall = (HIMAGELIST)SHGetFileInfo ((LPCSTR)cSysDir,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
if (himlSmall && himlLarge)
{
::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,
(WPARAM)LVSIL_SMALL, (LPARAM)himlSmall);
::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,
(WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);
}
return TRUE; // return TRUE unless you set the focus to a control
}
void CTest6Dlg::AddFiles(LPCTSTR lpszFileName, BOOL bAddToDocument)
{
int nIcon = GetIconIndex(lpszFileName, FALSE, FALSE);
CString strSize;
CFileFind filefind;
// get file size
if (filefind.FindFile(lpszFileName))
{
filefind.FindNextFile();
strSize.Format("%d", filefind.GetLength());
}
else
strSize = "0";
// split path and filename
CString strFileName = lpszFileName;
CString strPath;
int nPos = strFileName.ReverseFind('\\');
if (nPos != -1)
{
strPath = strFileName.Left(nPos);
strFileName = strFileName.Mid(nPos + 1);
}
// insert to list
int nItem = m_list.GetItemCount();
m_list.InsertItem(nItem, strFileName, nIcon);
m_list.SetItemText(nItem, 1, strSize);
m_list.SetItemText(nItem, 2, strFileName.Right(3));
m_list.SetItemText(nItem, 3, strPath);
}
int CTest6Dlg::GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected)
{
SHFILEINFO sfi;
memset(&sfi, 0, sizeof(sfi));
if (bIsDir)
{
SHGetFileInfo(lpszPath,
FILE_ATTRIBUTE_DIRECTORY,
&sfi,
sizeof(sfi),
SHGFI_SMALLICON | SHGFI_SYSICONINDEX |
SHGFI_USEFILEATTRIBUTES |(bSelected ? SHGFI_OPENICON : 0));
return sfi.iIcon;
}
else
{
SHGetFileInfo (lpszPath,
FILE_ATTRIBUTE_NORMAL,
&sfi,
sizeof(sfi),
SHGFI_SMALLICON | SHGFI_SYSICONINDEX |
SHGFI_USEFILEATTRIBUTES | (bSelected ? SHGFI_OPENICON : 0));
return sfi.iIcon;
}
return -1;
}
本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/KataDoc360/archive/2009/05/18/4195356.aspx
When you implement a modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Don't call the base class CDialog::OnCancel, because it calls EndDialog, which will make the dialog box invisible but will not destroy it. You should also override PostNcDestroy for modeless dialog boxes in order to delete this, since modeless dialog boxes are usually allocated with new. Modal dialog boxes are usually constructed on the frame and do not need PostNcDestroy cleanup.