VC程序设计小技巧20例
本文汇总了VC程序设计中常用的20则技巧实例,供大家参考。详情如下:
1、打开CD-ROM
mciSendString("SetcdAudiodooropenwait",NULL,0,NULL);
2、关闭CD_ROM
mciSendString("SetcdAudiodoorclosedwait",NULL,0,NULL);
3、关闭计算机
OSVERSIONINFOOsVersionInfo;//包含操作系统版本信息的数据结构 OsVersionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx(&OsVersionInfo);//获取操作系统版本信息 if(OsVersionInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS) { //Windows98,调用ExitWindowsEx()函数重新启动计算机 DWORDdwReserved; ExitWindowsEx(EWX_REBOOT,dwReserved);//可以改变第一个参数,实现注销用户、 //关机、关闭电源等操作 //退出前的一些处理程序 }
4、重启计算机
typedefint(CALLBACK*SHUTDOWNDLG)(int);//显示关机对话框函数的指针 HINSTANCEhInst=LoadLibrary("shell32.dll");//装入shell32.dll SHUTDOWNDLGShutDownDialog;//指向shell32.dll库中显示关机对话框函数的指针 if(hInst!=NULL) { //获得函数的地址并调用之 ShutDownDialog=(SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60); (*ShutDownDialog)(0); }
5、枚举所有字体
LOGFONTlf; lf.lfCharSet=DEFAULT_CHARSET;//InitializetheLOGFONTstructure strcpy(lf.lfFaceName,""); CClientDCdc(this); //Enumeratethefontfamilies ::EnumFontFamiliesEx((HDC)dc,&lf, (FONTENUMPROC)EnumFontFamProc,(LPARAM)this,0); //枚举函数 intCALLBACKEnumFontFamProc(LPENUMLOGFONTlpelf,LPNEWTEXTMETRIClpntm,DWORDnFontType,longlparam) { //Createapointertothedialogwindow CDay7Dlg*pWnd=(CDay7Dlg*)lparam; //addthefontnametothelistbox pWnd->m_ctlFontList.AddString(lpelf->elfLogFont.lfFaceName); //Return1tocontinuefontenumeration return1; }
其中m_ctlFontList是一个列表控件变量
6、一次只运行一个程序实例,如果已运行则退出
if(FindWindow(NULL,"程序标题")) exit(0);
7、得到当前鼠标所在位置
CPointpt; GetCursorPos(&pt);//得到位置
8、上下文菜单事件触发事件:OnContextMenu事件
9、显示和隐藏程序菜单
CWnd*pWnd=AfxGetMainWnd(); if(b_m)//隐藏菜单 { pWnd->SetMenu(NULL); pWnd->DrawMenuBar(); b_m=false; } else { CMenumenu; menu.LoadMenu(IDR_MAINFRAME);////显示菜单也可改变菜单项 pWnd->SetMenu(&menu); pWnd->DrawMenuBar(); b_m=true; menu.Detach(); }
10、获取可执行文件的图标
HICONhIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0); if(hIcon&&hIcon!=(HICON)-1) { pDC->DrawIcon(10,10,hIcon); } DestroyIcon(hIcon);
11、窗口自动靠边程序演示
BOOLAdjustPos(CRect*lpRect) { //自动靠边 intiSX=GetSystemMetrics(SM_CXFULLSCREEN); intiSY=GetSystemMetrics(SM_CYFULLSCREEN); RECTrWorkArea; BOOLbResult=SystemParametersInfo(SPI_GETWORKAREA,sizeof(RECT),&rWorkArea,0); CRectrcWA; if(!bResult) { //如果调用不成功就利用GetSystemMetrics获取屏幕面积 rcWA=CRect(0,0,iSX,iSY); } else rcWA=rWorkArea; intiX=lpRect->left; intiY=lpRect->top; if(iX<rcWA.left+DETASTEP&&iX!=rcWA.left) { //调整左 //pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE); lpRect->OffsetRect(rcWA.left-iX,0); AdjustPos(lpRect); returnTRUE; } if(iY<rcWA.top+DETASTEP&&iY!=rcWA.top) { //调整上 //pWnd->SetWindowPos(NULL,iX,rcWA.top,0,0,SWP_NOSIZE); lpRect->OffsetRect(0,rcWA.top-iY); AdjustPos(lpRect); returnTRUE; } if(iX+lpRect->Width()>rcWA.right-DETASTEP&&iX!=rcWA.right-lpRect->Width()) { //调整右 //pWnd->SetWindowPos(NULL,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE); lpRect->OffsetRect(rcWA.right-lpRect->right,0); AdjustPos(lpRect); returnTRUE; } if(iY+lpRect->Height()>rcWA.bottom-DETASTEP&&iY!=rcWA.bottom-lpRect->Height()) { //调整下 //pWnd->SetWindowPos(NULL,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE); lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom); returnTRUE; } returnFALSE; } //然后在ONMOVEING事件中使用所下过程调用 CRectr=*pRect; AdjustPos(&r); *pRect=(RECT)r;
12、给系统菜单添加一个菜单项
给系统菜单添加一个菜单项需要进行下述三个步骤:
首先,使用ResourceSymbols对话(在View菜单中选择ResourceSymbols...可以显示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;
其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd::Appendmenu将菜单项添加到菜单中。下例给系统菜单添加两个新的菜单项。
intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct) { … //Makesuresystemmenuitemisintherightrange. ASSERT(IDM_MYSYSITEM<0xF000); //Getpointertosystemmenu. CMenu*pSysMenu=GetSystemMenu(FALSE); ASSERT_VALID(pSysMenu); //Addaseparatorandourmenuitemtosystemmenu. CStringStrMenuItem(_T("Newmenuitem")); pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_MYSYSITEM,StrMenuItem); … }
13、运行其它程序
//运行EMAIL或网址 charszMailAddress[80]; strcpy(szMailAddress,"mailto:netvc@163.com"); ShellExecute(NULL,"open",szMailAddress,NULL,NULL,SW_SHOWNORMAL); //2、运行可执行程序 WinExec("notepad.exe",SW_SHOW);//运行计事本
14、动态增加或删除菜单
(1)、增加菜单
//添加 CMenu*mainmenu; mainmenu=AfxGetMainWnd()->GetMenu();//得到主菜单 (mainmenu->GetSubMenu(0))->AppendMenu(MF_SEPARATOR);//添加分隔符 (mainmenu->GetSubMenu(0))->AppendMenu(MF_STRING,ID_APP_ABOUT,_T("Alwayson&Top"));//添加新的菜单项 DrawMenuBar();//重画菜单
(2)、删除菜单
//删除 CMenu*mainmenu; mainmenu=AfxGetMainWnd()->GetMenu();//得到主菜单 CStringstr; for(inti=(mainmenu->GetSubMenu(0))->GetMenuItemCount()-1;i>=0;i--)//取得菜单的项数。 { (mainmenu->GetSubMenu(0))->GetMenuString(i,str,MF_BYPOSITION); //将指定菜单项的标签拷贝到指定的缓冲区。MF_BYPOSITION的解释见上。 if(str=="Alwayson&Top")//如果是刚才我们增加的菜单项,则删除。 { (mainmenu->GetSubMenu(0))->DeleteMenu(i,MF_BYPOSITION); break; } }
15、测试ALT键是否按下:
GetKeyState(VK_MENU); GetAlt();
16、检查是否按下鼠标左键
if((nFlags&MK_LBUTTON)==MK_LBUTTON)
17、检查键盘输入
在OnKeyDown中的参数nChar是一个数值,当显示的时候,需要转换成字符,使用如下的命令:
charlsChar; lsChar=char(nChar); if(lsChar=='A'); { ....... }
18、调用另一个函数::GetKeyState(),用一个特定的键代码来确定法键是否被按下。如果::GetKeyState函数的返回值是负的,表示该键被按下。如果返回值是非负的,表示该留未被按下。例如:如果要确定shift键是否被按下,可以使用下面的代码:
if(::GetKeyState(VK_SHIFT)<O) { AfxMessageBox("shiftispressed"); }
19.如何在编程的过程中随时结束应用程序(常规)
1)需要向窗口发送WM_CLOSE/WM_QUIT消息,
调用CWnd::OnClose成员函数并允许对用户提示是否保存修改过的数据.
AfxGetMainWnd()->SendMessage(WM_CLOSE);//别忘了先得到当前窗口的指针
2)使用函数:
voidPostQuitMessage(intnExitCode//exitcode);
3)使用标准函数:
voidexit(intstatus);//尽量不要在MFC中使用
20.得到屏幕的尺寸大小
HWNDhWnd; CRectRect; hWnd=::GetDesktopWindow(); ::GetClientRect(hWnd,&Rect); //---------------------------------------------------------
如何查询和设置系统参数
在Windows3.1SDK中介绍过SDK函数SystemParametersInfo,调用该函数可以查询和设置系统参数,诸如按键的重复速率设置、鼠标双击延迟时间、图标字体以及桌面覆盖位图等等。
//Createafontthatisusedforicontitles. LOGFONTstFont;::SystemParametersInfo(SPIF_GETICONTITLELOGFONT,sizeof(LOGFONT),&stFont,SPIF_SENDWININICHANGE); m_font.CreateFontIndirect(&stFont);//Changethewallpapertoleaves.bmp. ::SystemParametersInfo(SPI_SETDESKWALLPAPER,0,_T("forest.bmp"),SPIF_UPDATEINIFILE);
如何使用一个预定义的Windows光标
调用CWinApp::LoadStandardCursor并传送光标标识符。
BOOLCSampleDialog::OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage){//Displaywaitcursorifbusy. if(m_bBusy){ SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); returnTRUE; } returnCDialog::OnSetCursor(pWnd.nHitTest,message); }