VC++学习笔记

1、控件随窗口大小而自动缩放
void CDVRDlg::OnSize(UINT nType, int cx, int cy)
{
 RECT rcClient;
  if (GetDlgItem(IDC_STATIC_aa))
  {
   GetClientRect(&rcClient);
   rcClient.left+=10;
   rcClient.right-=10;
   rcClient.top+=10;
   rcClient.bottom-=10;
   GetDlgItem(IDC_STATIC_aa)->MoveWindow(&rcClient);
  }
}

2、CButtonST
 
 Short shBtnColor = 30;
 m_bGogo.SetIcon(IDI_HALLOWEEN2, IDI_HALLOWEEN1);//设置按钮图标
 m_bGogo.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, shBtnColor);//设置按钮亮度
 m_bGogo.DrawBorder(FALSE);//设置按钮边框
 m_bGogo.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(0, 128, 0));//设置按钮字体颜色
 m_bGogo.SetAlign(CButtonST::ST_ALIGN_HORIZ_RIGHT);//设置按钮图标位置
 m_bGogo.DrawFlatFocus(TRUE);//设置虚线框

 // HyperLink button
 m_btnHyperLink.SetIcon(IDI_WEB2);
 m_btnHyperLink.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, shBtnColor);
 m_btnHyperLink.SetURL(IDS_WEBADDR);
 m_btnHyperLink.SetTooltipText(IDS_WEBADDR);
 m_btnHyperLink.SetBtnCursor(IDC_HAND2);

3、解析字符串
 CString a = "aaa,sss,ddd,fff";
 CString b[100000];
 int bb = 0;
 for ( int i=0; i<a.GetLength(); i++ )
     if ( a[i]==',' )
     {
         bb ++;
     }
     else
    {
      b[bb] = b[bb] + a[i];
    }

4、取得本地IP
 char name[255];
 CString ip;
 PHOSTENT hostinfo;
 if(gethostname ( name, sizeof(name)) == 0)
 {
  //如果能够获取计算机主机信息的话,则获取本机IP地址
  if ((hostinfo = gethostbyname(name)) != NULL)
  {
   //获取本机IP地址
   LPCSTR ip=inet_ntoa(*(struct in_addr*)*hostinfo->h_addr_list);
   //输出IP地址
   AfxMessageBox(ip);
  }
 }

5、类似CTabCtrl的CPropertySheet

 m_PropertySheet.AddPage(&page1);
 m_PropertySheet.AddPage(&page2);

        //m_PropertySheet.SetActivePage(&page2);
 m_PropertySheet.Create(this, WS_CHILD | WS_VISIBLE, 0); //创建非摸态                            

                                     的属性表
 m_PropertySheet.ModifyStyleEx (0, WS_EX_CONTROLPARENT);   // 当对话框                           

                                        搜索下一 个Tab项时,WS_EX_CONTROLPARENT标记避免了死循环发生的可

能性,他可以让对话框搜索到属性表中的子窗体控件,就象对话框窗体上的其他普通控件一样
 m_PropertySheet.ModifyStyle( 0, WS_TABSTOP ); //允许用户TAB键切换到属性表

 
 CRect rcRect;
 GetWindowRect(&rcRect);
 m_PropertySheet.MoveWindow(rcRect);

6、不要一次发那么大,分成1K大小,循环发送,检查每次发送的返回值
#define SOCK_BUF  1024
DWORD dwSend = 0;
DWORD dwToSend = 0;
while(dwSend < dwDataLen)
{
dwToSend = dwDataLen - dwSend;
if(dwToSend > SOCK_BUF) dwToSend = SOCK_BUF;
int nRet = m_pSockMsg->Send(pDataBuf + dwSend,dwToSend);
if(nRet == SOCKET_ERROR)
 {
 DWORD dwError = GetLastError();
 CString str;
 str.Format("发送错误,错误代码:%d",dwError);
 AfxMessageBox(str);
 break;
 }
 dwSend += nRet;
}

