热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

VC程序设计小技巧20例

这篇文章主要介绍了VC程序设计小技巧20例,需要的朋友可以参考下

本文汇总了VC程序设计中常用的20则技巧实例,供大家参考。详情如下:

1、打开CD-ROM

mciSendString("Set cdAudio door open wait",NULL,0,NULL); 

2、关闭CD_ROM

mciSendString("Set cdAudio door closed wait",NULL,0,NULL); 

3、关闭计算机

OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构 
OsVersionInfo.dwOSVersiOnInfoSize= sizeof(OSVERSIONINFO); 
GetVersionEx(&OsVersionInfo); //获取操作系统版本信息 
if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) 
{ 
  //Windows98,调用ExitWindowsEx()函数重新启动计算机 
  DWORD dwReserved; 
  ExitWindowsEx(EWX_REBOOT,dwReserved); //可以改变第一个参数,实现注销用户、 
  //关机、关闭电源等操作 
  // 退出前的一些处理程序 
} 

4、重启计算机

typedef int (CALLBACK *SHUTDOWNDLG)(int); //显示关机对话框函数的指针 
HINSTANCE hInst = LoadLibrary("shell32.dll"); //装入shell32.dll 
SHUTDOWNDLG ShutDownDialog; //指向shell32.dll库中显示关机对话框函数的指针 
if(hInst != NULL) 
{ 
  //获得函数的地址并调用之 
  ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60); 
  (*ShutDownDialog)(0); 
} 

5、枚举所有字体

LOGFONT lf; 
lf.lfCharSet = DEFAULT_CHARSET; // Initialize the LOGFONT structure 
strcpy(lf.lfFaceName,""); 
CClientDC dc (this); 
//Enumerate the font families 
::EnumFontFamiliesEx((HDC) dc,&lf, 
(FONTENUMPROC) EnumFontFamProc,(LPARAM) this,0); 
//枚举函数 
int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf,LPNEWTEXTMETRIC lpntm,DWORD nFontType,long lparam) 
{ 
  // Create a pointer to the dialog window 
  CDay7Dlg* pWnd = (CDay7Dlg*) lparam; 
  // add the font name to the list box 
  pWnd ->m_ctlFontList.AddString(lpelf ->elfLogFont.lfFaceName); 
  // Return 1 to continue font enumeration 
  return 1; 
} 

其中m_ctlFontList是一个列表控件变量

6、一次只运行一个程序实例,如果已运行则退出

if( FindWindow(NULL,"程序标题")) 
exit(0); 

7、得到当前鼠标所在位置

CPoint pt; 
GetCursorPos(&pt); //得到位置 

8、上下文菜单事件触发事件 :OnContextMenu事件

9、显示和隐藏程序菜单

CWnd *pWnd=AfxGetMainWnd(); 
if(b_m) //隐藏菜单 
{ 
  pWnd->SetMenu(NULL); 
  pWnd->DrawMenuBar(); 
  b_m=false; 
} 
else 
{ 
  CMenu menu; 
  menu.LoadMenu(IDR_MAINFRAME); ////显示菜单 也可改变菜单项 
  pWnd->SetMenu(&menu); 
  pWnd->DrawMenuBar(); 
  b_m=true; 
  menu.Detach(); 
} 

10、获取可执行文件的图标

HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0); 
if (hIcon &&hIcon!=(HICON)-1) 
{ 
  pDC->DrawIcon(10,10,hIcon); 
} 
DestroyIcon(hIcon); 

11、窗口自动靠边程序演示

BOOL AdjustPos(CRect* lpRect) 
{ 
  //自动靠边 
  int iSX=GetSystemMetrics(SM_CXFULLSCREEN); 
  int iSY=GetSystemMetrics(SM_CYFULLSCREEN); 
  RECT rWorkArea; 
  BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkArea, 0); 
  CRect rcWA; 
  if(!bResult) 
  { 
    //如果调用不成功就利用GetSystemMetrics获取屏幕面积 
rcWA=CRect(0,0,iSX,iSY); 
  } 
  else 
rcWA=rWorkArea; 
  int iX=lpRect->left; 
  int iY=lpRect->top; 
  if(iX SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE); 
lpRect->OffsetRect(rcWA.left-iX,0); 
AdjustPos(lpRect); 
return TRUE; 
  } 
  if(iY SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE); 
lpRect->OffsetRect(0,rcWA.top-iY); 
AdjustPos(lpRect); 
return TRUE; 
  } 
  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); 
return TRUE; 
  } 
  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); 
return TRUE; 
  } 
  return FALSE; 
} 
//然后在ONMOVEING事件中使用所下过程调用 
CRect r=*pRect; 
AdjustPos(&r); 
*pRect=(RECT)r; 

12、给系统菜单添加一个菜单项
给系统菜单添加一个菜单项需要进行下述三个步骤:
首先,使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;
其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单项添加到菜单中。下例给系统菜单添加两个新的菜单项。

