VC++大杂烩
1. 如何获取系统日期
CTime tm = CTime :: GetCurrentTime();
CString strTime = tm.Format(_TEXT(“%Y-%M-%d %H:%M:%S));
MessageBox(strTime);
2. 动态分配二维数组
int **array;
array = new int*[col];
if(array = = 0) exit(-1);
for(int i=0; i<col; i++){
array[i] = new int[row];
if(array[i] = = 0)
exit(-1); }
//释放
for(i=0; i<col; i++){
delete [] array[i]; }
delete [] array;
3. 如何定义一个二维字符串数组
① char **str = “abcdef” ; //一维
② char *str[row][col]={“abc”, “cdf”, “efg”…..}; //row×col个
4. 将一个十六进制”FF”、”FA”等字符串数组等转化为十进制数组
int array[32][32];
int a,b, n=0;
int result1;
char *str;
for(int i=0; i<32; i++)
for(int j=0; j<32; j++){
str = str[i][j];
if(str[0] >= ‘A’ && str[1] >=’A’){ //”AF”
a = str[0] – ‘A’;
b= str[1] – ‘A’;
result1 = (a+10)*16+(b+10)*1;}
else if(str[0] >= ‘A’ && str[1] <’A’){ //”A9”
a = str[0] – ‘A’;
b = ‘A’ – str[1] +1;
result1 = (a+10)*16+b;}
else if(str[0] < ‘A’ && str[1] >=’A’){ //”8B”
a = ‘A’ – str[0]+1;
b = str[1] – ‘A’;
result1 = a*16+(b+10)*1;}
else{ //”87”
a = ‘A’ – str[0]+1;
b = ‘A’ – str[1] +1;
result1 = a*16+b;}
array[i][j] = reslut1;
printf(“%5d”, array[i][j]);
n++;
if(n%32 = = 0) printf(“\n”); }
将这个矩阵数组在屏幕上显示:
#i nclude < afxwin.h >
#i nclude < afxext.h >
#i nclude < afxdisp.h >
#i nclude < afxdtctl.h >
DWORD color_;
HDC hMyDC = GetDC(NULL);
for(i=0; i<32; i++)
for(j=0; j<32; j++){
color_ = array[i][j];
color_ = color_*256*256 + color_*256+color_;
SetPixel(hMyDC, j, i, color_); }
5. 将一个整型转化为一个字符串 _itoa
//将从位图信息头得到的图像宽度和高度显示出来
char buffer1[20], buffer2[20];
_itoa( width, buffer1, 10);
_itoa( height, buffer2, 10);
char str[80];
strcpy(str, “width=”);
strcat(str, buffer1);
strcat(str, “, hight=”;
strcat(str, buffer2);
AfxMesageBox(str, MB_OK, 0);
6. 当把二维数组地址用作参数传递,而又要此地址不断递增时,可以另外定义一个同类型指针,指向二维数组第一个元素的地址,把这个赋值放在循环外:
unsigned char *p;
p = &m_pImage[0][0];
然后在循环中,可以p + m_count*4096;
7. 改变最近打开文档的个数
在InitInstance()中的LoadStdProfileSetting(8); //括号里是要设置的个数
8. 打开调色板对话框
CColorDialog dlg;
dlg.Domodal();
9. 如何添加工具栏,如何使用Slider?
在OnInitDialog()中添加:
CSliderCtrl *pSliderCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
pSliderCtrl -> SetRange(0,255,TRUE); //设置滑动条的范围
pSliderCtrl -> SetPos(100); // 设置滑动条的初始位置
在Dlg类中响应WM_HSCROLL消息:
CSliderCtrl *pSliderCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
m_nCur = pSliderCtrl - >GetPos(); //获得当前的位置值
10. 更改光标
:: SetCursor(:: LoadCursor(NULL, IDC_SIZEALL));
//如果是自己定义的光标资源,则要用MAKEINTRESOURCE 进行转化,例如:
:: SetCursor(:: LoadCursor(NULL, IDC_CURSOR_CUT));
11. 设置文本显示的一些函数
CDC dc(this);
CPen pen(PS_SOLID, 2, RGB(0,0,255)); //初始化一支笔
CBrush *pBush = CBrush :: FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
dc.SelectObject(pBrush);
dc.SetTextColor(RGB(255,0 ,255));
dc.SetBKMode(TRANSPARENT); //将文本背景设置为透明
12. 将对话框中的图像拷贝到剪贴板
CWnd* pWnd = GetDlgItem(IDC_IMAGE_SELECT);
WINDOWPLACEMENT *winPlacement;
WinPlacement = new WINDOWPLACEMENT;
pWnd -> GetWindowPlacement(winPlacement); //获得一个控件的位置
CDC *dcTemp;
dcTemp= new CClientDC(FromHandle(m_hWnd));
CDC memDC;
memDC.CreateCompatibleDC(dcTemp); //创建一个兼容的DC
CBitmap bm;
CSize sz(lWidth, lHeight);
bm.CreateCompatilbleBitmap(dcTemp, sz.cx, sz.cy); //创建一个兼容的位图
CBitmap* oldbm = memDC.SelectObject(&bm);
memDC.BitBlt(0, 0, sz.cx, sz.cy, dcTemp, winPlacement ->rcNormalPosition.left,
winPlacement ->rcNormalPosition.top, SRCCOPY);
pWnd -> OpenClipboard(); //打开剪贴板,不用pWnd->GetParent()->OpenClipard();
:: EmptyClipard();
:: SetClipardData(CF_BITMAP, bm.m_hObject); //粘贴到剪贴板
CloseClipard();
memDC.SelcetObject(oldbm);
delete dcTemp;
13. VC里获取一个文件夹路径
BROWSEINFO bi;
TCHAR szDisplayName[MAX_PATH];
LPITEMIDLIST pidl;
LPMALLOC pMalloc = NULL;
ZeroMemory(&bi, sizeof(bi));
bi.hWndOwner = GetSafeHwnd();
bih.pszDisplayName = szDisplayName;
bi.lpszTitle = TEXT(“Please select a folder:”);
bi.ulFlags = BIF_RETURNONLYFSDIRS;
Pidl = SHBrowseForFolder(&bi);
if(pidl) {
SHGetPathFromIDList(pidl, szDisplayName);
sPath = szDisplayName;
MessageBox(sPath); }
14. 如何设置密码输入时显示的是*号
#i nclude <iostream.h>
#i nclude <conio.h>
char a[8];
void main() {
int i=0;
Cout<<”请输入密码:”<<endl;
while(1) {
a[i] = getch();
if( i>=8 || a[i]= = 13)
break;
putch(‘*’);
i++; }
cout<<endl<<a<<endl;
getch(); }
15. 设置菜单:可以使用CMenu:: EnableMenuItem()来设置菜单可用或禁用,但是在MFC中,要使该函数起作用,需要将CWnd :: m_bAutomenuEnable设置为FALSE.
16. 关闭子窗口
:: SendMessage(:: AfxGetMainWnd() -> m_hWnd, WM_COMMAND, ID_FILE_CLOSE,0);
获取主窗口的指针 CWinThread :: m_pMainWnd
调用AfxGetMainWnd()可实现
继续上面的总结~! To making it count~!。。。。。。
CMain* pApp = ((CMain*)AfxGetApp()->m_pMainWnd);
ASSERT_KINDOF(CMain, pAPP); //确保pAPP是CMain的类对象
2. VC++如何获取应用程序的实例句柄
实例句柄保存在CWinApp m_hInstance中
HANDLE hInstance = AfxGetInstanceHandle();
3. VC++怎样加载其他的应用程序 三个SDK函数WinExec, ShellExecute, CreateProcess.
① WinExec最简单,前一个指定路径,后一个指定显示方式;
② ShellExecute(null, null, _T(“1.txt”), NULL, _T(“c:\\temp”), SW_SHOWNORMAL);
③ STARTUPINFO stinfo; //启动窗口的信息
PROCESSINFO proinfo; //进程的信息
CreateProcess(NULL,_T(“notepad.exe)”,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&stinfo,&proinfo);
4. 如何确定顶层菜单所占据的菜单行数:首先,计算主窗口的高度和客户区高度;其次,从主框窗口的高度中减去客户区、框边界以及标题的高度;最后,除以菜单栏的高度
CRect rc, rcClient;
GetWindowRect(rc);
GetClientRect(rcClient);
Int menuHeight;
menuHeight = (rc.Height() – rcClicent.Height()–
::GetSystemMetrics(SM_CYCAPTION) – :: GetSystemMetrics(SM_CY)*2))
- / :: GetSystemMetrics(SM_CYMENU) ;
5. 响应下拉菜单的消息为
ON_CBN_SELECTDOK(ID_TOOL_ZOOM, OnSelectZoomed)
6. 设置工具栏的标题
m_wndTestBar.SetWindowText(“your toolbar title”);
7. 如何获得应用程序主窗口的指针
CWnd pMainWnd = AfxGetApp() ->m_pMainWnd;
CMain *pMain = ((CMain*)pMainWnd;
CRect rect;
CWnd* pParent = AfxGetApp()->GetMainWnd();
pParent ->GetWindowRect(&rect); //得到应用程序窗口矩形
//移到窗口
pParent -> MoveWindow(rect.left, rect.top, rect.Width()+1,rect.Height()+1,TRUE);
8. 获得获得子窗口
CMDIChildWnd* pChild = (CMDIChildWnd*)GetActive();
//或:CMDIChildWnd* pChild=MDIGetActive();
9. 获得活动子窗口的活动视图
CMyView* pView = (CMyView*)pChild->GetActiveView();
获取当前窗口的指针
CWnd :: GetForegoundWindow();
10. 从句柄转换到指针
HWND hwnd;
hwnd = :: FindWindow(NULL, “TEST”);
CWnd* pWnd = FromHandle(hwnd);
11. 怎样改变进度条控件的颜色,发送消息
m_progress.SendMessage(PBM_SETBKCOLOR, 0, RGB(255,0,0)); //背景色
m_progress.SendMessage(PBM_SETBARCOLOR, 0, RGB(0,255,0)); //前景色
12. 定义char num[10];
sprintf(num, “%d”, calnum); //格式化数字
char unit[]=”矩形”;
sprintf(num, “%s”, unit); //格式化字符串
13. 改变字符串的显示字体和大小
CFont font;
font.CreatePointFont(300, “华文行楷”,NULL);
CFont *pOldFont=dc.SelectObject(&font);
dc.SelectObject(pOldFont);
14. 将路径中的单’\’变为’\\’
CMyDoc *pDoc=GetDocument();
CString reportPath = pDoc -> strPathName;
int lentemp = reportPath.GetLength();
reportPath = reportPath.Left(lentemp-4);
int lenpath = reportPath.GetLength();
for(int i=0; i<lenpath-1; ) {
if(reportpath.GetAt(i) = = ‘\\’) {
reportpath.Insert(i, ‘\\’);
i+=2; }
i++; }
15. 获取屏幕分辨率
HDC hSrcDC;
hSrcDC = ::GetDC(AfxGetApp() -> m_pMainWnd->GetSafeHwnd());
int xSrc, ySrc;
xSrc = GetDeviceCaps(hSrcDC, HORIRES); //水平分辨率
ySrc = GetDeviceCaps(hSrcDC, VERTRES); //垂直分辨率
16. 让Edit控件响应回车键:利用获取消息来完成,调用虚函数
PreTranslateMessage(MSG* pMsg) {
If( pMsg ->message = = WM_KEYDOWN) {
switch(pMsg -> wParam) {
case VK_RETURN:
GetDlgItem(IDC_BTN_INPUT)->SendMessage(BM_CLICK, 0, 0);
return TRUE; } } }
17. 改变对话框的背景色:在InitInstance()中加入
SetDialogBKColor(RGB(160, 180, 220), RGB(255, 0, 0)); //后面是字体颜色
18. 让指定的矩形框重画 InvalidateRect(&rect, TRUE);
19. 怎样选择所选的List当前位置
int iTem;
POSITION pos=m_findCtrl.GetFirstSelectedItemPosition();
if(pos = = 0) {
MessageBox(“请选择需要删除的记录”);
return; }
else {
iTem = m_findCtrl.GetNextSelectedItem(pos); }
//删除List中的某行
m_findCtrl.DeleteItem(iTem);
m_findCtrl.Update(iTem);
20. 动态创建控件
CEdit m_edit;
CRect rect(0,0,100,200);
M_edit.Create(WS_CHILD | ES_AUTOHCROLL | WS_BORDER, rect, this, ID_EDIT_1);
21. 列表控件的应用
CListCtrl* m_list;
CRect rect_list;
this->GetCientRect(&rect_list);
rect_list.top + =100;
m_list -> Create(WS_CHILD | LVS_REPORT | WS_BORDER | LVS_SINGLESEL, rect_list, this, ID_TABLIST);
this ->m_list->ModifyStyle(LVS_EDITABELS,0L); //禁止标题编辑
m_list->ModifyStyle(0L ,LVS_REPORT); //设置为Report类型
m_list->ModifyStyle(0L, LVS_SHOWSELALWAYS); //始终高亮显示被选中的表项
m_list->ModifyStyle(0L,LVS_NOSORTHEADER); //禁止标题编辑
m_list->SetBkColor(RGB(0,200,200)); //设置背景颜色
m_list->SetTextBkColor(RGB(0,200,200)); //设置文本背景颜色
m_list->ModifyStyle(LVS_OWNERDRAWFIXED,0L);
m_list->SetExtendedStyle(LVS_EX_FULLROWSELET //整行选中
| LVS_EX_HEADERDARGDROP //允许整列拖动
| LVS_EX_GRIDLINES //画出网格线
| LVS_EX_FLATSB); // 扁平风格的滚动条
22. 取得当前获得焦点的窗口句柄
HWND hwnd = ::GetFocus();
int iID = :: GetDlgCtrlID(hwnd); // 根据句柄取得其资源符号
23. 修改控件的字体
CFont m_font;
m_font.CreateFont(-12,0,0,0,400,FALSE,FALSE,0,GB2312_SHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, VARIABLE_PITCH | FF_, “楷体_GB2312”);
//为想改变字体的控件改变
m_editPh.SetFont(&m_font, true);
void CMyTestDialog ::PeekMessageLoop() {
MSG msg;
while ( PeekMessage(&msg, NULL, NULL, NULL, NULL,NULL, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg); } }
Void CMyTestDialog :: WaitForThreadToTerminate( HANDLE hThread) {
//将指示哪个线程需要等待并作进一步处理
DWORD dwRet;
Do {
dwRet = :: MsgWaitForMultipleObject(1, &hThread, FALSE, INFINITE, QS_ALLINPUT);
if(dwRef != WAIT_OBJET_0) {
PeekMessageLoop(); }
}while ( (dwRet != WAIT_OBJET_0) && (dwRet != WAIT_FAILED));
//示例代码:假设对话框上有一个按钮,当点击按钮时,开始启动第二个线程,等到第
//二个线程完成后,我们再继续主线程:
void CMyTestDialog :: OnButton1() {
m_pUpdateThread = AfxBeginThread(UpdateDeviceContent, (LPVOID)this);
if(m_pUpdateThread) {
WaitForThreadToTerminate(m_pUpdateThread->m_hThread); }
//这里可以加入自己的执行代码
Do whatever you want after the action is finished. }
2. 改变列表框表头的颜色和字体,发送一个HDM_GETITEM消息
void CHeaderCtrlEx :: DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {
ASSERT(lpDrawItemStruct ->ctlType = =ODT_HEADER);
HDITEM hdi;
TCHAR lpBuffer[256];
Hdi.mask = HDI_TEXT;
Hdi.pszText = lpBuffer;
Hdi.uhTextMax = 256;
GetItem(lpDrawItemStruct->itemID,&hdi);
//画按钮框
:: DrawControl(lpDrawItemStruct->hdc, &lpDrawItemStruct->rcItem, DFC_BUTTOON, DFCS_BUTTONPUSH);
COLORREF crOldColor = :: SetTextColor(lpDrawItemStruct->hdc, RGB(255,255,0));
:: DrawText(lpDrawItemStruct->hdc, lpBuffer, strlen(lpBuffer), &lpDrawItemStruct->rcItem, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
:: SetTextColor(lpDrawItemStruct->hdc, crOldColor); }
3. 修改标题栏中“无标题-title”
① 修改“无标题”部分,重载文档中的虚函数SetTitle,加入:
CDocument:: SetTitle(”your title”);
② 修改后半部分:将字符串资源中的IDR_MAIN修改为
我的程序\n\nChange\n\n\nChangeTitle.Document\nChange Document
或者:在程序的任何地方调用如下语句:
(AfxGetMainWnd()) -> SetWindowText(“your title”);
③ 除去标题中间的”-“,可以通过重载CFramWnd类的OnUpdateTitle函数,这个函数在VC提供的帮助文件中找不到,必须手工添加:
virtual void OnUpdateTitle(BOOL NaDa);
void CMain :: OnUpdateTitle(BOOL NaDa) {
CString csAppName;
csAppName.Format(AFX_IDS_APP_TITLE);
SetWindowText(csAppName); }
//此时显示的结果只有字符串资源AFX_IDS_APP_TITLE 所定义的字符串
★ 另一种方法是在CMain的PreCreateWindow函数中修改的窗口风格:
BOOL CMain :: PreCreateWindow(CREATESTRUCT &cs) {
cs.style &= ~ (LONG)FWS_ADDTOTITLE;
return CWnd :: PreCreateWindow(cs); }
//使用此方法,窗口的标题只显示IDR_MAIN字符串中第一个\n之前的部分。
4. const的一些用法
int a=0;
const int* b=&a; [1] int const *b=&a;[2] const int* const b=&a; [3]
const char *p=”const”; [1] char const *p=”const”; [2] char const p=”const”; [4]
const char* const p=”const”; [4]
int a=0;
const int &b=a; [1] int const &b=a; [2] int & const b=a; [3] const int & const b=a; [4]
① 如果const位于星号左侧,则const用来修改指针所指向的变量,即指针指向的为不可变的;
② 如果const位于星号右侧,const就是修饰指针本身,即指针本身是不可变的;
③ [3]中指针本身是不可变的,而指针所指向的内容是可变的,这种情况下不能对指针本身进行更改操作,如b++是错误的;
④ [4]中指针本身和指向的内容均为常量
5. const作为参数用法
void fun0( const A *a) 在函数体中,按照const所修饰的部分进行常量化,如形参为const A* a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;
void fun1(const A& a) 形参为const A& a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。[注:参数const通常用于参数为指针或引用的情况]
const修饰返回值: const A fun2(); const A* fun3()
一般用const修饰返回值为对象本身(非引用和指针)的情况多用于二目操作符重载函数,并产生新的对象的时候。
[总结]: 一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。
6. 类成员函数中const的使用:一般放在函数体后void fun() const; 如果一个成员函数不会修改数据成员,那么最好将其声明为const,因为const成员函数中不允许对数据成员进行修改,如果修改,编译器会报错,大大提高了程序的健壮性。
7. 使用const的一些suggestioins:
① 要大胆地使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;
② 在参数中使用const应使用引用或指针,而不是一般的对象实例;
③ 要避免最一般的赋值操作错误,如将const变量赋值;
④ 不要轻易地将函数的返回类型定为cosnt;
⑤ 除了重载操作符外一般不要将返回值类型定为某个对象的const引用
8. 让应用程序只运行一个实例: 在App的InitInstance添加如下代码:
HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszAppName);
if(GetLastError() = = ERROR_ALREADY_EXISTS) { //信号量存在,则有一个在运行
CloseHandle(hSem); //关闭信号量句柄
// 寻找先前的实例窗口
HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(), GW_CHILD);
While(:: IsWindow(hWndPrevious)) { //检查窗口是否有预设的标记
if(::GetProp(hWndPrevious,m_pszAppName)) { //有,则寻找主窗口
if(:: IsIconic(hWndPrevious)) { //窗口最小化,则恢复其大小
::SetForegroundWindow(hWndPrevious); //将主窗口激活
::SetForgoundWindow(::GetLastActivePopup(hWndPrevious));
//将主窗口激活
::ShowWindow(hWndPrevious, SW_NORMAL);
reurn FALSE; } //退出本实例
hWndPrevious = :: GetWindow(hWndPrevious, GW_HWNDNEXT); //继续找 }
AfxMessageBox(“only one application program can run!”);
return FALSE; } }
1.获取本机的IP地址
#i nclude <stdio.h>
#i nclude <winsock2.h>
#pragma comment (lib, “ws2_32.lib”)
Void CheckIP() {
WSADATA wsadata;
Char name[155];
Char *ip;
PHOSTENT hostinfo;
If (WSAStartUp( MAKEWORD(2,0), &wsadate) = = 0) {
If ( gethostname( name, sizeof(name)) = = 0) {
If((hostinfo = gethostbyname(name)) != NULL) {//获得IP的函数
Ip = inet_ntoa(*(struct in_addr*)*hostinfo -> h_addr_list);
Printf*”%s\n”, ip); } }
WSACleanup(); } }
2. CWnd:: SetDlgItemInt(); 被对话框设定一个由字符串表示的整型值。
CSemaphore ---à CSyncObject------àCObject
在一个进程或多个进程中允许访问一种资源的允许线程数,CSemaphore对象维持当前获取一种指定资源的线程个数。当计数大于0时,Semaphore对象的状态是有信号状态;典型应用是用Semaphore去限制使用一种资源的线程个数。用WaitforSingleObject等待有信号状态,返回时则减少对Semaphore的计数。
3. 得到计算机所有驱动函数GetAllDriverList()
CString tmp = _T(“A:\\”), dir;
for(int i=1; i<=25; i++) {
dir = CString(‘A’+i)+ _T(“:\\”);
if(GetDriveType(dir.GetBuffer(0)) = = DRIVE_NO_ROOT_DIR) continue;
tmp += “;” + dir; }
return tmp;
4. 打开对话框,选择文件路径函数 OnBrowse()
BROWSEINFO bi;
char dispname[MAX_PATH], path[MAX_PATH];
ITEMIDLIST *pidl;
bi.hwndOwner = m_hWnd;
bi.pidlRoot = 0;
bi.pszDisplayName = dispname;
bi.ulFlags = BIF_RETUREONLYFSDIRS | BIF_EDITBOX | BIF_DONTGOBELOWDOMAIN;
bi.lpfn = 0;
bi.lParam = 0;
bi.iImage = 0;
if(pidl = SHBrowseForFolder(&bi)) { //显示一个使用用户可以选择的文件打开对话框
SHGetPathFromIDList(pidl, path); //把一个item identifier list转化为一个文件系统路径
m_folder = CString(path);
if(m_folder.IsEmpty() ) m_folder = GetAllDirverList();
UpdateData(FALSE); }
SHGetFileInfo(); 返回文件系统中对象的信息,比如文件、folder、路径、驱动器
5. 如何使用CImageList
CImageList m_iImageList;
m_iImageList.Create(24,24,TRUE,1,0);
HICON hIcon = NULL;
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_KEBIAO0, IMAGE_ICON,24,24,0);
m_iImageList.Add(hIcon);
m_FileTree.SetImageList(&m_iImageList, TVSIL_NORMAL); //m_FileTree为TreeList控件
//或者这样来创建:
m_imageList.DeleteImageList();
m_image.Create(16,16,ILC_COLORDDB,1,100);
m_listCtrl.SetImageList(&m_iImageList, LVSIL_SMALL);
6. 遍历一个文件夹的文件
OnFindFile(WPARAM wParam, LPARAM lParam) {
CString strFilePath = *((CString*)wParam);
if(strFilePath.Right(1) != “\\”) {
strFilePath +=”\\”; }
strFilePath += “*.*”;
CFileFind finder;
CString strFileName;
BOOL isHave = finder.FindFile(strFilePath);
while(isHave) {
isHave = finder.FindNextFile();
if(!finder.IsDirectory() && !finder.IsDots()) {
strFileName = finder.GetFilePath();
:: PostMessage((HWND)(GetMainWnd()->GetSafeHWnd()), WM_DISPLAY, (WPARAM)&strFileName, NULL); } }
finder.Close(); }
7. 如何来启动这个查找线程
新建一个类派生于CWinThread;CFindFileThread *pFindFileThread;
pFindFileThread = (CFindFileThread*)AfxBeginThread(RUNTIME_CLASS(CFindFileThread);
pFindFileThread -> PostThreadMessage(WM_FINDFILE, (WPARAM)&strFilePath,NULL);
8. 找到一个则发送消息WM_DISPLAY,并把文件中全路径作为参数返回
获取一个文件的信息 OnDisplay(WPARAM wParam, LPARAM lParam) {
count++; //统计文件个数
CString strFileName = *((CString*)wParam);
CFileStatus status;
C: GetStatus(strFileName, status);
CString unit = “Byte”;
float flen = (float)status.m_size;
if(flen>1024) {
flen /= 1024;
if(flen < 1024) unit = “KB”;
else {
flen /= 1024;
unit = “MB”; } }
CString size;
size.Format(“%1.2f”, flen);
int pos = strFileName.ReverseFind(‘\\’);
SHFILEINFO sfi; //文件信息结构体
if(:: SHGetFileInfo(strFileName, FILE_ATTRIBUTE_NORMAL, &sfi,
Sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES |
SHGFI_DISPLAYNAME | SHGFI_TYPENAME | SHGFI_ICON
| SHGFI_SMALLICON)) {
m_imgList.Add(sfi.hIcon);
m_filelist.InsertItem(count-1, sfi.szDisplayName, count-1);
m_filelist.SetItemText(count-1, 1, strFileName, Mid(0,pos));
m_filelist.SetItemText(count-1, 2, (size+unit));
m_filelist.SetItemText(count-1, 3, sfi.szTypeName); }
9. 在图片中隐藏信息的做法:加社会图片文件为c:\s.jpg, 文字为d:\w.txt, 在命令行方式窗口中输入命令 COPY /B C:\s.jpg + d:\w.txt c:\d.jpg
10. 获得应用程序所在路径
char szCurPath[_MAX_PATH];
HINSTANCE hInst = NULL;
GetMoudleFileName( hInst, szCurPath, _MAX_PATH); //获得应用程序所在路径
char *p = szCurPath;
while( strchr(p, ‘\\’)) {
p= strchr( p, ‘\\’);
p++; }
*p = ‘\0’;