天天看點

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

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

三六、使應用程式啟動時不自動建立新文檔

在預設情況下,用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)));

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

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

三六、使應用程式啟動時不自動建立新文檔

在預設情況下,用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)));

繼續閱讀