7、工具条图标
  // Set up hot bar image lists.
 CImageList imageList;
 CBitmap  bitmap;

 // Create and set the normal toolbar image list.
 bitmap.LoadBitmap(IDB_TOOLBAR);
 imageList.Create(29, 29, ILC_COLORDDB|ILC_MASK, 13, 1);
 imageList.Add(&bitmap, RGB(255,0,255));
 m_wndToolBar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)imageList.m_hImageList);
 imageList.Detach();
 bitmap.Detach();

 // Create and set the hot toolbar image list.
 bitmap.LoadBitmap(IDB_TOOLBARHOT);
 imageList.Create(29, 29, ILC_COLORDDB|ILC_MASK, 13, 1);
 imageList.Add(&bitmap, RGB(255,0,255));
 m_wndToolBar.SendMessage(TB_SETHOTIMAGELIST, 0, (LPARAM)imageList.m_hImageList);
 imageList.Detach();
 bitmap.Detach();

 // Create and set the hot toolbar image list.
 bitmap.LoadBitmap(IDB_TOOLBARDISABLE);
 imageList.Create(29, 29, ILC_COLORDDB|ILC_MASK, 13, 1);
 imageList.Add(&bitmap, RGB(255,0,255));
 m_wndToolBar.SendMessage(TB_SETDISABLEDIMAGELIST, 0, (LPARAM)imageList.m_hImageList);
 imageList.Detach();
 bitmap.Detach();

8、bmp位图
 1位 2种颜色
2位 4种颜色
4位 16种颜色
8位 256种颜色
16位 65536种颜色
24位 1677万种颜色
32位 1677万种颜色和256级灰度值
36位 687亿种颜色和4096级灰度值

9、贴图
 m_bmpBackground.LoadBitmap(IDB_MAINWND);
 BITMAP bmp;
 if (m_bmpBackground.GetBitmap(&bmp))
 {
  SIZE sizeWnd = {bmp.bmWidth, bmp.bmHeight};
  sizeWnd.cx += GetSystemMetrics(SM_CXBORDER) * 2;
  sizeWnd.cy += GetSystemMetrics(SM_CYBORDER) * 2 + GetSystemMetrics(SM_CYCAPTION);

  SetWindowPos(NULL, 0, 0, sizeWnd.cx, sizeWnd.cy, SWP_NOMOVE | SWP_NOZORDER);
  CenterWindow();
 }


10、//-----------返回符合条件的记录总数----------------------------
int CTreeDataDlg::TreeSumRecordCount(CString strFieldValue)
{
 int Sum=0;
 //----------------使用到的变量进行定义----------
 _RecordsetPtr m_pRecordset;    //用于创建一个查询记录集
 //----------------------------------------------
 CString strSQL,strCurItem;
 //-----------------------------------------------
 strSQL="SELECT * FROM TreeItem where ParentItem like '%" ;
 strSQL=strSQL+strFieldValue+"%'";
 try
 {
  HRESULT hTRes;
  hTRes = m_pRecordset.CreateInstance(_T("ADODB.Recordset"));
  if (SUCCEEDED(hTRes))
  {
   //----------------------------------------------------
   hTRes = m_pRecordset->Open((LPTSTR)strSQL.GetBuffer(130),
    _variant_t((IDispatch

*)(((CTreeDataApp*)AfxGetApp())->m_pTreeConn),true),
    adOpenDynamic,adLockPessimistic,adCmdText);
   if(SUCCEEDED(hTRes))
   {
    TRACE(_T("连接成功!/n"));
    //------------------------------------------
    if(!m_pRecordset->BOF )
    {
     m_pRecordset->MoveFirst ();
     while(!m_pRecordset->adoEOF)
     {
      Sum+=1;
      m_pRecordset->MoveNext ();
     }
    }
    //---------------------------------------
   }
  }
 }
 catch(_com_error e)///捕捉异常
 {
  CString errormessage;
  MessageBox("求符合条件的记录总数出错!",strFieldValue);
 }
 return Sum;
}

