当前位置: 首页 > 编程笔记 >

VC程序设计小技巧20例

白博赡
2023-03-14
本文向大家介绍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 < rcWA.left + DETASTEP && iX!=rcWA.left) 
  { 
    //调整左 
//pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE); 
lpRect->OffsetRect(rcWA.left-iX,0); 
AdjustPos(lpRect); 
return TRUE; 
  } 
  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); 
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) <O) 
{ 
  AfxMessageBox("shift is pressed"); 
} 

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); 
 }
 类似资料:
  • 本文向大家介绍VC小技巧汇总之窗口技巧,包括了VC小技巧汇总之窗口技巧的使用技巧和注意事项,需要的朋友参考一下 本文搜集汇总了VC小技巧的窗口技巧,对于VC程序开发的窗口设计而言有一定的借鉴价值,详情如下: 1.让窗口一启动就最大化 把应用程序类(CxxxApp)的 InitInstance() 函数中的 改为 则窗口一启动就最大化显示。 2.如何设置窗口的初始尺寸 在将应用程序类(CxxAPP)

  • 本文向大家介绍VC小技巧汇总之控件技巧,包括了VC小技巧汇总之控件技巧的使用技巧和注意事项,需要的朋友参考一下 本文搜集汇总了VC小技巧的控件技巧,对于进行VC开发来说有一定的借鉴价值,具体如下: 1.如何隐藏和显示控件 用CWnd类的函数BOOL ShowWindow(int nCmdShow)可以隐藏或显示一个控件。 例1: 例2: 2.按钮的使能与禁止 用ClassWizard的Member

  • 本文向大家介绍VC小技巧汇总之对话框技巧,包括了VC小技巧汇总之对话框技巧的使用技巧和注意事项,需要的朋友参考一下 本文搜集汇总了VC中关于对话框常用的一些技巧,对于进行VC开发由于一定的参考借鉴价值。 1.如何修改对话框的背景色: 在对话框的OnPaint()函数中加入下面语句: 2.如何让弹出式对话框具有统一的背景色: 在应用程序类CxxxApp的InitInstance()函数中加入下面的语

  • 本文向大家介绍VC小技巧汇总之5则实用小技巧,包括了VC小技巧汇总之5则实用小技巧的使用技巧和注意事项,需要的朋友参考一下 本文搜集汇总VC的5则小技巧,非常实用,对于VC程序设计有很好的参考借鉴价值,详情如下: 1.如何获取程序所在的路径 也就是获取你这个程序本身所在的路径。 在应用程序类CxxApp的头文件中定义一个变量CString m_exePath;用来放置程序的路径名,在应用程序类Cx

  • 7.1 连接到远程Lisp 7.1.1 设置Lisp镜像 如果你不想通过一般的基于Emacs的方式加载swank,只需要加载swank-load.lisp文件就可以了。只需要在一个运行中的Lisp镜像 [1] 里执行以下代码: (load "/path/to/swank-loader.lisp") 现在,我们需要做的就是启动swank服务器。在第一个例子里,我们假设使用默认配置。 (swank:c

  • 一、回答问题技巧: 比如面试官问: 你们这次调研为什么是你发起的? 而不是产品发起的? 产品在中间承担了什么角色。有些同学可能就开始以以叭的聊当时调研的故事了,正确的做法我们先理解面试官的问题背后是在问什么。在这个故事中,面试官真正想问的是“你和产品分别在这次调研里承担了什么样的工作,尤其是“你”。你会不会把产品做的事情归功到自己身上。(验真)” 可答的时候要有条理,同时把我做的事情讲清楚。