




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
教你如何更好的掌握C++的基础2011-03-1616:59:131分类:默认分类I标签:it动态|字号订阅如何获取系统日期CTimetm=CTime::GetCurrentTime();CStringstrTime=tm.Format(_TEXT(^Y^M^d%H:%M:%S));MessageBox(strTime);动态分配二维数组int**array;array=newint*[col];if(array==0)exit(-1);for(inti=0;i<col;i++){array[i]=newint[row];if(array[i]==0)exit(-1);)〃释放for(i=0;i<col;i++){delete口array[i];}delete口array;如何定义一个二维字符串数组char**str="abcdef”;〃一维char*str[row][col]={ttabcM,Mcdf,ttefgw•.…};//rowxcol个将一个十六进制“FF“、“FA”等字符串数组等转化为十进制数组intarray[32][32];inta,b,n=0;intresultl;char*str;for(inti=0;iv32;i++)for(intj=0;j<32;j++){str=str[i]O];if(str[O]>=4&&str[1]>='A'){〃“AF”a=str[O]-W;b=resultl=(a+10)*16+(b+10)*1;}elseif(str[0]>=P&& v'A'){〃'A9”a=str[0]-lAT;b='A,-str[1]+1;resultl=(a+10)*16+b;}elseif(str[0]<'A'&&str[1]>='A'){〃'8B”a='A'-str[0]+1;b=str[1]-'A5;resultl=a*16+(b+10)*1;}else{ 〃“87”a=(A'-str[0]+1;b=W-str[1]+1;resultl=a*16+b;}array[i][j]=reslutl;printf("%5d”,array[i]0]);n++;if(n%32==0)printf("”n");}将这个矩阵数组在屏幕上显示:include<afxwin.h>include<afxext.h>include<afxdisp.h>include<afxdtctl.h>DWORDcolor_;HDChMyDC=GetDC(NULL);for(i=0;i<32;i++)for(j=0;j<32;j++){color_=array皿];color_=color_*256*256+color_*256+color_;SetPixel(hMyDC,j,i,colorJ;}将一个整型转化为一个字符串Jtoa〃将从位图信息头得到的图像宽度和高度显示出来charbuffer1[20],buffer2[20];_itoa(width,bufferl,10);Jtoa(height,buffer2,10);charstr[80];strcpy(str,"width=");strcat(str,bufferl);strcat(str,tt,hight=n;strcat(str,buffer2);AfxMesageBox(str,MB_OK,0);当把二维数组地址用作参数传递,而又耍此地址不断递增时,可以另外定义一个同类型指针,指向二维数组第一个元素的地址,把这个赋值放在循环外:unsignedchar*p;p=&m_plmage[O][O];然后在循环中,可以p+m_count*4096;改变最近打开文档的个数在Initlnstance()中的LoadStdProfileSetting(8);//括号里是要设置的个数打开调色板对话框CColorDialogdig;dlg.Domodal();如何添加工具栏,如何使用Slider?在OnlnitDialog()中添加:CSIiderCtrl*pSliderCtrl=(CSIiderCtrl*)GetDlgltem(IDC_SLIDER1);pSIiderCtrl->SetRange(0,255,TRUE);//设置滑动条的范围pSIiderCtrl->SetPos(100);//设置滑动条的初始位置在Dig类中响应WM_HSCROLL消息:CSIiderCtrl*pSliderCtrl=(CSIiderCtrl*)GetDlgltem(IDC_SLIDER1);m_nCur=pSIiderCtrl->GetPos();〃获得当前的位置值更改光标::SetCursor(::LoadCursor(NULL,IDC_SIZEALL));〃如果是自己定义的光标资源,则要用MAKEINTRESOURCE进行转化,例如:::SetCursor(::LoadCursor(NULL,IDC_CURSOR_CUT));设置文本显示的一些函数CDCdc(th⑸;CPenpen(PS_SOLID,2,#0000ff);〃初始化一支笔CBrush*pBush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));dc.SelectObject(pBrush);dc.SetTextColor(RGB(255,0,255));dc.SetBKMode(TRANSPARENT);//将文本背景设置为透明将对话框中的图像拷贝到剪贴板CWnd*pWnd=GetDlgltem(IDC_IMAGE_SELECT);WINDOWPLACEMENT*winPlacement;WinPlacement=newWINDOWPLACEMENT;pWnd->GetWindowPlacement(winPlacement);〃获得一个控件的位置CDC*dcTemp;dcTemp=newCCIientDC(FromHandle(m_hWnd));CDCmemDC;memDC.CreateCompatibleDC(dcTemp);〃创建一个兼容的DCCBitmapbm;CSizesz(IWidth,IHeight);bm.CreateCompatilbleBitmap(dcTemp,sz.cx,sz.cy);〃创建一个兼容的位图CBitmap*oldbm=memDC.SelectObject(&bm);memDC.BitBlt(O,0,sz.cx,sz.cy,deTemp,winPlacement->rcNormalPosition.left,WinPlacement->rcNormalPosition.top,SRCCOPY);pWnd->OpenClipboard();〃打开剪贴板,不用pWnd->GetParent()->OpenClipard();::EmptyClipard();::SetClipardData(CF_BITMAP,bm.m_hObject);〃粘贴到剪贴板CloseClipard();memDC.SelcetObject(oldbm);deletedeTemp;VC里获取一个文件夹路径BROWSEINFObi;TCHARszDisplayName[MAX_PATH];LPITEMIDLISTpidl;LPMALLOCpMalloc=NULL;ZeroMemory(&bi,sizeof(bi));bi.hWndOwner=GetSafeHwnd();bih.pszDisplayName=szDisplayName;bi.lpszTitle=TEXT(uPleaseselectafolder:");bi.ulFlags=BIF_RETURNONLYFSDIRS;Pidl=SHBrowseForFolder(&bi);if(pidl){SHGetPathFromlDList(pidl,szDisplayName);sPath=szDisplayName;MessageBox(sPath);}如何设置密码输入时显示的是*号#include<iostream.h>#include<conio.h>chara[8];voidmain(){inti=0;Coutvv”请输入密码:"vvendl;while(1){a[i]=getch();if(i>=8||a[i]==13)break;putchC*');i++;}cout«endl«a«endl;getch();}设置菜单:可以使用CMenu::EnableMenultem()来设置菜单可用或禁用,但是在MFC中,要使该函数起作用,需要将CWnd::m_bAutomenuEnable设置为FALSE.关闭子窗口::SendMessage(::AfxGetMainWnd()->m_hWnd,WM_COMMAND,ID_FILE_CLOSE,0);获取主窗口的指针CWinThread::m_pMainWnd调用AfxGetMainWnd()可实现继续上面的总结〜!Tomakingitcount〜!。。。。。。获取CMain类的指针CMain*pApp=((CMain*)AfxGetApp()->m_pMainWnd);ASSERT_KINDOF(CMain,pAPP);〃确保pAPP是CMain的类科象VC++如何获取应用程序的实例句柄实例句柄保存在CWinAppm_hInstance中HANDLEhInstance=AfxGetlnstanceHandle();VC++怎样加载其他的应用程序三个SDK函数WinExec,ShellExecute,CreateProcess.WinExec最简单,前一个指定路径,后一个指定显示方式;ShellExecute(null,null,_T("1.txt"),NULL,_T(uc:",'temp,,)JSW_SHOWNORMAL);STARTUPINFOstinfo;〃启动窗口的信息PROCESSINFOproinfo;〃进程的信息CreateProcess(NULL,_T(unotepad.exe)M,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&stinfo,&proinfo);如何确定顶层菜单所占据的菜单行数:首先,计算主窗口的高度和客户区高度;其次,从主框窗口的高度中减去客户区、框边界以及标题的高度;最后,除以菜单栏的高度CRectrc,rcClient;GetWindowRect(rc);GetClientRect(rcClient);IntmenuHeight;menuHeight=(rc.Height()-rcClicent.Height()-::GetSystemMetrics(SM_CYCAPTION)-::GetSystemMetrics(SM_CY)*2))-/::GetSystemMetrics(SM_CYMENU);响应下拉菜单的消息为ON_CBN_SELECTDOK(ID_TOOL_ZOOM,OnSelectZoomed)设置工具栏的标题m_wndTestBar.SetWindowText(uyourtoolbartitle11);如何获得应用程序主窗口的指针CWndpMainWnd=AfxGetApp()->m_pMainWnd;CMain*pMain=((CMain*)pMainWnd;CRectrect;CWnd*pParent=AfxGetApp()->GetMainWnd();pParent・>GetWindowRect(&rect);〃得至ij应用程序窗口矩形〃移到窗口pParent->MoveWindow(rect.left,rect.top,rect.Width()+1,rect.Height()+1,TRUE);获得获得子窗口CMDIChildWnd*pChild=(CMDIChildWnd*)GetActive();〃或:CMDIChildWnd*pChild=MDIGetActive();获得活动子窗口的活动视图CMyView*pView=(CMyView*)pChild->GetActiveView();获取当前窗口的指针CWnd::GetForegoundWindow();从句柄转换到指针HWNDhwnd;hwnd=::FindWindow(NULL,MTESTn);CWnd*pWnd=FromHandle(hwnd);怎样改变进度条控件的颜色,发送消息m_progress.SendMessage(PBM_SETBKCOLOR,0,#ffOOOO);〃背景色m_progress.SendMessage(PBM_SETBARCOLOR,0,#OOffOO);〃前景色定义charnum[10];sprintf(num,M%dM,calnum);〃格式化数字charunit。』矩形";sprintf(num,u%sn,unit);〃格式化字符串改变字符串的显示字体和大小CFontfont;fom.CreatePointFont(300,“华文行楷”,NULL);CFont*pOldFont=dc.SelectObject(&font);dc.SelectObject(pOldFont);将路径中的单”“变为“向CMyDoc*pDoc=GetDocument();CStringreportPath=pDoc->strPathName;intlentemp=reportPath.GetLength();reportPath=reportPath.Left(lentemp-4);intlenpath=reportPath.GetLength();for(inti=0;i<lenpath-1;){if(reportpath.GetAt(i)==*){reportpath.Insert(i,i+=2;}i++;)获取屏幕分辨率HDChSrcDC;hSrcDC=::GetDC(AfxGetApp()->mj)MainWnd->GetSafeHwnd());intxSrc,ySrc;xSrc=GetDeviceCaps(hSrcDC,HORIRES);〃水平分辨率ySrc=GetDeviceCaps(hSrcDC,VERTRES);〃垂直分辨率让Edit控件响应回车键:利用获取消息来完成,调用虚函数PreTranslateMessage(MSG*pMsg){lf(pMsg->message==WM_KEYDOWN){switch(pMsg->wParam){caseVK_RETURN:GetDlgltem(IDC_BTN_INPUT)->SendMessage(BM_CLICK,0,0);改变对话框的背景色:在HtlnstanceO中加入SetDialogBKColor(#a0b4dc,#ffOOOO);〃后面是字体颜色让指定的矩形框重画lnvalidateRect(&rect,TRUE);怎样选择所选的List当前位置intiTem;POSITIONpos=m_findCtrl.GetFirstSelectedltemPosition();if(pos==0){MessageBox("请选择需要删除的记录");return;}else{iTem=m_findCtrl.GetNextSelectedltem(pos);}〃删除List中的某行m_findCtrl.DeleteItem(iTem);m_findCtrLUpdate(iTem);动态创建控件CEditm_edit;CRectrect(0,0,100,200);M_edit.Create(WS_CHILD|ES_AUTOHCROLL|WS_BORDER,rect,this,ID_EDIT_1);列表控件的应用CListCtrl*m_list;CRectrectjist;this->GetCientRect(&rect_list);rectjist.top+=100;mjist->Create(WS_CHILD|LVS_REPORT|WS_BORDER|LVS_SINGLESEL,rectjist,this,ID_TABLIST);this->m」ist->ModifyStyle(LVS_EDITABELS,OL);〃禁止标题编辑m」ist->ModifyStyle(OL,LVS_REPORT);//设置为Report类型m」ist->ModifyStyle(OL,LVS_SHOWSELALWAYS);//始终高亮显示被选中的表项m」ist->ModifyStyle(OL,LVS_NOSORTHEADER);〃禁止标题编辑m_list->SetBkColor(#00c8c8);〃设置背景颜色m」ist->SetTextBkColor(#00c8c8);〃设置文本背景颜色m_list->ModifyStyle(LVS_OWNERDRAWFIXED,OL);m」ist->SetExtendedStyle(LVS_EX_FULLROWSELET〃整行选中|LVS_EX_HEADERDARGDROP〃允许整列拖动|LVS_EX_GRIDLINES〃画出网格线ILVS_EX_FLATSB);//扁平风格的滚动条取得当前获得焦点的窗口句柄HWNDhwnd=::GetFocus();intilD=::GetDlgCtrllD(hwnd);//根据句柄取得其资源符号修改控件的字体CFontm_font;mJont.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);如何暂停主线程直到第二个线程的终止?voidCMyTestDialog::PeekMessageLoop(){MSGmsg;while(PeekMessage(&msg,NULL,NULL,NULL,NULL.NULL,PM_REMOVE))TranslateMessage(&msg);DispatchMessage(&msg);}}VoidCMyTestDialog::WaitForThreadToTerminate(HANDLEhThread){〃将指示哪个线程需要等待并作进一步处理DWORDdwRet;Do{dwRet=::MsgWaitForMultipleObject(1,&hThread,FALSE,INFINITE,QS_ALLINPUT);if(dwRef!=WAIT_OBJET_0){PeekMessageLoop();}Jwhile((dwRet!=WAIT_OBJET_0)&&(dwRet!=WAIT_FAILED));〃示例代码:假设对话框上有一个按钮,当点击按钮时,开始启动第二个线程,等到第〃二个线程完成后,我们再继续主线程:voidCMyTestDialog::OnButton1(){m_pUpdateThread=AfxBeginThread(UpdateDeviceContent,(LPVOID)this);if(m_pllpdateThread){WaitForThreadToTerminate(mjDUpdateThread->m_hThread);}〃这里可以加入自己的执行代码Dowhateveryouwantaftertheactionisfinished.}改变列表框表头的颜色和字体,发送一个HDM_GETITEM消息voidCHeaderCtrlEx::Drawltem(LPDRAWITEMSTRUCTIpDrawltemStruct){ASSERT(IpDrawltemStruct->ctlType==ODT_HEADER);HDITEMhdi;TCHARlpBuffer[256];Hdi.mask=HDI_TEXT;Hdi.pszText=IpBuffer;Hdi.uhTextMax=256;Getltem(lpDrawltemStruct->itemlD,&hdi);〃画按钮框::DrawControl(lpDrawltemStruct->hdc,&lpDrawltemStruct->rcltem,DFC_BUTTOON,DFCS_BUTTONPUSH);COLORREFcrOldColor=::SetTextColor(lpDrawltemStruct->hdc,#ffffOO);::DrawText(lpDrawltemStruct->hdc,IpBuffer,strlen(lpBuffer),&lpDrawltemStruct->rcltem,DT_SINGLELINE|DT_VCENTER|DT_CENTER);::SetTextColor(lpDrawltemStruct->hdc,crOldColor);}修改标题栏中“无标题-title”修改“无标题”部分,重载文档中的虚函数SetTitle,加入:CDocument::SetTitle("yourtitle");修改后半部分:将字符串资源中的IDR_MAIN修改为我的程序"rTnChange”rTn”nChangeTitle.Document"nChangeDocument或者:在程序的任何地方调用如下语句:(AfxGetMainWnd())->SetWindowText(uyourtitleM);除去标题中间的。“,可以通过重载CFramWnd类的OnUpdateTitle函数,这个函数在VC提供的帮助文件中找不到,必须手工添加:virtualvoidOnUpdateTitle(BOOLNaDa);voidCMain::OnllpdateTitle(BOOLNaDa){CStringcsAppName;csAppName.Format(AFX_IDS_APP_TITLE);SetWindowText(csAppName);}〃此时显示的结果只有字符串资源AFX_IDS_APP_TITLE所定义的字符中★ 另一种方法是在CMain的PreCreateWindow函数中修改的窗口风格:BOOLCMain::PreCreateWindow(CREATESTRUCT&cs){cs.style&=-(LONG)FWS_ADDTOTITLE;returnCWnd::PreCreateWindow(cs);}〃使用此方法,窗口的标题只显示IDR_MAIN字符串中第一个“n之前的部分。((CMainFram*)AfxGetMainWnd())->SetWindowText("****H);放在App类的lnitlnstance()函数里面const的一些用法inta=0;constint*b=&a;[1]intconst*b=&a;[2]constint*constb=&a;[3]constchar*p="const";[1]charconst*p=nconstM;[2]charconstp=*,constn;[4]constchar*constp=nconstn;[4]inta=0;constint&b=a;[1]intconst&b=a;[2]int&constb=a;[3]constint&constb=a;[4]如果const位于星号左侧,则const用来修改指针所指向的变量,即指针指向的为不可变的;如果const位于星号右侧,const就是修饰指针本身,即指针本身是不可变的;[3]中指针本身是不可变的,而指针所指向的内容是可变的,这种情况下不能对指针本身进行更改操作,如b++是错误的:[4]中指针本身和指向的内容均为常量const作为参数用法voidfunO(constA*a)在函数体中,按照const所修饰的部分进行常量化,如形参为constA*a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;voidfun1(constA&a)形参为constA&a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。[注:参数const通常用于参数为指针或引用的情况]const修饰返回值:constAfun2();constA*fun3()一般用const修饰返回值为对象本身(非引用和指针)的情况多用于二目操作符市载函数,并产生新的对象的时候。[总结]:一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。.类成员函数中const的使用:一般放在函数体后voidfun()const;如果一个成员函数不会修改数据成员,那么最好将其声明为const,因为const成员函数中不允许对数据成员进行修改,如果修改,编译器会报错,大大提高了程序的健壮性。.使用const的一些suggestioins:①要大胆地使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;②在参数中使用const应使用引用或指针,而不是一般的对象实例;③要避免最一般的赋值操作错误,如将const变量赋值;④不要轻易地将函数的返回类型定为cosnt;⑤ 除了重载操作符外一般不要将返回值类型定为某个对象的const引用8.让应用程序只运行一个实例:在App的Initlnstance添加如下代码:HANDLEhSem=CreateSemaphore(NULL,1,1,m_pszAppName);if(GetLastError()==ERROR_ALREADY_EXISTS){〃信号量存在,则有一个在运行CloseHandle(hSem);〃关闭信号量句柄//寻找先前的实例窗口HWNDhWndPrevious=::GetWindow(::GetDesktopWindow(),GWCHILD);While(::IsWindow(hWndPrevious)){〃检查窗口是否有预设的标记if(::GetProp(hWndPrevious,m_pszAppName)){〃有,则寻找主窗口if(::Islconic(hWndPrevious)){〃窗口最小化,则恢复其大小::SetForegroundWindow(hWndPrevious);〃将主窗口激活::SetForgoundWindow(::GetLastActivePopup(hWndPrevious));〃将主窗口激活::ShowWindow(hWndPrevious,SW_NORMAL);reurnFALSE;}〃退出本实例hWndPrevious=::GetWindow(hWndPrevious,GWJHWNDNEXT);//继续找}AfxMessageBox(Honlyoneapplicationprogramcanrun!”);returnFALSE;}}1.获取本机的IP地址#include<stdio.h>#include<winsock2.h>#pragmacomment(lib,"ws2_32.lib”)VoidChecklP(){WSADATAwsadata;Charname[155];Char*ip;PHOSTENThostinfo;If(WSAStartUp(MAKEWORD(2,0),&wsadate)==0){If(gethostname(name,sizeof(name))==0){lf((hostinfo=gethostbyname(name))!=NULL){〃获得IP的函数Ip=inet_ntoa(*(structin_addr*)*hostinfo->h_addr_list);Printf*n%s,,nn,ip);}}WSACIeanup();}}2.CWnd::SetDlgltemlnt();被对话框设定一个由字符串表示的整型值。CSemaphore—aCSyncObject aCObject在一个进程或多个进程中允许访问一种资源的允许线程数,CSemaphore对象维持当前获取•种指定资源的线程个数。当计数大于0时,Semaphore对象的状态是有信号状态;典型应用是用Semaphore去限制使用种资源的线程个数。用W典tforSingleObject等待有信号状态,返回时则减少对Semaphore的计数。.得到计算机所有驱动函数GetAIIDriverList()CStringtmp=_T(uA:,),dir;for(inti=1;i<=25;i++){dir=CString('A'+i)+_Tif(GetDriveType(dir.GetBuffer(O))==DRIVE_NO_ROOT_DIR)continue;tmp+=+dir;}returntmp;.打开对话框,选择文件路径函数OnBrowse()BROWSEINFObi;chardispname[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.ilmage=0;if(pidl=SHBrowseForFolder(&bi)){〃显示一个使用用户可以选择的文件打开对话框SHGetPathFromlDList(pidl,path);〃把一个itemidentifierlist转化为一个文件系统路径m_folder=CString(path);if(m_folder.lsEmpty())mjolder=GetAIIDirverList();UpdateData(FALSE);}SHGetFilelnfo();返回文件系统中对象的信息,比如文件、folder、路径、驱动器.如何使用ClmageListClmageListmJImageList;mJlmageList.Create(24,24,TRUE,1,0);HICONhlcon=NULL;hlcon=(HICON)::Loadlmage(::AfxGetlnstanceHandle(),MAKEINTRESOURCE(IDI_KEBIAOO,IMAGEJCON.24,24,0);mJlmageList.Add(hlcon);m_FileTree.SetlmageList(&m_ilmageList,TVSIL_NORMAL);//m_FileTree为TreeList控件〃或者这样来创建:m_imageList.DeletelmageList();m_image.Create(16,16,ILC_COLORDDB,1,100);m_listCtrl.SetlmageList(&m_ilmageList,LVSIL_SMALL);.遍历•个文件夹的文件OnFindFile(WPARAMwParam,LPARAMIParam){CStringstrFilePath=*((CString*)wParam);if(strFilePath.Right(1)!="""”){strFilePath+='";}strFilePath+="*「';CFileFindfinder;CStringstrFileName;BOOLisHave=finder.FindFile(strFilePath);while(isHave){isHave=finder.FindNextFile();if(!finder.lsDirectory()&&!finder.lsDots()){strFileName=finder.GetFilePath();::PostMessage((HWND)(GetMainWnd()->GetSafeHWnd()),WM_DISPLAY,(WPARAM)&strFileName,NULL);}}finder.Close();}.如何来启动这个查找线程新建一个类派生于CWinThread:CFindFileThread*pFindFileThread;pFindFileThread=(CFindFileThread*)AfxBeginThread(RUNTIME_CLASS(CFindFileThread);pFindFileThread->PostThreadMessage(WM_FINDFILE,(WPARAM)&strFilePath,NULL);.找到一个则发送消息WM_DISPLAY,并把文件中全路径作为参数返回获取一个文件的信息OnDisplay(WPARAMwParam,LPARAMIParam){count++;〃统计文件个数CStringstrFileName=*((CString*)wParam);CFileStatusstatus;C:GetStatus(strFileName,status);CStringunit="Byte”;floatflen=(float)status.m_size;if(flen>1024){flen/=1024;if(flen<1024)unit=uKBn;else{flen/=1024;unit="MB”;}}CStringsize;size.Format(M%1.2fM,flen);intpos=strFileName.ReverseFind(t"n,);SHFILEINFOsfi;〃文件信息结构体if(::SHGetFilelnfo(strFileName,FILE_ATTRIBUTE_NORMAL,&sfi,Sizeof(SHFILEINFO),SHGFI_USEFILEATTRIBUTES|SHGFI_DISPLAYNAME|SHGFI_TYPENAME|SHGFI_ICON|SHGFI_SMALLICON)){mJmgList.Add(sfi.hlcon);m_filelist.lnsertltem(count-1,sfi.szDisplayName,count-1);m_filelist.SetltemText(count-1,1,strFileName,Mid(0,pos));m_filelist.SetltemText(count-1,2,(size+unit));m_filelist.SetltemText(count-1,3,sfi.szTypeName);}m_filelist.Update(count-1);}.在图片中隐藏信息的做法:加社会图片文件为c:"s.jpg,文字为d:"w.txt,在命令行方式窗口中输入命令COPY/BC:"s.jpg+d:nw.txtc:”d.jpg.获得应用程序所在路径charszCurPathLMAX_PATH];HINSTANCEhlnst=NULL;GetMoudleFileName(hlnst,szCurPath,_MAX_PATH);〃获得应用程序所在路径char*p=szCurPath;while(strchr(p,)){p=strchr(p,P++;}*p="'O';ShellExecute(NULL,NULL,_T(uYour.exen),NULL,_T(szCurPath),SW_SHOWNORMAL);总结问题的解决方法,有助于获得更多的实战经验,不断地积累,在编程方面就会有长足的进步〜!学习的过程是一个不断积累的过程,只有学习的时间累积到一定的程度,才能发生质的提高。。。(1)如何通过代码获得应用程序主窗口的指针?主窗口的指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。AfxGetMainWndO->ShowWindow(SW_SHOWMAXMIZED)〃使程序最大化.(2)确定应用程序的路径UseGetModuleFileName获得应用程序的路径,然后去掉可执行文件名。Example:TCHARexeFullPath[MAX_PATH]//MAX_PATH在API中定义了吧,好象是128GetModuleFileName(NULL,exeFullPath,MAX_PATH)(3)如何在程序中获得其他程序的图标?两种方法:SDK函数SHGetFilelnfo或使用ExtractIcon获得图标资源的handle,SDK函数SHGetFilelnfo获得有关文件的很多信息,如大小图标,属性,类型等.Example(1):在程序窗口左上角显示NotePad图标.voidCSampleView:OnDraw(CDC*pDC)(if(::SHGetFilelnfo(_T(,,c:",'pwin95',,'notepad.exe,'),0,&stFilelnfo,sizeof(stFilelnfo),SHGFI_ICON))(pDC->Drawlcon(10,10,stFilelnfo.hlcon)}}Example(2):同样功能,UseExtracticonFunctionvoidCSampleView::OnDraw(CDC*pDC){HICONhlcon=::Extractlcon(AfxGetlnstanceHandle(),_T("NotePad.exe"),。)if(hlcon&&hlcon!=(HICON)-1)pDC->Drawlcon(10,10.hlcon))说明:获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到,如果是调用win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点.(4)获得各种目录信息Windows目录:Use"GetWindowsDirectory"Windows下的system目录:Use"GetSystemDirectory"temp目录:Use"GetTempPath"当前目录:Use"GetCurrentDirectory"请注意前两个函数的第一个参数为目录变量名,后一个为缓冲区后两个相反.(5)如何自定义消息1)手工定义消息,可以这么写#defineWM_MY_MESSAGE(WM_USER+100),MS推荐的至少是WM_USER+100(2)写消息处理函数,用WPARAM.LPARAM返回LRESULT.LRESULTCMainFrame::OnMyMessage(WPARAMwparam.LPARAMIParam)(temp目录:Use"GetTempPath"〃加入你的处理函数irectory")(6)如何改变窗口的图标?向窗口发送WM_SECTON消息。Example:HICONhlcon=AfxGetApp()->Loadlcon(IDI_ICON)ASSERT(hlcon)AfxGetMainWnd()->SendMessage(WM_SECTION,TRUE,(LPARAM)hlcon)(7)如何改变窗口的缺省风格?前载CWnd::PreCreateWindow并修改CREATESTRUCT结构来指定窗口风格和其他创建信息.Example:Delete"Max"ButtonandSetOriginalWindow'sPositionandSizeBOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs)(cs.style&=-WS_MAXINIZEMOXcs.x=cs.y=0cs.cx=GetSystemMetrics(SM_CXSCREEN/2)cs.cy=GetSystemMetrics(SM_CYSCREEN/2)returnCMDIFramewnd::PreCreateWindow(cs)}(8)如何将窗口居中显示?CallFunctionCWnd::CenterWindowsExample(1):CenterWindow()//Relativetoit'sparent//RelativetoScreenExample(2):CenterWindow(CWnd::GetDesktopWindow())//RelativetoApplication'sMainWindowAfxGetMainWnd()->CenterWindow()(9)如何让窗口和MDI窗口一启动就最大化和最小化?先说窗口。在InitStance函数中设定m_nCmdShow的取值.m_nCmdShow=SW_SHOWMAXMIZED〃最大化m_nCmdShow=SW_SHOWMINMIZED〃最小化m_nCmdShow=SW_SHOWNORMAL〃正常方式MDI窗口:如果是创建新的应用程序,可以用MFCAppWizard的Advanced按钮并在MDI子窗口风格组中检测最大化或最小化还可以重载MDIWindow的PreCreateWindow函数,设置WS_MAXMIZEorWS_MINMIZE如果从CMDIChildWnd派生,调用OnlNtialUpdate函数中的CWnd::ShowWindow来指定MDIChildWindow的风格。(10)如何限制窗口的大小?也就是FixedDialog形式。Windows发送WM_GETMAXMININFO消息来跟踪,响应它,在OnGetMAXMlNINFO中写代码:(11)如何使窗口不可见?很简单,用SWJHIDE隐藏窗口,可以结合FindWindow,ShowWindow控制.(12)如何创建一个字回绕的CEditView重载CWnd::PreCreateWindow和修改CREATESTRUCT结构,关闭CEditView对象的ES_AUTOHSCROLL和WS_HSCROLL风格位,由于CEditView::PreCreateWindow显示设置cs.style.调用基类函数后要修改cs.style»BOOLCSampleEDitView::PreCreateWindow(CREATESTRUCT&cs){//Firstcallbasseclassfunction.BOOLbResutl=CEditView::PreCreateWindow(cs)//Nowspecifythenewwindowstyle.cs.style&=~(ES_AUTOHSCROLLIWS_HSCROLL)returnbResult)(13)如何使程序保持极小状态?这么办:在恢复程序窗体大小时,Windows会发送WM_QUERY-OPEN消息,用ClassWizard设置成员函数OnQueryOpen(),addfollowingcode:BoolCMainFrame::OnQueryOpen()(Returnfalse)(14)移动窗口CWnd::SetWindowPosSWP_NOSIZE 目的位置与父窗口有关(顶层窗口与屏幕有关)。调用CWnd::MoveWindow时必须要指定窗口的大小。//Movewindowtopositoin100,100ofitsparentwindow.SetWindowPos(NULL,100,100,0,0,SWP_NOSIZEISWP_NOAORDER)(15)通用控件的显示窗口MFC提供了几个CView派生的视窗类,封装了通用控件的功能,但仍然使用工作框文档显示窗口体系结构:CEditView封装了编辑控件,CTreeView保持了树列表控件,CListView封装了列表显示窗口控件,CRichEditView可以处理多种编辑控件。(16)重置窗口的大小调用CWnd::SetWindowPos并指定SWP_NOMOVE标志,也可调用CWnd::MoveWindow但必须指定窗口的位置。//Getthesizeofthewindow.CrectreWindowGetWindowRect(reWindow)//Makethewindowtwiceaswideandtwiceastall.SetWindowPos(NULL,0,0,reWindow.Width()*2,reWindow.Height()*2,SWP_NOMOVEISWP_NOZORDER)(17)如何单击除了窗口标题栏以外的区域使窗口移动当窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息,可以处理该信息使Windows认为鼠标在窗口标题上。对于对话框和基于对话的应用程序,可以使用ClassWizard处理该信息并调用基类函数,如果函数返回HTCLIENT则表明鼠标在客房区域,返回HTCAPTION表明鼠标在Windows的标题栏中。UINTCSampleDialog::OnNcHitTest(Cpointpoint){UINTnHitTest=Cdialog::OnNcHitTest(point)return(nHitTest==HTCLIENT)?HTCAPTION:nHitTest)上述技术有两点不利之处,其一是在窗口的客户区域双击时,窗口将极大;其二,它不适合包含几个视窗的主框窗口。还有一种方法,当用户按下鼠标左键使主框窗口认为鼠标在其窗口标题匕使用ClassWizard在视窗中处理WM_LBUTTODOWN信息并向主框窗口发送一个WM_NCLBUTTONDOWN信息和一个单击测试HTCAPTION.voidCSampleView::OnLButtonDown(UINTnFlags,Cpointpoint)(CView::OnLButtonDow(nFlags,pont)//Foolframewindowintothinkingsomeneclickedonitscaptionbar.GetParentFrame()—>PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(poitn.x,point.y))}该技术也适用于对话框和基于对的应用程序,只是不必调用CWnd::GetParentFrame。voidCSampleDialog::OnLbuttonDown(UINTnFlags,Cpointpoint)(Cdialog::OnLButtonDow(nFlags,goint)//Fooldialogintothinkingsimeoneclickedonitscaptionbar.PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARM(point.x,point.y))}(18)如何改变视窗的背景颜色Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用ClassWizard重载该消息的缺省处理程序来擦除背景(实际是画),并返回TRUE以防止Windows擦除窗口。//Paintareathatneedstobeerased.BOOLCSampleView::OnEraseBkgnd(CDC*pDC)(//Createapruplebrush.CBrushBrush(RGB(128,0,128))//Selectthebrushintothedevicecontext.CBrush*pOldBrush=pDC->SelcetObject(&brush)//Gettheareathatneedstobeerased.CRectreClippDC一>GetCilpBox(&rcClip)//Paintthearea.pDC—>PatBIt(rcClip.left,rcClip.top,rcClip.Width(),rcClip.Height(),PATCOPY)//Unselectbrushoutofdevicecontext.pDC一>SelectObject(pOldBrush)//Returnnonzerotohalffrutherprocessing.returnTRUE}(19)如何改变窗口标题调用CWnd::SetWindowText可以改变任何窗口(包括控件)的标题。//Settitleforapplication'smainframewindow.AfxGetMainWnd()—>SetWindowText(_T(nApplicationtitle"))//SettitleforView'sMDIchildframewindow.GetParentFrame()—>SetWindowText(”_T(nMDIChildFramenewtitle'*))//Settitlefordialog'spushbuttoncontrol.GetDigitem(IDC_BUTTON)—>SetWindowText(_T("Buttonnewtitle"))如果需要经常修改窗口的标题(注:控件也是窗口),应该考虑使用半文档化的函数AfxSetWindowTexto该函数在AFXPRMH中说明,在WINUTIL.CPP中实现,在联机帮助中找不到它,它在AFXPRIV.H中半文档化,在以后发行的MFC中将文档化。AfxSetWindowText的实现如卜.:voikAFXAPIAfxSetWindowText(HWNDhWndCtrl,LPCTSTRIpszNew)(itnnNewLen=Istrlen(Ipaznew)TCHARszOld[256]//fastchecktoseeiftextreallychanges(reducesflashinthecontrols)if(nNewLen>_contof(szOld)II::GetWindowText(hWndCrtl,szOld,_countof(szOld)!=nNewLenIIIstrcmp(szOld,IpszNew)!=0(//changeit::SetWindowText(hWndCtrl,IpszNew)})(20)如何防止主框窗口在其说明中显示活动的文档名创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位,如果不希望在说明中自动添加文档名,必须禁止该风格位,可以使用ClassWizard甫置CWnd::PreCreateWindow并关闭FWS_ADDTOTITLE风格。BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){//TurnoffFWS_ADDTOTITLEinmainframe.cs.styel&=~FWS_ADDTOTITLEreturnCMDIFrameWnd::PreCreateWindow(cs))关闭MDI子窗口的FWS_ADDTOTITLE风格将创建一个具有空标题的窗口,可以调用CWnd::SetWindowText来设置标题。记住自己设置标题时要遵循接口风格指南。(21)如何获取有关窗口正在处理的当前消息的信息调用CWnd::GetCurrentMessage可以获取•个MSG指针、例如,可以使用ClassWizard将儿个菜单项处理程序映射到一个函数中,然后调用GetCurrentMessage来确定所选中的菜单项。viodCMainFrame::OnCommmonMenuHandler(){//Displayselectedmenuitemindebugwindow.TRACE("Menuitem%uwasselected."n",(22)如何在代码中获取工具条和状态条的指针缺省时,工作框创建状态条和工具条时将它们作为主框窗口的子窗口,状态条有一个AFX_IDW_STATUS_BAR标识符,工具条有一个AFX_IDW_TOOLBAR标识符,下例说明了如何通过一起调用CWnd::GetDescendantWindow和AfxGetMainWnd来获取这些子窗口的指针://Getpointertostatusbar.CStatusBar*pStatusBar=(CStatusBar*)AfxGetMainWnd()—>GetDescendantWindow(AFX_IDW_STUTUS_BAR)//Getpointertotoolbar.CToolBar*pToolBar=(CToolBar*)AfxGetMainWnd()—>GetDescendantWindow(AFXJDW_TOOLBAR)(23)如何使能和禁止工具条的工具提示如果设置了CBRS_TOOLTIPS风格位,工具条将显示工具提示,要使能或者禁止工具提示,需要设置或者清除该风格位。卜.例通过调用CContro旧ar::GetBarStyle和CControlBar::SetBarStyle建立一个完成此功能的成员函数:voidCMainFrame::EnableToolTips(BOOLbDisplayTips){ASSERT_VALID(m_wndToolBar)DWORDdwStyle=mwndToolBar.GetBarStyle()if(bDisplayTips)dwStyleI=CBRS_TOOLTIPSelsedwStyle&=~CBRS_TOOLTIPSm_wndToolBar.SetBarStyle(dwStyle)(24)如何创建一个不规则形状的窗口可以使用新的SDK函数SetWindowRgno该函数将绘画和鼠标消息限定在窗口的一个指定的区域,实际上使窗口成为指定的不规则形状。使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删除所在的缺省控件、标题以及边界。给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。ClassCRoundDIg:publicCDialog{private:Crgnmrgn://windowregion}修改OnlnitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给窗口:BOOLCRoundDIg::OnlnitDialog()(CDialog::OnlnitDialog()//Getsizeofdialog.CRectrcDialogGetClientRect(rcDialog)//Createregionandassigntowindow.m_rgn.Create曰lipticRgn(0,0,rcDialog.Width(),rcDialog.Height())SetWindowRgn(GetSafeHwnd(),(HRGN)m_rgn,TRUE)returnTRUE}通过建立区域和调用SetWindowRgn,已经建立一个不规则形状的窗口,下面的例子程序是修改OnPaint函数使窗口形状看起来象一个球形体。voikCRoundDIg::OnPaint()(CPaintDCde(this)//devicecontextforpainting//drawellipsewithoutanyborderde.SelecStockObject(NULL_PEN)//gettheRGBcolourcomponentsofthespherecolorCOLORREFcolor=RGB(0,0,255)BYTEbyRed=GetRValue(color)BYTEbyGreen=GetGValue(color)BYTEbyBlue=GetBValue(color)//getthesizeoftheviewwindowCrectrectGetClientRect(rect)//getminimunnumberofunitsintnllnits=min(rect.right,rect.bottom)//calculatehehoriaontalandverticalstepsizefloatfltStepHorz=(float)rect.right/nUnitsfloatfltStepVert=(float)rect.bottom/nUnitsintnEllipse=nllnits/3//calculatehowmanytodrawintnlndex//currentellipsethatisbeingdrawCBrushbrush//burshusedforellipsefillcolorCBrush*pBrushOld//previousbrushthatwasselectedintode//drawellipse,graduallymovingtowardsupper-rightcornerfor(nlndex=0nlndes<+nEllipsenlndes++)(//creatsolidbrushbrush.CreatSolidBrush(RGB(((nlndex*byRed)/nEllipse).((nlndex*byGreen)/nEllipse),((nlndex*byBlue)/nEllipse)))//selectbrushintodepBrushOld=de.SelectObject(&brhsh)//drawellipsede.Ellipse((int)fltStepHorz*2,(int)fltStepVert*nlndex,rect.right-((int)fltStepHorz*nlndex)+1,rect.bottom-((int)fltStepVert*(nlndex*2))+1)//deletethebrushbrush.DelecteObject()}}最后,处理WM_NCHITTEST消息,使当击打窗口的任何位置时能移动窗口。UINTCRoundDIg::OnNchitTest(Cpointpoint)//Letusermovewindowbyclickignanywhereonthewindow.UINTnHitTest=CDialog::OnNcHitTest(point)rerurn(nHitTest==HTCLIENT)?HTCAPTION:nHitTest)(25)如何获取应用程序的实例句柄?应用程序的实例句柄保存在CWinAppm_hlnstance中,可以这么调用AfxGetlnstancdHandle获得句柄.Example:HANDLEhlnstance=AfxGetlnstanceHandle()(26)如何编程结束应用程序?这是个很筒单又是编程中经常要遇到的问题.向窗口发送WM_CLOSE消息,调用CWnd::OnClose成员函数.允许对用户提示是否保存修改过的数据.Example:AfxGetMainWindow()->SendMessage(WM_CLOSE)还可以创建一个自定义的函数TerminateWindowvoidTerminateWindow(LPCSTRpCaption)(CWnd*pWnd=Cwnd::FindWindow(NULL,pCaption)if(pWnd)pWnd->SendMessage(WM_CLOSE)}说明:FindWindow函数不是提倡的做法,因为它无法处理标题栏自动改变,比如我们要检测Notepad是不是已运行而事先不知道Notepad的标题栏,这时FindWindow就无能为力了,可以通过枚举windows任务列表的办法来实现。在机械出版社"Windows95Api开发人员指南"一书有比较详细的介绍,这里就不再多说乐。(27)如何创建和使用无模式对话框MFC将模式和无模式对话封装在同一个类中,但是使用无模式对话需要几个对话需要几个额处的步骤.首先,使用资源编辑器建立对话资源并使用Classwizard创建一个CDialog的派生类。模式和无模式对话的中止是不一样的:模式对话通过调用CDialog::EndDialog来中止,无模式对话则是调用CWnd::DestroyWindow来中止的,函数CDialog::OnOK和CDialog::OnCancel调用EndDialog,所以需要调用DestroyWindow并重置无模式对话的函数。voidCSampleDialog::OnOK()(//Retrieveandvalidatedialogdata.if(!UpdateData(TRUE))//theUpdateDatarountinewillsetfocustocorrectitemTRACED("UpdateDatafailedduringdialogtermination.”n")return}//CallDestroyWindowinsteadofEndDialog.DestroyWindow()}voidCSampleDialog::OnCancel()(//CallDestroyWindowinsteadofEndDialog.DestroyWindow())其次,需要正确删除表示对话的C++对象。对于模式对来说,这很容易,需要创建函数返回后即可删除C++对象;无模式对话不是同步的,创建函数调用后立即返回,因而用户不知
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度LNG液化天然气运输合同范本
- 二零二五年度拆除工程拆除与环保拆除承包合同
- 二零二五版常年法律顾问知识产权保护服务合同
- 二零二五年快递物流运输承包服务协议
- 2025年度网络安全保密合作协议书
- 二零二五年度:环保产业合作补充协议绿色发展权益共享
- 二零二五年度常年法律顾问合同(公司治理与合规专版)
- 2025版建筑工程合同质量监督与验收规范
- 2025版标准房产抵押贷款保证合同范本
- 二零二五年度车辆贷款还款计划变更合同
- 房屋定购协议书8篇
- 安全总监考核题目及答案
- 2025年北京市海淀区高一(下)期末考试数学试卷(含答案)
- 中式面点师考试试卷及答案
- 论语 学而 教学课件
- 巡察流程培训课件
- 新能源汽车产业差异化战略与盈利能力研究
- 新员工职业发展规划课件
- 二手房基础知识培训
- DB42T 1923-2022 城镇沥青路面冷补沥青混合料施工技术规程
- 中国高尿酸血症与痛风诊疗指南(2024年)
评论
0/150
提交评论