11、递归树
void CTreeDataDlg::TreeAddSubTree(CString ParTree, HTREEITEM hPartItem)
{
  //----------------使用到的变量进行定义----------
  _RecordsetPtr m_pTreeRecordset;    //用于创建一个查询记录集
  _variant_t vChild;
  //--------------Tree控件操作变量------------------------
  HTREEITEM hCurrent;
  //----------------------------------------------
  CString strSQL,strCurItem;
  //-----------------------------------------------
  strSQL="SELECT * FROM TreeItem where ParentItem like '%" ;
  strSQL=strSQL+ParTree+"%'";
  try
  {
   HRESULT hTRes;
   hTRes = m_pTreeRecordset.CreateInstance(_T("ADODB.Recordset"));
   if (SUCCEEDED(hTRes))
   {
    //----------------------------------------------------
    hTRes = m_pTreeRecordset->Open((LPTSTR)strSQL.GetBuffer(130),
     _variant_t((IDispatch

*)(((CTreeDataApp*)AfxGetApp())->m_pTreeConn),true),
     adOpenDynamic,adLockPessimistic,adCmdText);
    if(SUCCEEDED(hTRes))
    {
     TRACE(_T("连接成功!/n"));
     //------------------------------------------
     m_pTreeRecordset->MoveFirst();
     if (!(m_pTreeRecordset->adoEOF))
     {
      
      while(!m_pTreeRecordset->adoEOF)
      {
       hCurrent =

m_ctrlTree.InsertItem((LPCTSTR)(_bstr_t)/
        (m_pTreeRecordset->GetCollect("Name")),

hPartItem, NULL);
       if (TreeSumRecordCount(VariantToCString/
        

(m_pTreeRecordset->GetCollect("Name")))>0)
       {//递归
        

TreeAddSubTree(VariantToCString(m_pTreeRecordset->GetCollect("Name")),      
         hCurrent);
       }
       
       if (!(m_pTreeRecordset->adoEOF))
       {
        m_pTreeRecordset->MoveNext();
       }
      }  
     }
     //---------------------------------------
    }
   }
  }
  catch(_com_error e)///捕捉异常
  {
   CString errormessage;
   MessageBox("创建City记录集失败!",ParTree);
  }
}

12、CListCtrl

 m_imagelist.Create(16,16,TRUE,2,2);
 m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
 m_imagelist.Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME));
 m_list.SetImageList(&m_imagelist,LVSIL_SMALL);


 m_font.CreateFont(16, 0,0,0,FW_NORMAL, 0,0,0,
  DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
  DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial");
 m_list.SetFont(&m_font);


/*-----------------------------------------------------------*/ 
 m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
 m_list.SetBkColor(RGB(247,247,255));
 m_list.SetTextColor(RGB(0,0,255));
 m_list.SetTextBkColor(RGB(247,247,255));
 m_list.InsertColumn(0, "学号", LVCFMT_LEFT, 110);
 m_list.InsertColumn(1, "姓名", LVCFMT_LEFT, 130);
 m_list.InsertColumn(2, "成绩", LVCFMT_LEFT, 47);

 m_list.InsertItem(0,"2002112105");
 m_list.SetItemText(0,1,"程红秀");
 m_list.SetItemText(0,2,"96");

//
得到List索引
//

 OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult)
 {
 // TODO: Add your control notification handler code here
 POSITION pos = m_list.GetFirstSelectedItemPosition();
 m_nIndex = m_list.GetNextSelectedItem(pos);  // 得到项目索引
 
 CString a = m_list.GetItemText(m_nIndex,0);
 CString b = m_list.GetItemText(m_nIndex,1);
 CString c = m_list.GetItemText(m_nIndex,2);
 }
//
保存成文本
//
void CListCtrlDlg::OnButtonSave()
{
 // TODO: Add your control notification handler code here
 CStdioFile file;
 if(file.Open("record.txt",CFile::modeCreate | CFile::modeWrite))
 {
  CString strOut = "学号/t/t姓名/t/t成绩/r/n";
  file.WriteString(strOut);
  for(int i=0;i<m_list.GetItemCount();i++)
  {
   strOut=m_list.GetItemText(i,0) + "/t"+m_list.GetItemText(i,1)+"/t        

"+m_list.GetItemText(i,2) +"/r/n";
   file.WriteString(strOut);
  }
  file.Close();
  MessageBox("保存成功!","提示",MB_ICONINFORMATION);
 }
 else
 {
  MessageBox("保存失败!","提示",MB_ICONINFORMATION);
 }
}

13、程序自动启动
 m_bAutoStart = !m_bAutoStart;
 AfxGetApp()->WriteProfileInt(_T("User Info"), _T("AutoStart"), m_bAutoStart);

 HKEY hKey;
 LPCTSTR lpSubKey = _T("SOFTWARE//Microsoft//Windows//CurrentVersion//Run/0");
 RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0L, KEY_ALL_ACCESS, &hKey);
 if (m_bAutoStart)
 {

  TCHAR AppPathName[MAX_PATH];
  GetModuleFileName(NULL, AppPathName, MAX_PATH);
  LPCTSTR lpValue = AppPathName;
  RegSetValueEx(hKey, _T("nsserver"), 0L, REG_SZ, (const BYTE *)lpValue, strlen(lpValue) +

1);
 }
 else
 {
  RegDeleteValue(hKey, _T("nsserver"));
 } 

