VC 小技巧

来源:互联网 发布:淘宝网飞利浦剃须刀 编辑:程序博客网 时间:2024/06/05 02:36
1、VC++中 WM_QUERYENDSESSION WM_ENDSESSION 为系统关机消息。
  
  2、让程序暂停:system("PAUSE");
  
  3、在PreTranslateMessage中捕捉键盘事件
  
   if (pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)return TRUE; //注意return的值
  
  4、更改按键消息(下面的代码可把回车键消息改为TAB键消息)
   -------------------------------------------------------
      BOOL CT3Dlg::PreTranslateMessage(MSG* pMsg)
      {
  
      if(pMsg->message == WM_KEYDOWN && VK_RETURN == pMsg->wParam)
       {
      pMsg->wParam = VK_TAB;
       }
       return CDialog::PreTranslateMessage(pMsg);
      }
   ------------------------------------------
  
  5、 隐藏桌面图标并禁用右键功能菜单:
   ------------------------------------
   HWND Hwd = ::FindWindow("Progman", NULL);
   if (bShowed)
   ::ShowWindow(Hwd, SW_HIDE);
   else
   ::ShowWindow(Hwd, SW_SHOW);
   bShowed = !bShowed;
   ---------------------------------------
  
  6、复制文件应该用到CopyFile或是CopyFileEx这两个API
  
  7、SendMessage函数的几个用法:
   控制按钮按下的,是这么用的
   SendMessage(n1, WM_COMMAND, MAKELPARAM(ID,BN_CLICKED),(LPARAM )n2); (n1,n2是句柄)
   而得到文本内容,是这样用的,
   SendMessage(hWnd,WM_GETTEXT,10,(LPARAM)buf),
  
  8、处理一个单行EDIT的WM_CTLCOLOR要同时响应nCtlColor = CTLCOLOR_EDIT和CTLCOLOR_MSGBOX的两个情况,参考http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_cwnd.3a3a.onctlcolor.asp
  
  9、数组初始化:
   int a[24][34]; //声明数组
   memset(a,-1,24*34); //全部元素初始化成-1,但初始化成除0和-1以外的数值是不行的
  
  10、创建一个控件:
   HWND hEdit=CreateWindow("EDIT",NULL,WS_CHILD|WS_VISIBLE |ES_LEFT,50,20,50,20,hwnd,NULL,hInst,NULL); //hwnd参数为父窗口句柄
  
  11、调用其它程序又要隐藏窗口:用CreateProcess函数调用,再拿到窗口句柄,然后::ShowWindow(hWnd,SW_HIDE);
  
  12、日期到字符串:
   --------------------------------------------------
   SYSTEMTIME sys;
   GetSystemTime(&sys);
   char str[100];
   sprintf(str,"%d%d%d_%d%d%d",sys.wYear,sys.wMonth,sys.wDay,sys.wHour+8,sys.wMinute,sys.wSecond);
   //这里的小时数注意它的0:00点是早上8:00,所以要加上8,因为这是格林威治时间,换成我国时区要加8
   --------------------------------------------------
   CString m_strTemp;
   SYSTEMTIME systemtime;
   GetLocalTime(&systemtime); //这个函数可获得毫秒级的当前时间
   m_strTemp.Format("%d年%d月%d日%d:%d:%d:%d 星期%d",systemtime.wYear,systemtime.wMonth,systemtime.wDay,systemtime.wHour,systemtime.wMinute,systemtime.wSecond,systemtime.wMilliseconds,systemtime.wDayOfWeek);
   --------------------------------------------------
  
  13、任务栏上的图标闪烁:
     The FlashWindow function flashes the specified window once, whereas the FlashWindowEx function flashes a specified number of times.
  
   BOOL FlashWindow(
   HWND hWnd, // handle to window to flash
   BOOL bInvert // flash status
   );//闪烁一次
   FlashWindowEx()//闪烁多次
  
  14、在一个由汉字组成的字符串里,由于一个汉字由两个字节组成,怎样判断其中一个字节是汉字的第一个字节,还是第二个字节,使用IsDBCSLeadByte函数能够判断一个字符是否是双字的第一个字节,试试看:)
   _ismbslead
   _ismbstrail
  
  15、如何实现对话框面板上的控件随着对话框大小变化自动调整
     在OnSize中依其比例用MoveWindow同等缩放.http://www.codeproject.com/dialog/dlgresizearticle.asp
  
  16、给你的程序加上splash:http://www.vckbase.com/document/finddoc.asp?keyword=splash
   如何添加闪屏:Project->Add to Project->Components and Controls->Gallery\\Visual C++ Components->Splash screen
  
  17、得到CListCtrl控件点击事件时点击的位置:
   -----------------------------------------------
   void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
   {NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
   if(pNMListView->iItem != -1)
   {
   CString strtemp;
   strtemp.Format("单击的是第%d行第%d列",
   pNMListView->iItem, pNMListView->iSubItem);
   AfxMessageBox(strtemp);
   }
   *pResult = 0;
   }
   ------------------------------------------------
  
  18、 如何在VC中操纵word:http://www.vckbase.com/document/viewdoc/?id=1174
  
  19、消息传递中pMSG中一些参数的意义:
   hwnd-------接收消息的窗口句柄;
   message----发送的消息号;
   wParam-----消息参数,具体意义同发送的消息有关;
   lParam-----同上;
   time-------发送消息时的时间,数值大小为自系统启动以来经历的时间,单位是毫秒;
   pt---------发送消息时鼠标在屏幕上的绝对坐标,单位是像素。
  
  20、刷新屏幕局部:
  刷新控件区域:
  控件ID:IDC_STATIC_STATIC
   ------------------------------------
   CRect static_rect;
   CWnd *pwnd = GetDlgItem(IDC_STATIC_STATIC);
   if (pwnd == NULL)
   {
   return;
   }
   pwnd->GetWindowRect(&static_rect);
   ScreenToClient(&static_rect);
   InvalidateRect(&static_rect); //注意这个函数,会调用OnEraseBkgnd
   --------------------------------------
  
  21、 vc控制word、excel的问题:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnoxpta/html/vsofficedev.asp
   下面还有范例两个:
           http://www.vckbase.com/code/downcode.asp?id=2415
           http://www.vckbase.com/code/downcode.asp?id=2397
  
  22、下拉式的工具条按钮:http://community.csdn.net/Expert/topic/4413/4413094.xml?temp=.2334864
  
  23、为何组合框Droplist风格时响应键盘PreTranslateMessage函数,而dropdown风格时不响应:
     http://community.csdn.net/Expert/topic/4412/4412791.xml?temp=.8741419
  
  24、从内存中加载并启动一个exe :http://community.csdn.net/Expert/topic/4418/4418306.xml?temp=.7619135
  
  25、快速从得到的全路径文件名中分离出盘符、路径名、文件名和后缀名:
   ------------------------------------------------
   char path_buffer[_MAX_PATH];
   char drive[_MAX_DRIVE];
   char dir[_MAX_DIR];
   char fname[_MAX_FNAME];
   char ext[_MAX_EXT];
   GetModuleFileName(0,path_buffer,_MAX_PATH);
   _splitpath( path_buffer, drive, dir,fname , ext); //用这个函数转换
   ------------------------------------------------
  
  26、监视文件夹是否被更新:FindFirstChangeNotification、FindNextChangeNotification、FindCloseChangeNotification这三个函数
   范例见:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/obtaining_directory_change_notifications.asp
  
  27、动态菜单:http://community.csdn.net/Expert/topic/4441/4441893.xml?temp=.2887384
   http://community.csdn.net/Expert/topic/4506/4506791.xml?temp=.2409326
  
  28、-----------------------------------------
  114 得到剪贴板数据
   -------------------------------------------------
   if ( OpenClipboard() )
   {
   HANDLE hData = GetClipboardData(CF_TEXT);
   char * buffer = (char*)GlobalLock(hData); //剪贴板中的文本内容保存在buffer中
   GlobalUnlock(hData);
   CloseClipboard();
   }
   ----------------------------------------------
  
  29、在CStatic上面关联图片
   ----------------------------------------------
   CStatic* pWnd = (CStatic*)GetDlgItem(IDC_STATIC);
   pWnd->ModifyStyle(0, SS_BITMAP);
   pWnd->SetBitmap((HBITMAP)::LoadImage(0,
   "c:\\zzzzz.bmp", //只能显示.bmp文件
   IMAGE_BITMAP,
   0,0,LR_CREATEDIBSECTION |LR_DEFAULTSIZE |LR_LOADFROMFILE));
   ----------------------------------------------
  
  30、显示一个打开文件夹的对话框,并得到用户选择的目录:
   -------------------------------------------
   char szDir[MAX_PATH];
   BROWSEINFO bi;
   ITEMIDLIST *pidl;
   bi.hwndOwner = this->m_hWnd;
   bi.pidlRoot = NULL;
   bi.pszDisplayName = szDir;
   bi.lpszTitle = "请选择目录";//strDlgTitle;
   bi.ulFlags = BIF_RETURNONLYFSDIRS;
   bi.lpfn = NULL;
   bi.lParam = 0;
   bi.iImage = 0;
  
   pidl = SHBrowseForFolder(&bi);
   if(pidl == NULL)
   return;
   if(!SHGetPathFromIDList(pidl, szDir))
   return;
   AfxMessageBox(szDir); //szDir中存放的内容为用户选定的目录
   ------------------------------------------------
  
  31、把CRichEditCtrl中的文字保存到rtf文件:http://community.csdn.net/Expert/topic/4478/4478640.xml?temp=.1313135
  
    在codeproject上还有从CRichEditCtrl类派生新类的,功能增强了很多:http://www.codeproject.com/richedit/autoricheditctrl.asp
     还有一个开发类似写字板那样程序的完整范例:http://www.codeproject.com/tools/simplewordpad.asp
  
  32、这里有很多CRichEditCtrl控件的高级用法:http://www.codeguru.com/Cpp/controls/richedit/
  
  33、MD5加密解密的API:http://community.csdn.net/Expert/topic/4502/4502325.xml?temp=.6894647
   MD5Init
   MD5Final
   MD5Update
  
  34、动态创建静态控件并加载.bmp图片,先在对话框类中定义成员变量:
   ----------------------------------------------------
   public:
   CStatic m_pp; //这个是在对话框类中定义的
   再:
   CBitmap cb;
   cb.LoadBitmap(IDB_BITMAP1);
   m_pp.Create("",WS_CHILD|WS_VISIBLE|SS_BITMAP,CRect(10,10,200,200),this,101);
   m_pp.SetBitmap((HBITMAP)cb);
   ----------------------------------------------------
  
  35、DLL中创建窗口时对于资源等,需要先进行状态处理:AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
  
  36、把图片中某种指定色变成透明色,在对话框的OnPaint()中加入类似如下代码:
   -------------------------------------------------------------------------------
   //CImage imgOriginal;
   int XWitdh=imgOriginal.GetWidth();
   int XHeight=imgOriginal.GetHeight();
   COLORREF TransparentColor= RGB(0x00,0x00,0x00); //这里黑色变成透明色
   CPaintDC dc(this);
   imgOriginal.TransparentBlt(dc.m_hDC,0,0,XWitdh,XHeight,TransparentColor);
   imgOriginal.StretchBlt(dc,0,0,imgOriginal.GetWidth()/2,imgOriginal.GetHeight()/2,SRCCOPY);
   -------------------------------------------------------------------------------
  
  37、rundll32.exe,这个程序很方便,用它可以调用任何 DLL 中的函数。你只要给它提供 DLL、函数名以及要传递的参数即可。Rundll32.exe 绝对多才多艺,你可以用它来关闭和重启 Windows,创建快捷方式以及启动控制面板程序。只要知道要调用的DLLs,一切都搞掂。你可以象下面这样用 rundll32.exe 从命令行打开一个 URL:
   --------------------------------------------------------
   rundll32.exe url.dll,FileProtocolHandler www.vckbase.com
   --------------------------------------------------------
   url.dll 中的函数 FileProtocolHandler 负责这个工作。
  
  38、HDC===>CDC*
   ----------------------------------
   HDC hdc=::GetWindowDC(this->m_hWnd); //获得窗口标题栏区域
   CDC* pDC = CDC::FromHandle(hdc);
   ----------------------------------
   CDC*===>HDC,可以通过CDC的操作符HDC()来实现:
   ------------------
   HDC hdc=HDC(pDC); //或:HDC hdc=pDC->m_hdc;
   ------------------
  
  39、设置对话框的背景色的简单方法,其实只要在CWinapp的InitInstance的里面添加一行代码就行了:
   ---------------------------------------------------------
   BOOL CBOOKApp::InitInstance()
   {
   AfxEnableControlContainer();
   SetDialogBkColor(RGB(213,240,227),RGB(173,7,95)); //添加这行,前者为背景色,后者为前景色
   .....
   }
   ---------------------------------------------------------
  
  40、数字水印算法的实现:http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=&page=3
  
  41、读取其它进程内存中的数据:ReadProcessMemory
  
  42、给程序加上系统托盘图标:http://www.vckbase.com/bbs/prime/viewprime.asp?id=260
   下面是简单的代码:
   --------------------------------------------------------------
   NOTIFYICONDATA nid;
   //初始化系统托盘图标
   nid.cbSize = sizeof(NOTIFYICONDATA);
   nid.hWnd = m_hWnd;
   nid.uID = 100;
   nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
   nid.uCallbackMessage = WM_USER+20;
   nid.hIcon=LoadIcon(NULL,IDI_APPLICATION); //图标
   strcpy(nid.szTip, "My Tooltip Text"); //提示
   Shell_NotifyIcon(NIM_ADD, &nid);
   --------------------------------------------------------------
  
  43、LOGFONT各成员的意义:
   ---------------------------------------------------------------------------------
   LOGFONT lf;
   lf.lfHeight=-80; //字体字符的高度
   lf.lfWidth=0; //字符平均宽度
   lf.lfEscapement=45; //文本行逆时针旋转45度
   lf.lfOrientation=0; //字符角度
   lf.lfWeight=FW_HEAVY; //字符的粗细度
   lf.lfItalic=FALSE; //倾斜
   lf.lfUnderline=FALSE; //下划线
   lf.lfStrikeOut=FALSE; //删除线
   lf.lfCharSet=GB2312_CHARSET; //中文字符集
   lf.lfOutPrecision=OUT_STROKE_PRECIS; //字体输出结果和要求的匹配程度
   lf.lfClipPrecision=CLIP_STROKE_PRECIS; //如何裁剪落于裁剪区之外的字符
   lf.lfQuality=DRAFT_QUALITY; //字体属性匹配的精确程度
   lf.lfPitchAndFamily=VARIABLE_PITCH | FF_MODERN; //字体间距和字体族
   strcpy(lf.lfFaceName,"楷体_GB2312"); //楷体
   m_font.CreateFontIndirect(&lf); //m_font为类的成员变量:CFont m_font;
   ---------------------------------------------------------------------------------
  
  44、直接读取硬盘的指定扇区:
   (1)用汇编;
   (2)直接用CreateFile("\\.\PHYSICALDRIVE0", ...)打开物理磁盘设备即可(物理磁盘设备都是从0开始排号的,0表示第一块硬盘,1表示第二块硬盘....),这样用SetFilePointer可以随意读取硬盘上任何位置的东西!至于扇区嘛,一般都是512字节为1扇区的,自己换算就是了~          <===================还没试,不过这里有更多内容:http://www.51cto.com/html/2005/1110/11133.htm
  
  45、CBitmap=====>HBITMAP:
   -------------------------------------------------------------------------------------
   CBitmap bitmap;
   HBITMAP hbitmap=(HBITMAP)bitmap; //CBitmap中重载了HBITMAP()操作符,可以方便地用它来强制转换
   -------------------------------------------------------------------------------------
     HBITMAP=====>CBitmap:
   ---------------------------------------
   HBITMAP hbitmap;
   CBitmap bitmap;
   bitmap.FromHandle(hbitmap);
   ---------------------------------------
  
  46、从其它.exe文件提取.ico图标作为自己程序的图标:
   ----------------------------------------------------------------------
   HINSTANCE hInst = LoadLibrary("b.exe");
   HRSRC hRc = FindResource(hInst, (LPCSTR)1, (LPCSTR)RT_ICON);
   LPVOID lpResource = LockResource(LoadResource(hInst,hRc));
  
   HANDLE hUpdate = BeginUpdateResource("a.exe", FALSE);
   UpdateResource(hUpdate, (LPCSTR)RT_ICON, (LPCSTR)1, 0, lpResource, SizeofResource(hInst, hRc));
   EndUpdateResource(hUpdate, FALSE);
  
   CloseHandle(hRc);
   FreeLibrary(hInst);
   -----------------------------------------------------------------------
  
  47、请问NULL和null,TRUE和true,FALSE和false等有啥区别?
   1.FALSE/TRUE与false/true的区别:
   false/true是标准C++语言里新增的关键字,而FALSE/TRUE是通过#define,这要用途是解决程序在C与C++中环境的差异,以下是FALSE/TRUE在windef.h的定义:
   #ifndef FALSE
   #define FALSE 0
   #endif
   #ifndef TRUE
   #define TRUE 1
   #endif
   也就是说FALSE/TRUE是int类型,而false/true是bool类型;所以两者不一样的,只不过我们在使用中没有这种感觉,因为C++会帮你做隐式转换。
   2.bool的大小与BOOL的区别:
   bool在C++里是占用1字节,而BOOL是int类型,int类型的大小是视具体环境而定的;所以来说:false/true只占用1个字节,而TRUE/FALSE视具体环境而言
  
  48、关机:ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0 ) <=====还没试
   强制关机ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0 );
  
  49、字符串====>日期时间:
   -------------------------------------------------
   COleDateTime dt;
   dt.ParseDateTime(_T("2006-2-14 8:00:00"));
   SYSTEMTIME st={0};
   dt.GetAsSystemTime(st);
   //SetLocalTime(&st); //设置电脑中时间
   -------------------------------------------------
     日期时间====>字符串:
   -------------------------------------------------
   SYSTEMTIME st={0};
   st.wYear=2006;
   st.wMonth=3;
   st.wDay=23;
   st.wHour=8;
   st.wMinute=30;
   st.wSecond=59;
   COleDateTime dt(st);
   AfxMessageBox(dt.Format());
   -------------------------------------------------
  
  50、获得文件夹大小的方法,摘自:http://community.csdn.net/Expert/topic/4672/4672088.xml?temp=.2216761
   ----------------------------------------------------------------------------------
   #include
   #import "scrrun.dll" raw_interfaces_only
   int main()
   {
   CoInitialize(NULL);
   {
   try
   {
   Scripting::IFileSystem3Ptr fs;
   fs.CreateInstance(__uuidof(Scripting::FileSystemObject));
   Scripting::IFolderPtr folder;
   fs->GetFolder(_bstr_t("f:\\win98"),&folder);
   _variant_t vsize;folder->get_Size(&vsize);
   cout<<"f:\\win98 size:"<<(long)vsize<<" bytes"<
   }
   catch(_com_error &e)
   {
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());
   cout<<"Get directory size via FileSystemObject, by masterz"<
   cout<<"COM error occurred,source:"<<(LPCTSTR)bstrSource<
   cout<<"Description:"<<(LPCTSTR)bstrDescription<
   }
   }
   CoUninitialize();
   return 0;
   }




原创粉丝点击