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)));
一、改變視圖背景色:
在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)));