14、新建文档视图
void CMainFrame::OnInputUnit()
{
 // TODO: Add your command handler code here
 m_currentwin=1;//录入
 if(m_pInput!=NULL)
 {
  m_pInput->MDIActivate();
  return;
 }
 m_pInput=new CRaChildFrame();
 CCreateContext context;
 context.m_pNewViewClass=RUNTIME_CLASS(CInputCertView);
 if(!m_pInput->LoadFrame(IDI_ICON3,WS_MAXIMIZE|WS_OVERLAPPEDWINDOW,this,&context))
  return;
 m_pInput->ShowWindow(SW_SHOWMAXIMIZED);
 m_pInput->InitialUpdateFrame(NULL,true); 
}

另外一种写法
 CChildFrame* pFrame = new CChildFrame();
 CCreateContext context;
 context.m_pCurrentDoc=mp_doc; //that's the way I avoid to create new document every time I open

a new view
 context.m_pNewViewClass=RUNTIME_CLASS(CTSMLView);
 context.m_pNewDocTemplate=pDocTemplate;
 context.m_pLastView=(((CMainFrame *)m_pMainWnd)->GetActiveFrame() ? ((CMainFrame

*)m_pMainWnd)->GetActiveFrame()->GetActiveView() : NULL);
 context.m_pCurrentFrame=((CMainFrame *)m_pMainWnd)->GetActiveFrame();
 if (!pFrame->LoadFrame(IDR_TSMLTYPE,WS_OVERLAPPEDWINDOW | FWS_PREFIXTITLE ,m_pMainWnd, &context

))return;
 pFrame->InitialUpdateFrame(mp_doc,TRUE);


15、只能运行一个实例

 //此程序只能运行一次,用互斥量来判断程序是否已运行
    HANDLE m_hMutex=CreateMutex(NULL,TRUE, m_pszAppName);
    if(GetLastError()==ERROR_ALREADY_EXISTS)
 {
  AfxMessageBox("程序已经运行!");
  return FALSE;
 }

16、在多文档界面下,自动生成一个新的子窗口,而一个实际的应用系统往往
是由用户操作后再生成新的窗口。为了去掉开始的子窗口,可在应用程序文件
分析命令行的语句

  CCommandLineInfo cmdInfo;

  ParseCommandLine(cmdInfo);

  后加入:

  cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing

17、if(AfxMessageBox("真的要退出吗?",MB_YESNO)==IDYES)
 {
  CDialog::OnOK();
 }

18、ACCESS和SQL2000日期

 access表示为:#1981-28-12#  date BETWEEN #2005-04-28 23:59:59# AND #2005-05-24

23:59:59#
 SQLSERVER2000表示为:'1981-02-12'       date BETWEEN '2005-03-21' AND '2005-05-24'

19、初始化应用程序的大小

  BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  {
      int xsize=::GetSystemMetrics(SM_CXSCREEN);
      int ysize=::GetSystemMetrics(SM_CYSCREEN);
      cs.cx=xsize*5/10;
      cs.cy=ysize*5/10;
      cs.x=(xsize-cs.cx)/2;
      cs.y=(ysize-cs.cy)/2;  
  }  其中的5/10是你的初始界面占屏幕的百分比,可以自己修改。如果想使应用程序大小固定添加

cs.style&=~WS_THICKFRAME;

20、全屏FRAME
void CTestView::ShowFullScreen()
{
 CMainFrame *pFrame=(CMainFrame *)(AfxGetApp()->m_pMainWnd);
 if(m_bFullScreen)
 {
  pFrame->ModifyStyle(0,WS_CAPTION);
  pFrame->ModifyStyle(0,WS_THICKFRAME);
  
  pFrame->ShowWindow(SW_SHOWNORMAL);
  m_bFullScreen=0;
 }
 else
 {
  pFrame->ModifyStyle(WS_CAPTION,0);
  pFrame->ModifyStyle(WS_THICKFRAME,0);
  
  pFrame->ShowWindow(SW_MAXIMIZE);
  m_bFullScreen=1;
 }
}

