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