VC常用代码段_喝小酒的网摘

本文章详细介绍了在VC环境下改进代码和优化对话框设计的多种方法,包括改变视图背景色、添加菜单与工具栏、设置对话框背景色、添加工具提示、为无工具栏窗口添加工具栏、创建分隔窗口、窗口居中、对话框加状态条、设置初始窗口状态、对话框透明特效、设置对话框里STATIC控件颜色、使窗口的最大化和最小化按钮消失、设置控件字体颜色、将字符转换为数字、调用外部应用程序、经典安装程序制作、控件注册、获取当前时间、修改单文档程序的标题、隐藏程序在任务栏的图标、读取编辑框内容、自绘菜单宽度调整、重启计算机、无标题对话框的移动、获取操作系统版本、设置对话框为最顶层、对话框程序不在任务栏显示、向对话框窗口添加右键菜单、文件查找、托盘菜单不点击不能消失、对话框由小到大显示的动画效果、按行读出文本文件、使用IDC_HAND时提示未定义、使应用程序启动时不自动创建新文档、播放mp3、获取屏幕RGB值、打开一个网址。
导读:
  VC代码收集
  一、改变视图背景色:
  在CView的OnDraw函数中添写如下一段程序代码:
  void CFileNameView::OnDraw(CDC* pDC)
  {
  CFileNameDoc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  CRect rectClient;
  CBrush brushBkColor;
  GetClientRect(rectClient);
  brushBkColor.CreateSolidBrush(RGB(255,0,0)); //颜色设置
  pDC->DPtoLP(rectClient);
  pDC->FillRect(rectClient,&brushBkColor);
  …
  }
  二、往基于对话框的程序添加菜单:
  [1] 先添加菜单(IDR_MENU1)资源,并加上需要的菜单项。
  [2] 编辑对话框资源IDD_DLGMENUTOOLBAR_DIALOG的属性,在属性对话框中选择IDR_MENU1即可。
  
  [3] 假如您不希望在对话框属性中直接设置菜单,而通过代码在程序中动态生成可以采用如下方法:
  在CFileNameDlg类声名中添加成员变量CMenu m_menu,再在CFileNameDlg::OnInitDialog() 中添加如下代码:
  //加载菜单
  m_menu.LoadMenu(IDR_MENU1);
  //设置当前菜单
  SetMenu(&m_menu);
  //当你不需要菜单时可以用 SetMenu(NULL);来取消当前菜单
  三、往基于Dialog的程序添加工具栏:
  [1] 先添加工具栏(IDR_TOOLBAR1)资源,并画好各个按钮。
  [2] 在CFileNameDlg类声名中添加成员变量 CToolBar m_wndtoolbar;
  [3] 在CFileNameDlg::OnInitDialog() 中添加如下代码
  //添加一个平面工具条
  if (!m_wndtoolbar.CreateEx( this,TBSTYLE_FLAT , WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS, CRect(4,4,0,0)) !m_wndtoolbar.LoadToolBar(IDR_TOOLBAR1) )
  {
  TRACE0("failed to create toolbar/n");
  return FALSE;
  }
  m_wndtoolbar.ShowWindow(SW_SHOW);
  RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
  四、改变对话框背景色:
  在CDlgMenuToolbarDlg::OnPaint()中修改代码实现Dialog 填充颜色:
  CPaintDC dc(this);
  CRect rect;
  GetClientRect(rect);
  dc.FillSolidRect(rect, RGB(60,110,170));
  方法二、在InitInstance()(不是OnInitDialog())中加入:
  SetDialogBkColor(RGB(255,0,0),RGB(0,255,0));
  注意:要放在InitInstance函数的最前面!
  五、为dialog的工具栏添加工具提示:
  [1] 在CFileNameDlg类定义中手工添加消息映射函数的定义,如下黑体部分
  //{{AFX_MSG(CFileNameDlg)
  virtual BOOL OnInitDialog();
  afx_msg void OnPaint();
  afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
  [2] 在CFileNameDlg.cpp添加函数的实现代码
  //工具栏提示
  BOOL CFileNameDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
  {
  ASSERT(pNMHDR->code == TTN_NEEDTEXTA pNMHDR->code == TTN_NEEDTEXTW);
  // UNICODE消息
  TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
  TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
  //TCHAR szFullText[512];
  CString strTipText;
  UINT nID = pNMHDR->idFrom;
  
  if (pNMHDR->code == TTN_NEEDTEXTA &&(pTTTA->uFlags &TTF_IDISHWND)
  pNMHDR->code == TTN_NEEDTEXTW &&(pTTTW->uFlags &TTF_IDISHWND))
  {
  // idFrom为工具条的HWND
  nID = ::GetDlgCtrlID((HWND)nID);
  }
  
  if (nID != 0) //不为分隔符
  {
  strTipText.LoadString(nID);
  strTipText = strTipText.Mid(strTipText.Find(’/n’,0)+1);
  
  #ifndef _UNICODE
  if (pNMHDR->code == TTN_NEEDTEXTA)
  {
  lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
  }
  else
  {
  _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
  }
  #else
  if (pNMHDR->code == TTN_NEEDTEXTA)
  {
  _wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));
  }
  else
  {
  lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
  }
  #endif
  *pResult = 0;
  // 使工具条提示窗口在最上面
  ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE|
  SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
  return TRUE;
  }
  return TRUE;
  }
  [3] 在CFileNameDlg.cpp中添加消息映射,请看如下代码中的黑体部分
  BEGIN_MESSAGE_MAP(CFileNameDlg, CDialog)
  //{{AFX_MSG_MAP(CFileNameDlg)
  ON_WM_PAINT()
  ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText )
  //}}AFX_MSG_MAP
  END_MESSAGE_MAP()
  [4] 在CFileNameDlg.h中添加声明:
  BOOL CFileNameDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
  六、给没有工具栏的窗口添加工具栏:
  在资源管理器中编辑工具栏,并将其属性改为IDR_MAINFRAME,然后在MainFrm.h中声明:
  CToolBar m_wndToolBar;
  在MainFrm.cpp中添加:
  int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  {
  m_wndToolBar.Create(this);
  m_wndToolBar.LoadToolBar(IDR_MAINFRAME);
  ……;
  }
  停靠工具栏:在刚才添加的后面加入下面代码:
  m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()|CBRS_TOOLTIPS|CBRS_SIZE_DYNAMIC);
  m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  EnableDocking(CBRS_ALIGN_ANY);
  DockControlBar(&m_wndToolBar);//控制是否开启任意停靠
  完善一下功能:
  在菜单中添加一项“工具栏”,ID设为ID_VIEW_TOOLBAR,一切OK,试试吧!
  七、创建分隔窗口:
  只有框架类可以创建分隔,分隔可以嵌套。
  在.h文件中声明 CSplitterWnd m_wndSplitter;并且包含COneView.h(新建视图类)和CWinFrame.h(新建框架类)文件;
  然后在.cpp文件中加入:
  BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
  {
  if(!m_wndSplitter.CreateStatic(this,1,2))
  return FALSE;
  if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(COneView),CSize(240,420),pContext))
  return FALSE;
  if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CWinFrame),CSize(300,500),pContext))
  return FALSE;
  return TRUE;
  }
  当用户创建好分割窗口后,有时并不希望通过拖动切分条来调节窗口的大小。这时就必须锁定切分条。锁定切分条的最简单的方法莫过于不让CSplitterWnd来处理WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_SETCURSOR消息,而是将这些消息交给CWnd窗口进行处理,从而屏蔽掉这些消息。拿WM_LBUTTONDOWN处理过程来说。修改为如下:
  void CXXSplitterWnd::OnLButtonDown(UINT nFlags,CPoint point)
  {
  CWnd::OnLButtonDown(nFlags,point);
  }
  其余的处理方法类似。
  八、“打开”按钮的设置:
  用类向导创建该按钮的click函数,选择默认值OnOpen,加入以下代码:
  void CYourDlg::OnOpen()
  {
  char szFileFilter[]=
  "BIN File(*.bin)|*.bin|"
  "All File(*.*)|*.*";//文件类型过滤
  CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
  /* CFileDialog dlg(FALSE);
  dlg.m_ofn .lpstrFilter =_T("文本文件(*.txt)*.txt所有文件(*.*)*.*");
  dlg.m_ofn.lpstrDefExt=_T("txt"); */
  if(dlg.DoModal()==IDOK)
  {
  m_path = dlg.GetPathName();//将显示路径的Edit控件命名为m_path,并增加CString变量m_path
  UpdateData(FALSE);
  }
  }
  九、窗口居中:
  在初始化(OnInit)函数中增加:CenterWindow();即可
  十、对话框加状态条:
  UINT indicators[]={ID_INITMESSAGE,ID_SEPARATOR,ID_TIMEMESSAGE,ID_PROGRESS};
  m_statusbar.CreateEx(this,0,WS_CHILD | WS_VISIBLE | CBRS_BOTTOM);
  m_statusbar.SetIndicators(indicators,4);
  m_statusbar.ShowWindow (SW_SHOW);
  RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
  十一、设置初始窗口状态:
  BOOL CObjectNameApp::InitInstance()
  {
  m_pMainWnd->SetWindowText(""); //设置初始窗口标题文本
  m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);//设置初始窗口为最大化
  m_pMainWnd->UpdateWindow();
  }
  对于MDI函数SetWindowText无效,主窗口的标题只能在资源列表中修改,酒窗口标题在**doc.cpp中重载OnNewDocument(),调用SetTitle("LGdownload中文版");来修改。
  设置初始窗口最大化的另一优化方法:
  void CMainFrame::ActivateFrame(int nCmdShow)
  {
  // TODO: Add your specialized code here and/or call the base class
  nCmdShow=SW_MAXIMIZE;
  CFrameWnd::ActivateFrame(nCmdShow);
  }
  十二、对话框透明特效:
  在OnInitDialog()中加入以下代码:
  //加入WS_EX_LAYERED扩展属性
  SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
  GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
  HINSTANCE hInst = LoadLibrary("User32.DLL");
  if(hInst)
  {
  typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
  MYFUNC fun = NULL;
  //取得SetLayeredWindowAttributes函数指针
  fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
  if(fun)fun(this->GetSafeHwnd(),0,128,2);
  FreeLibrary(hInst);
  }
  注意:fun的参数128不能太小,否则就完全透明了!
  十三、设置对话框里的STATIC控件颜色属性:
  在该对话框增加WM_CTLCOLOR事件,加入以下代码:
  if( nCtlColor==CTLCOLOR_STATIC )
  {
  pDC->SetTextColor(RGB(255,255,255));
  pDC->SetBkColor(RGB(91,145,244));
  pDC->SetBkMode(TRANSPARENT); //设置透明
  }
  设置STATIC控件背景透明:
  if( nCtlColor==CTLCOLOR_STATIC )
  {
  pDC->SetBkMode(TRANSPARENT); //设置透明
  return (HBRUSH)::GetStockObject(NULL_BRUSH);
  }
  十四、使窗口的最大化和最小化按钮消失:
  在PreCreateWindow函数中添加以下代码即可:
  int xSize = ::GetSystemMetrics( SM_CXSCREEN );
  int ySize = ::GetSystemMetrics( SM_CYSCREEN );
  cs.cx = xSize * 6 / 10;
  cs.cy = ySize * 6 / 10;
  cs.x = ( xSize - cs.cx ) / 2;
  cs.y = ( ySize - cs.cy ) / 2;
  cs.style &= ~WS_THICKFRAME;
  cs.style &= ~( WS_MAXIMIZEBOX | WS_MINIMIZEBOX );
  cs.dwExStyle |= WS_EX_TOOLWINDOW;
  十五、设置控件字体颜色:(例如STATIC控件)
  在OnCtlColor函数中添加如下代码:(可能需要选择STATIC的简单属性)
  if(nCtlColor==CTLCOLOR_STATIC)
  { pDC->SetTextColor(RGB(255,0,0));
  pDC->SetBkColor(RGB(128,128,128));//设置文本背景色
  pDC->SetBkMode(TRANSPARENT);//设置背景透明
  }
  其他控件的宏定义为:
  .CTLCOLOR_BTN 按钮控件
  .CTLCOLOR_DLG 对话框
  .CTLCOLOR_EDIT 编辑框
  .CTLCOLOR_LISTBOX 列表控件
  .CTLCOLOR_MSGBOX 消息控件
  .CTLCOLOR_SCROLLBAR 滚动条控件
  .CTLCOLOR_STATIC 静态控件
  十六、将字符转换为数字:
  int i = atoi("12345"); 或 sscanf("12345","%d",&i);
  十七、调用外部应用程序可使用的函数:
  CreateProcess、WinExec、ShellExecute。
  例:ShellExecute(pWnd->m_wnd, "open", "my.exe", NULL, NULL, SW_NORMAL)
  一、父窗体句柄,二、命令"open",三、文件路径,四、参数,五、运行路径,六、显示方式
  十八、经典安装程序制作软件:InstallShield for Microsoft Visual C++6.0
  release 方式是在build菜单中的Set Active configuration中改
  在project菜单里面,选Add to Project的component and control来加入ocx控件
  十九、控件的注册:
  1.注册
  regsvr32 x:/xxx/demo.ocx 不一定非得在 Windows 系统目录
  2.卸载
  regsvr32 /u x:/xxx/demo.ocx
  二十、获取当前时间:
  CTime m_time=CTime::GetCurrentTime();
  char szText[100];
  memset(szText,0,100);
  sprintf(szText,"%d_%d_%d",m_time.GetHour(),m_time.GetMinite(),m_time.GetSecond());
  // 如何得到当前时间日期
  CTime time = CTime::GetCurrentTime();
  CString m_strTime = time.Format("%Y-%m-%d %H:%M:%S");
  // 方法二
  SYSTEMTIME ti;
  GetSystemTime(&ti); // 如何得到当前时间日期
  ti.wMilliseconds; // 得到毫秒时间
  SYSTEMTIME time;
  CString str;
  GetLocalTime( &time );
  str.Format( "%04d:%02d:%02d",time.wYear,time.wMonth.....);
  二一、修改单文档程序的标题:
  OnCreat()中加入 SetWindowText("weichao");
  CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中加入 cs.style =WS_OVERLAPPEDWINDOW;
  二二、隐藏程序在任务栏的图标:
  对话框程序放OnInitDialog()函数:
  SetWindowLong(this->m_hWnd,GWL_EXSTYLE,WS_EX_TOOLWINDOW);//隐藏任务拦按钮
  二三、读取编辑框内容:
  GetDlgItemText(IDC_EDIT_TXDATA,m_strTXData);
  二四、自绘菜单宽度不对,高度是对的,解决办法:
  在ClassWizard中的ClassName下,选CMianFrame,在Messages下选WM_CONTEXTMENU并生成相应的函数,如下:
  void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point)
  {
  CMenu menu;
  menu.LoadMenu(IDR_MENU1);//IDR_MENU1是你要弹出菜单的ID号.
  CMenu *popup=menu.GetSubMenu(0);
  popup->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
  }
  二五、重启计算机:
  调用一个API函数ExitWindowsEx就可以了, 两个参数:UFlag,标记,可以选择EWX_REBOOT,EWX_SHUTDOWN,EWX_POWEROFF再或上EWX_FORCE第二个参数就是0了
  二六、无title对话框的移动:
  void CScreenSnapDlg::OnLButtonDown(UINT nFlags, CPoint point)
  {
  //实现窗体无标题移动
  PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
  
  CDialog::OnLButtonDown(nFlags, point);
  }
  二七、获取操作系统版本:
  OSVERSIONINFO OsVersionInfo;//包含操作系统版本信息的数据结构
  OsVersionInfo.dwOSVersionInfoSize= sizeof(OSVERSIONINFO);
  GetVersionEx(&OsVersionInfo);//获取操作系统版本信息
  二八、设置对话框为最顶层:(在OnInitDialog中添加)
  SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
  二九、对话框程序不在任务栏显示:(在OnInitDialog中添加)
  ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
  三十、向对话框窗口添加右键菜单:
  CMenu menu,*pmenu;
  menu.LoadMenu(IDR_MENU1);
  pmenu=menu.GetSubMenu(0);
  
  CPoint ptScreen(point);
  ClientToScreen(&ptScreen);
  
  pmenu->TrackPopupMenu(TPM_RIGHTBUTTON,ptScreen.x,ptScreen.y,this);
  三一、文件查找:(例查找连续的换行符)
  FILE *fp,*fp1;
  int flag=0;
  int ch;
  fp=fopen("c:/test.txt","r");
  fp1=fopen("c:/wrttest.txt","w");
  while(!feof(fp))
  {
  ch=fgetc(fp);
  if(feof(fp))
  break;
  if(ch==’/n’&&flag==1)
  continue;
  else if(ch==’/n’&&flag==0)
  flag=1;
  else
  flag=0;
  fputc(ch,fp1);
  }
  fclose(fp1);
  fclose(fp);
  三二、托盘菜单不点击不能消失的解决办法:
  在菜单之后使用下述代码:
  CPoint pt;
  GetCursorPos(&pt);
  
  SetForegroundWindow();
  NotifyMenu.TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this);
  PostMessage(WM_NULL,0,0);
  三三、对话框由小到大显示的动画效果:
  在InitDialog中增加:
  ShowWindow(SW_HIDE);
  CRect dlgRect;
  GetClientRect(&dlgRect);
  CPoint centerPoint;
  centerPoint.x=dlgRect.Width()/2;
  centerPoint.y=dlgRect.Height()/2;//得到对话框的中点坐标
  CRgn testrgn;
  this->ShowWindow(SW_HIDE);
  int m=GetSystemMetrics(SM_CYSIZEFRAME);
  
  //以下代码实现对话框的动态弹出
  
  for (int i=10;i
  {
  testrgn.CreateRectRgn(centerPoint.x-i,centerPoint.y-i,centerPoint.x+i,centerPoint.y+i);
  SetWindowRgn((HRGN) testrgn,TRUE);
  ShowWindow(SW_SHOW);
  CenterWindow();
  testrgn.DeleteObject();
  }
  三四、按行读出文本文件:
  下面的例酒演示了一行一行取,直到取完。
  CStdioFile myFile;
  CString ReadFileString;
  if(myFile.Open("C:/Readme.txt", Cfile::modeRead) == TRUE)
  {
  while(myFile.ReadString(ReadFileString) != FALSE)
  {
  //... 处理代码
  }
  }
  三五、使用IDC_HAND时提示未定义,加入以下代码:
  #if(WINVER >= 0x0500)
  #define IDC_HAND MAKEINTRESOURCE(32649)
  #endif /* WINVER >= 0x0500 */
  三六、使应用程序启动时不自动创建新文档
  在默认情况下,用AppWizard开发的SDI/MDI应用程序在启动时创建一个新的文档。如果要使应用程序在启动时不创建新文档,只需在应用类CmyApp::InitInstance()函数的ProcessShellCommand调用前加上下面的语句就可以了:
  cmdInfo.m_nShellCommand = CComandLineInfo::FileNothing;
  三七、播放mp3:
  CFileDialog file(true);
  if(file.DoModal()==IDOK)
  {
  CString filename=file.GetFileName();
  if(hwnd!=NULL)
  {
  MCIWndDestroy(hwnd);
  }
  hwnd=MCIWndCreate(this->m_hWnd,NULL,MCIWNDF_NOPLAYBAR,filename);
  ::ShowWindow(hwnd,SW_HIDE);
  MCIWndSetVolume(hwnd,1000);
  MCIWndPlay(hwnd);
  }
  三八、获取屏幕RGB值:OnTimer中添加
  CPoint pos;
  GetCursorPos(&pos);//获取鼠标坐标
  HDC hDC = ::GetDC(NULL);
  COLORREF clr = ::GetPixel(hDC, pos.x, pos.y);
  
  CString ClrText;
  ClrText.Format("R:%d G:%d B:%d",GetRvalue(clr),GetGvalue(clr),GetBvalue(clr));
  三九、打开一个网址:
  打开http://www.sina.com.cn这个站点如下:
  ShellExecute(NULL, "open", "http://www.sina.com.cn",NULL, NULL, SW_MAXIMIZE );
  此命令将以默认浏览器打开http://www.sina.com.cn,并将加开后的窗口最大化。
  又例:
  ShellExecute(NULL, "open", "IEXPLORE.exe http://www.sina.com.cn",NULL, NULL, SW_MAXIMIZE );
  此命令将直接用IE打开一个sina的站点。不过将开一个新的窗口。
  四十、位图按钮:
  CButton *pRadio = (CButton*)GetDlgItem(IDC_RADIO);
  pRadio->SetBitmap(::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP)));
  Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1876000

本文转自
http://blog.const.net.cn/item/44df7022c9b194d3.htm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值