21、如何在对话框中从磁盘读出一个bitmap文件画在上面?

BOOL CAboutDlg::OnInitDialog()
{
   CDialog::OnInitDialog();
   HBITMAP m_hBmp = (HBITMAP)::LoadImage(0,
      "D:bitmap.bmp",
      IMAGE_BITMAP,
      0,
      0,
      LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
   _ASSERT(m_hBmp!=NULL);
   m_pBmp = CBitmap::FromHandle(m_hBmp);
   return TRUE;
}

void CAboutDlg::OnPaint()
{
   CPaintDC dc(this);
   BITMAP bm;
   CDC dcMem;
   VERIFY(m_pBmp->GetObject(sizeof(bm),(LPVOID)&bm));
   dcMem.CreateCompatibleDC(&dc);
   CBitmap *pOldBMP=(CBitmap *)dcMem.SelectObject(m_pBmp);
   BitBlt(dc.m_hDC,0, 0, bm.bmWidth, bm.bmHeight, dcMem.m_hDC, 0, 0, SRCCOPY);
   dcMem.SelectObject(pOldBMP);
   // Do not call CDialog::OnPaint() for painting messages
}


22、全屏显示Dialog
 if(m_bFullScreen)
 {
  SetWindowPlacement(&m_OldWndPlacement);
 }
 else
 {
  GetWindowPlacement(&m_OldWndPlacement); //取得原始窗口位置
  int nFullWidth = GetSystemMetrics(SM_CXSCREEN);
  int nFullHeight = GetSystemMetrics(SM_CYSCREEN);
  
  RECT WindowRect, ClientRect;
  GetWindowRect(&WindowRect);
  GetDlgItem(IDC_VIEW)->GetWindowRect(&ClientRect);

  RECT FullScreenRect;
  FullScreenRect.left = WindowRect.left - ClientRect.left;
  FullScreenRect.top = WindowRect.top - ClientRect.top;
  FullScreenRect.right = WindowRect.right - ClientRect.right + nFullWidth -

FullScreenRect.left;
  FullScreenRect.bottom = WindowRect.bottom - ClientRect.bottom + nFullHeight -

FullScreenRect.top;
  
  WINDOWPLACEMENT wndpl;
  wndpl.length = sizeof(WINDOWPLACEMENT);
  wndpl.flags = 0;
  wndpl.showCmd = SW_SHOWNORMAL;
  wndpl.rcNormalPosition = FullScreenRect;
  SetWindowPlacement(&wndpl);
  
  GetDlgItem(IDC_VIEW)->SetWindowPos(NULL, 0, 0, nFullWidth, nFullHeight, SWP_NOMOVE);
 }
 m_bFullScreen = !m_bFullScreen;

23、数据库连接串
  //连接SQL SERVER
  m_pConnection->Open("Driver=SQL

Server;Database=test;Server=127.0.0.1;UID=sa;PWD=;","","",adModeUnknown);
  //连接ACCESS2000
  m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data

Source=userinfo.mdb","","",adModeUnknown);

24、void CDVRDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
 //在窗口改变之前调用的方法:窗口的最小尺寸。
 //CDialog::OnWindowPosChanging(lpwndpos); //注销这句避免无法最大化窗口 
 if (lpwndpos->cx < 400) lpwndpos->cx = 400;  
 if (lpwndpos->cy < 300) lpwndpos->cy = 300;  
 
}

this->InvalidateRect(CRect(30,y-30,150,y-20),TRUE);//重新绘制矩形,用于更新时间。

void CDVRDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
 //点击鼠标响应事件
 CRect changeApp_rect(77,119,41,95);

 //判断是否在这个changeApp_rect区域,如果在就执行调用其它应用程序操作。
 if(changeApp_rect.PtInRect(point))
 {
  if(AfxMessageBox("确定切换到笔录系统吗?",MB_YESNO)==IDYES)
  {
   WinExec("D://test//Debug//DlgSplashScr.exe",SW_SHOW);
   OnClose();
  }
 }
}

25/
VC中常用的20种方法

