一、改变视图背景色:


    在CView的OnDraw函数中添写如下一段程序代码:


    void CFileNameView::OnDraw(CDC* pDC)


    {


CFileNameDoc* pDoc = GetDocument();


ASSERT_VALID(pDoc);


CRect rectClient;


CBrush brushBkColor;


GetClientRect(rectClient);


brushBkColor.CreateSolidBrush(#ff0000); //颜色设置


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, #3c6eaa);


方法二、在InitInstance()(不是OnInitDialog())中加入:


SetDialogBkColor(#ff0000,#00ff00);


注意:要放在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(#ffffff);


    pDC->SetBkColor(#5b91f4);


  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(#ff0000);


   pDC->SetBkColor(#808080);//设置文本背景色


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)));