int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct) 
{ 
  … 
  //Make sure system menu item is in the right range. 
  ASSERT(IDM_MYSYSITEM <0xF000); 
  //Get pointer to system menu. 
  CMenu* pSysMenu=GetSystemMenu(FALSE); 
  ASSERT_VALID(pSysMenu); 
  //Add a separator and our menu item to system menu. 
  CString StrMenuItem(_T ("New menu item")); 
  pSysMenu->AppendMenu(MF_SEPARATOR); 
  pSysMenu->AppendMenu(MF_STRING, IDM_MYSYSITEM, StrMenuItem); 
  … 
} 

13、运行其它程序

//运行EMAIL或网址 
char szMailAddress[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("Always on &Top")); //添加新的菜单项 
DrawMenuBar(); //重画菜单 

(2)、 删除菜单

//删除 
CMenu *mainmenu; 
mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜单 
CString str ; 
for(int i=(mainmenu->GetSubMenu (0))->GetMenuItemCount()-1;i>=0;i--) //取得菜单的项数。 
{ 
  (mainmenu->GetSubMenu (0))->GetMenuString(i,str,MF_BYPOSITION); 
  //将指定菜单项的标签拷贝到指定的缓冲区。MF_BYPOSITION的解释见上。 
  if(str=="Always on &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是一个数值,当显示的时候,需要转换成字符,使用如下的命令:

char lsChar; 
lsChar=char(nChar); 
if(lsChar=='A'); 
{ 
....... 
} 

18、调用另一个函数::GetKeyState(),用一个特定的键代码来确定法键是否被按下。 如果::GetKeyState函数的返回值是负的,表 示该键被按下。如果返回值是非负的,表示该留未被按下。例如:如果要确定shift键是否被按下,可以使用下面的代码:

if(::GetKeyState(VK_SHIFT) 

19.如何在编程的过程中随时结束应用程序(常规)
1)需要向窗口发送 WM_CLOSE/WM_QUIT消息,
调用 CWnd::OnClose成员函数并允许对用户提示是否保存修改过的数据.

AfxGetMainWnd()->SendMessage(WM_CLOSE); //别忘了先得到当前窗口的指针 

2)使用函数:

void PostQuitMessage( int nExitCode // exit code ); 

3)使用标准函数:

void exit( int status ); //尽量不要在MFC中使用 

20.得到屏幕的尺寸大小

HWND hWnd; 
CRect Rect; 
hWnd = ::GetDesktopWindow(); 
::GetClientRect(hWnd, &Rect); 

//--------------------------------------------------------- 

如何查询和设置系统参数
    在Windows 3.1 SDK中介绍过SDK函数SystemParametersInfo,调用该函数可以查询和设置系统参数,诸如按键的重复速率设置、鼠标双击延迟时间、图标字体以及桌面覆盖位图等等。 

//Create a font that is used for icon titles. 
LOGFONT stFont; :: SystemParametersInfo (SPIF_GETICONTITLELOGFONT,   sizeof (LOGFONT), &stFont, SPIF_SENDWININICHANGE); 
m_font.CreateFontIndirect (&stFont); //Change the wallpaper to leaves.bmp. 
:: SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, _T("forest.bmp"),SPIF_UPDATEINIFILE); 

如何使用一个预定义的Windows光标
 调用CWinApp:: LoadStandardCursor并传送光标标识符。

BOOL CSampleDialog:: OnSetCursor (CWnd* pWnd, UINT nHitTest, UINT message) {   //Display wait cursor if busy.   
if (m_bBusy)   {     
SetCursor (AfxGetApp () ->LoadStandardCursor (IDC_WAIT));     
return TRUE; 
   }   
return CDialog:: OnSetCursor (pWnd. nHitTest,message); 
 }

推荐阅读
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • windows便签快捷键_用了windows十几年,没想到竟然这么好用!隐藏的功能你知道吗?
    本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Win10下游戏不能全屏的解决方法及兼容游戏列表
    本文介绍了Win10下游戏不能全屏的解决方法,包括修改注册表默认值和查看兼容游戏列表。同时提供了部分已经支持Win10的热门游戏列表,帮助玩家解决游戏不能全屏的问题。 ... [详细]
  • 如何在联想win10专业版中修改账户名称
    本文介绍了在联想win10专业版中修改账户名称的方法,包括在计算机管理中找到要修改的账户,通过重命名来修改登录名和属性来修改显示名称。同时指出了windows10家庭版无法使用此方法的限制。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 电脑公司win7剪切板位置及使用方法
    本文介绍了电脑公司win7剪切板的位置和使用方法。剪切板一般位于c:\windows\system32目录,程序名为clipbrd.exe。通过在搜索栏中输入cmd打开命令提示符窗口,并输入clip /?即可调用剪贴板查看器。赶紧来试试看吧!更多精彩文章请关注本站。 ... [详细]
author-avatar
小新亚笔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有