一、打开CD-ROM
mciSendString("Set cdAudio door open wait",NULL,0,NULL);
二、关闭CD_ROM
mciSendString("Set cdAudio door closed wait",NULL,0,NULL);
三、关闭计算机
OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVersionInfo); //获取操作系统版本信息
if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
//Windows98,调用ExitWindowsEx()函数重新启动计算机

DWORD dwReserved;
ExitWindowsEx(EWX_REBOOT,dwReserved); //可以改变第一个参数,实现注销用户、
//关机、关闭电源等操作
// 退出前的一些处理程序
}
四、重启计算机
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);
}
五、枚举所有字体
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是一个列表控件变量
六、一次只运行一个程序实例,如果已运行则退出
if( FindWindow(NULL,"程序标题")) exit(0);
七、得到当前鼠标所在位置
CPoint pt;
GetCursorPos(&pt); //得到位置
八、上下文菜单事件触发事件:OnContextMenu事件

九、显示和隐藏程序菜单
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();
}
十、获取可执行文件的图标
HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0);
if (hIcon &&hIcon!=(HICON)-1)
{
pDC->DrawIcon(10,10,hIcon);

}
DestroyIcon(hIcon);
十一、窗口自动靠边程序演示
BOOL AdjustPos(CRect* lpRect)
{//自动靠边
int iSX=GetSystemMetrics(SM_CXFULLSCREEN);
int iSY=GetSystemMetrics(SM_CYFULLSCREEN);
RECT rWorkArea;
BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkAre
a, 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->W

idth())
{//调整右
//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;
十二、给系统菜单添加一个菜单项
给系统菜单添加一个菜单项需要进行下述三个步骤:
首先,使用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);

}
十三、运行其它程序
//1、运行EMAIL或网址
char szMailAddress[80];
strcpy(szMailAddress,"mailto:netvc@21cn.com");
ShellExecute(NULL, "open", szMailAddress, NULL, NULL, SW_SHOWNORMAL);

//2、运行可执行程序
WinExec("notepad.exe",SW_SHOW); //运行计事本
十四、动态增加或删除菜单
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;
}
十五、改变应用程序的图标
静态更改: 修改图标资源IDR_MAINFRAME。它有两个图标,一个是16*16的,另一个是3

2*32的,注意要一起修改。
动态更改: 向主窗口发送WM_SETICON消息.代码如下:
HICON hIcon=AfxGetApp()->LoadIcon(IDI_ICON);
ASSERT(hIcon);
AfxGetMainWnd()->SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon);
十六、另一种改变窗口标题的方法
使用语句 CWnd* m_pCWnd = AfxGetMainWnd( ),然后,再以如下形式调用SetWindowTe
xt()函数:
SetWindowText( *m_pCWnd,(LPCTSTR)m_WindowText);// m_WindowText可以是一个CSt
ring类的变量。
十七、剪切板上通过增强元文件拷贝图像数据
下面代码拷贝通过元文件拷贝图像数据到任何应用程序,其可以放置在CView派生类的函

数中。
CMetaFileDC * m_pMetaDC = new CMetaFileDC();
m_pMetaDC->CreateEnhanced(GetDC(),NULL,NULL,"whatever");
//draw meta file
//do what ever you want to do: bitmaps, lines, text...
//close meta file dc and prepare for clipboard;
HENHMETAFILE hMF = m_pMetaDC->CloseEnhanced();
//copy to clipboard
OpenClipboard();
EmptyClipboard();
::SetClipboardData(CF_ENHMETAFILE,hMF);                                                                 

              
CloseClipboard();

//DeleteMetaFile(hMF);
delete m_pMetaDC;
十八、剪切板上文本数据的传送
把文本放置到剪接板上:
CString source;
//put your text in source
if(OpenClipboard())
{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(source));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}
从剪接板上获取文本:

char * buffer;
if(OpenClipboard())
{
buffer = (char*)GetClipboardData(CF_TEXT);
//do something with buffer here
//before it goes out of scope
}
CloseClipboard();
十九、将捕捉屏幕图像到剪切版中
void CShowBmpInDlgDlg::OnCutScreen()
{
ShowWindow(SW_HIDE);
RECT r_bmp={0,0,::GetSystemMetrics(SM_CXSCREEN),
::GetSystemMetrics(SM_CYSCREEN)};                                                                       

              
HBITMAP hBitmap;
hBitmap=CopyScreenToBitmap(&r_bmp);

//hWnd为程序窗口句柄
if (OpenClipboard())
{
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
}
ShowWindow(SW_SHOW);
}
HBITMAP CShowBmpInDlgDlg::CopyScreenToBitmap(LPRECT lpRect)
{
//lpRect 代表选定区域
{
HDC hScrDC, hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap, hOldBitmap;
// 位图句柄
int nX, nY, nX2, nY2;
// 选定区域坐标
int nWidth, nHeight;
// 位图宽度和高度
int xScrn, yScrn;
// 屏幕分辨率

// 确保选定区域不为空矩形
if (IsRectEmpty(lpRect))
return NULL;
//为屏幕创建设备描述表
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 获得选定区域坐标
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
//确保选定区域是可见的
if (nX<0)

nX = 0;
if (nY<0)
nY = 0;
if (nX2>xScrn)
nX2 = xScrn;
if (nY2>yScrn)
nY2 = yScrn;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap
(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap =(HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,
hScrDC, nX, nY, SRCCOPY);
//得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);

//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);
// 返回位图句柄
return hBitmap;
}
}
二十、如何将位图缩放显示在Static控件中
//在Staic控件内显示位图
void CShowBmpInDlgDlg::ShowBmpInStaic()
{
CBitmap hbmp;
HBITMAP hbitmap;
//将pStatic指向要显示的地方
CStatic *pStaic;
pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);
//装载资源 MM.bmp是我的一个文件名,用你的替换
hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),"MM.bmp",
IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

hbmp.Attach(hbitmap);
//获取图片格式
BITMAP bm;
hbmp.GetBitmap(&bm);
CDC dcMem;
dcMem.CreateCompatibleDC(GetDC());
CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(hbmp);
CRect lRect;
pStaic->GetClientRect(&lRect);
//显示位图
pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Heigh
t(),
&dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcMem.SelectObject(&poldBitmap);
}

26、修改单文档程序的标题:
OnCreat()中加入  SetWindowText("程序标题");
CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中加入  cs.style =WS_OVERLAPPEDWINDOW;
 cs.style &= ~WStyle &= ~WS_THICKFRAME; //不可改变大小

27播放声音
导入 #pragma comment(lib, "Winmm")
 #include "mmsystem.h"
 PlaySound(MAKEINTRESOURCE(IDR_RINGIN), AfxGetResourceHandle(),
  SND_ASYNC | SND_RESOURCE | SND_NODEFAULT);


28.设置窗口最前
    m_pMainWnd->SetWindowPos(&m_pMainWnd->wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);


29.MsgWnd
void CMainFrame::OnViewMsn()
{
 CMsgWnd *pMsgWindow=new CMsgWnd(IDB_SHOWMSG);
 CMsgWnd& msgWindow=*pMsgWindow;
 msgWindow.CreateMsgWindow();
 msgWindow.ShowWindow(SW_SHOW);
 msgWindow.UpdateWindow(); 
}

 

30.代码收集

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<dlgRect.Width()/2+m;i+=1)
 {   
 
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)));


26..Dll调用
 typedef void (WINAPI * TESTDLL)();
 HINSTANCE hmod;
 hmod = ::LoadLibrary ("mfcdll.dll");
 if(hmod==NULL)
 {
  AfxMessageBox("Fail");
 }
 TESTDLL lpproc;
 lpproc = (TESTDLL)GetProcAddress (hmod,"Show");
 if(lpproc!=(TESTDLL)NULL)
  (*lpproc)();
 
 FreeLibrary(hmod);


27.透明窗口
BOOL CTestDlg::OnInitDialog()
{
 CDialog::OnInitDialog();
 
 // TODO: Add extra initialization here
 
 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;
  
  fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
  if(fun)fun(this->GetSafeHwnd(),0,128,2);
  FreeLibrary(hInst);
 }
 return TRUE;  // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}

28.去掉Dialog标题栏
 ModifyStyle( WS_CAPTION, WS_MINIMIZEBOX, SWP_DRAWFRAME );
 设置鼠标:
  BOOL CPartTransparentDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
 {
 // TODO: Add your message handler code here and/or call default
 SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));
 return TRUE;
 }
  拖动窗口,在OnLButtonDown时调用
  PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x, point.y));


29.启动程序
 ::ShellExecute(NULL,"open","http://www.tomcom",NULL,NULL,SW_SHOWNORMAL);

30. 获取系统信息
  // Create system menu style font
 LOGFONT lf;
 ZeroMemory(&lf, sizeof(LOGFONT));
 NONCLIENTMETRICS nm;
 nm.cbSize = sizeof(NONCLIENTMETRICS);
 VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, nm.cbSize, &nm, 0));
 lf = nm.lfMessageFont;
 m_fontWnd.CreateFontIndirect(&lf);

31. 如何去掉CStatic讨厌的背景颜色  

重载WM_CTLCOLOR,同时将static的属性设置为TRANSPARENT
HBRUSH CDialog2::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 
 // TODO: Change any attributes of the DC here

 //
 // 静态文本控件透明
 //
 if(pWnd->GetDlgCtrlID() == IDC_STATIC)  // 需要设置透明背景的static控件的id
  {
  pDC->SetBkMode(TRANSPARENT);
  pDC->SetTextColor(RGB(0,0,0));//此处设置字体的颜色
  
        return  HBRUSH(GetStockObject(HOLLOW_BRUSH));
  // (HBRUSH)GetStockObject(NULL_BRUSH);
  }
 ///
 // 结束添加
 ///
 
 // TODO: Return a different brush if the default is not desired
 return hbr;
}

32. 窗口总在最前
 ::SetWindowPos(m_wndMsn.GetSafeHwnd(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

33. 获取本机IP
std::vector<int>   iplist;
char   szHostName[128];  
struct   hostent   *   pHost;    
unsigned   int   i;    
if(   gethostname(szHostName,   128)   ==   0   )  
{  
pHost   =   gethostbyname(szHostName);    
for(   i   =   0;   pHost!=   NULL   &&   pHost->h_addr_list[i]!=   NULL;   i++   )    
{/*对每一个IP地址进行处理*/  
iplist.push_back((*(struct   in_addr   *)pHost->h_addr_list[i]).S_un.S_addr);
}  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
双缓冲技术可以有效地提高绘图的效率和质量,尤其是在需要频繁更新图像或实现动画效果的情况下。下面介绍一下在 VC++ 中如何使用双缓冲技术绘制图片。 1. 创建位图对象 首先,我们需要创建一个位图对象,用于存储要绘制的图片。可以使用 LoadImage 函数从文件中加载一个位图,也可以使用 CreateBitmap 函数创建一个空的位图对象,然后使用 SetPixel 或者 BitBlt 等函数将图像数据写入到位图中。 2. 创建内存 DC 接下来,我们需要创建一个内存 DC(Device Context)对象,用于在内存中绘制图像。可以使用 CreateCompatibleDC 函数创建一个与屏幕兼容的内存 DC 对象。 3. 将位图对象选入内存 DC 将创建的位图对象选入内存 DC 中,以便在内存中进行绘制操作。可以使用 SelectObject 函数将位图对象选入内存 DC。 4. 绘制图像 在内存 DC 中使用 GDI 函数绘制图像,例如使用 DrawImage 或者 BitBlt 函数将图像从源 DC 复制到内存 DC 中。 5. 将内存 DC 中的图像绘制到屏幕 最后,使用 BitBlt 函数将内存 DC 中的图像绘制到屏幕上,将内存中的图像复制到屏幕 DC 中。 下面是一个简单的示例代码: ``` // 加载位图 HBITMAP hBitmap = LoadImage(NULL, _T("test.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); // 创建内存 DC HDC hMemDC = CreateCompatibleDC(NULL); // 将位图选入内存 DC HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 在内存 DC 中绘制图像 // ... // 将内存 DC 中的图像绘制到屏幕上 HDC hDC = GetDC(hWnd); BitBlt(hDC, 0, 0, cx, cy, hMemDC, 0, 0, SRCCOPY); ReleaseDC(hWnd, hDC); // 释放资源 SelectObject(hMemDC, hOldBitmap); DeleteDC(hMemDC); DeleteObject(hBitmap); ``` 其中,hWnd 是窗口的句柄,cx 和 cy 分别是窗口的宽度和高度。需要注意的是,如果使用了双缓冲技术,就不要直接在窗口 DC 上绘制图像,而是应该在内存 DC 中进行操作,最后再将图像绘制到屏幕上。这样可以避免闪烁和卡顿等问题,提高绘图的效率和质量。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值