|
在視圖類中添加私有bool類型的m_bDraw,m_bDraw在視圖類構(gòu)造函數(shù)中初始化為FALSE.在OnLButtonDown和OnLButtonUp消息函數(shù)中分別設(shè)置為TRUE和FALSE。 在視圖類添加私有CPoint類型m_ptOld,在OnLButtonDown消息函數(shù)中初始化這個(gè)變量m_ptOld=point; void CTestView::OnMouseMove(UINT nFlags, CPoint point)
{ // TODO: Add your message handler code here and/or call default //扇形 CClientDC dc(this); //SetROP2設(shè)置繪圖模式函數(shù) //dc.SetROP2(R2_BLACK); //dc.SetROP2(R2_MERGENOTPEN); CPen pen(PS_SOLID,1,#ff0000); CPen *pOldpen=dc.SelectObject(&pen); if(TRUE==m_bDraw) { dc.MoveTo(m_ptOrigin); dc.LineTo(point); dc.LineTo(m_ptOld); m_ptOld=point; } dc.SelectObject(pOldpen); //連續(xù)線條 /* CClientDC dc(this); CPen pen(PS_SOLID,3,#ff0000); CPen *pOldPen=dc.SelectObject(&pen); if(TRUE==m_bDraw) { dc.MoveTo(m_ptOrigin); dc.LineTo(point); m_ptOrigin=point; } dc.SelectObject(pOldPen); */ CView::OnMouseMove(nFlags, point); }
普通畫刷 void CTestView::OnLButtonUp(UINT nFlags, CPoint point) { CBrush brushRed(RGB (255,0,0)); CBrush brushGreen(RGB (0,255,0)); CBrush brushBlue(RGB (0,0,255)); CClientDC dc(this); dc.FillRect(CRect(m_ptOrigin,point),&brushGreen);
CView::OnLButtonUp(nFlags, point); }位圖畫刷
void CTestView::OnLButtonUp(UINT nFlags, CPoint point) { //創(chuàng)建位圖對(duì)象 CBitmap bitmap; //加載位圖資源 bitmap.LoadBitmap(IDB_BITMAP1); //創(chuàng)建位圖畫刷 CBrush brush(&bitmap); //創(chuàng)建并獲得設(shè)備描述表 CClientDC dc(this); //利用位圖畫刷填充鼠標(biāo)拖拽過程中形成的矩形區(qū)域 dc.FillRect(CRect(m_ptOrigin,point),&brush); CView::OnLButtonUp(nFlags, point); } 透明畫刷 void CTestView::OnLButtonUp(UINT nFlags, CPoint point) { //創(chuàng)建并獲得設(shè)備描述表 CClientDC dc(this); //創(chuàng)建一個(gè)空畫刷;getstockobject的返回類型是HGDIOBJECT,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換 //GetStockObject函數(shù)可以獲取一個(gè)畫刷句柄,F(xiàn)romHandle函數(shù)可以將畫刷句柄轉(zhuǎn)換為畫刷對(duì)象,繪圖操作需要的是一個(gè)畫刷對(duì)象 CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //將空畫刷填入設(shè)備描述表ccwf CBrush *pOldBrush=dc.SelectObject(pBrush); //繪制一個(gè)矩形 dc.Rectangle(CRect(m_ptOrigin,point)); dc.SelectObject(pOldBrush); CView::OnLButtonUp(nFlags, point); }
void CTestView::OnLButtonUp(UINT nFlags, CPoint point)
{ //CClientDC派生于CDC類,構(gòu)造時(shí)自動(dòng)調(diào)用GetDC函數(shù)。一旦定義了CClientDC的一個(gè)對(duì)象就不用再調(diào)用GetDC和ReleaseDC //CClientDC dc(this); //pen里面第一個(gè)參數(shù):線的類型,第二個(gè)參數(shù):線的寬度;第三個(gè)參數(shù):線的顏色(紅,綠,藍(lán)) CPen pen(PS_DASH,1,RGB (255,0,0)); CClientDC dc(this); CPen* pOldPen=dc.SelectObject(&pen); dc.MoveTo(m_ptOrigin); dc.LineTo(point); dc.SelectObject(pOldPen); CView::OnLButtonUp(nFlags, point); }
一、要修改窗口的背景,步驟如下: 1、導(dǎo)入一個(gè)位圖文件。
2、創(chuàng)建一個(gè)View窗體的刪除背景時(shí)的相應(yīng)函數(shù) BOOL CWndMapView::OnEraseBkgnd(CDC* pDC) 或者在view類的OnDraw響應(yīng)函數(shù) void CWndMapView::OnDraw(CDC* pDC) 這兩個(gè)函數(shù)的區(qū)別是,一個(gè)在擦除時(shí)直接將圖片貼上;一個(gè)是先擦除, 然后在OnDraw時(shí)再將圖片貼上。所以,后一個(gè)會(huì)看到閃爍,前一個(gè)則無。
3、創(chuàng)建一個(gè)位圖對(duì)象,和剛導(dǎo)入的位圖相關(guān)聯(lián)。 CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1);
4、創(chuàng)建兼容DC CDC dcCompatibale; dcCompatibale.CreateCompatibleDC(pDC);
5、將位圖選擇到兼容DC中 dcCompatibale.SelectObject(&bitmap);
6、將兼容DC中的內(nèi)容拷貝到當(dāng)前DC中 pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatibale,0,0,SRCCOPY); 代碼如下: BOOL CWndMapView::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default
CBitmap bitmap; //產(chǎn)生一個(gè)位圖變量 bitmap.LoadBitmap(IDB_BITMAP1); //讓它和導(dǎo)入的位圖ID相關(guān)聯(lián)
CDC dcCompatibale; //產(chǎn)生一個(gè)兼容的設(shè)備容器變量 dcCompatibale.CreateCompatibleDC(pDC); /*創(chuàng)建一個(gè)和OnEraseBkgnd函數(shù) 所傳遞的參數(shù)pDC,兼容的設(shè)備容器*/
dcCompatibale.SelectObject(&bitmap); //將位圖變量放入兼容設(shè)備中
CRect rect; //產(chǎn)生一個(gè)矩形變量rect GetClientRect(&rect); //獲得客戶端的矩形區(qū)域,并付值給rect pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatibale,0,0,SRCCOPY); /*使用傳參的指針?biāo)傅脑O(shè)備驅(qū)動(dòng)成員函數(shù),將兼容的設(shè)備驅(qū)動(dòng)復(fù)制過來*/
//如果希望顯示的位圖能自動(dòng)拉伸或收縮,以適應(yīng)窗體的大小,將上面這句話改為。 /* BITMAP map; bitmap.GetBitmap(&map); //先獲取圖片的大小付給map變量 pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatibale, 0,0,map.bmWidth,map.bmHeight,SRCCOPY);*/ //然后用可拉伸的函數(shù)進(jìn)行復(fù)制
return TRUE; /*注意,這里使用系統(tǒng)默認(rèn)的回調(diào)函數(shù), 會(huì)將我們所繪的內(nèi)容擦除。所以必須自己返回一個(gè)BOOL值。 但如果是在view類的OnDraw響應(yīng)函數(shù),就沒有返回了。*/ //return CView::OnEraseBkgnd(pDC); }
建立工程文件 選擇單文檔其他全部默認(rèn)  添加LButtonDown和LButtonUp的消息響應(yīng)函數(shù) 點(diǎn)擊上邊的 查看(v)->建立類向?qū)?br /> 的添加.png) 這里已經(jīng)點(diǎn)擊過Add Funtion ,點(diǎn)擊后工程自動(dòng)添加消息函數(shù)。點(diǎn)擊edit code可以進(jìn)行代碼編輯。 void CTestView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_ptOrigin=point; //MessageBox("view Clicked!"); CView::OnLButtonDown(nFlags, point); } 同理OnLButtonUp消息函數(shù)也一樣添加,代碼為下邊: void CTestView::OnLButtonUp(UINT nFlags, CPoint point) { //1 /* // TODO: Add your message handler code here and/or call default //首先獲取窗口的設(shè)備描述表 HDC hdc; //m_hWnd是CWnd的一個(gè)成員變量用來保存窗口句柄,而CTestView派生于CWnd類。GetDC全局函數(shù)獲取得當(dāng)前窗口的設(shè)備描述表 hdc = ::GetDC(m_hWnd); //移動(dòng)到線條的起點(diǎn) MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); //畫線 LineTo(hdc,point.x,point.y); //釋放設(shè)備描述表 ::ReleaseDC(m_hWnd,hdc); */ //CWnd類提供了成員函數(shù)GetDC和ReleaseDC,先利用Platform SDK函數(shù)實(shí)現(xiàn)畫線功能時(shí),這兩個(gè)函數(shù)前面都加::表示全局 //函數(shù) //2 /* //MFC封裝了CDC類(一個(gè)設(shè)備描述表) CDC* pDC=GetDC(); pDC->MoveTo(m_ptOrigin); pDC->LineTo(point); ReleaseDC(pDC); */ //3 /* //CClientDC派生于CDC類,構(gòu)造時(shí)自動(dòng)調(diào)用GetDC函數(shù)。一旦定義了CClientDC的一個(gè)對(duì)象就不用再調(diào)用GetDC和ReleaseDC //CClientDC dc(this); CClientDC dc(GetParent()); dc.MoveTo(m_ptOrigin); dc.LineTo(point); */ //4 //CwindowDC的優(yōu)勢(shì):對(duì)象可以訪問整個(gè)窗口區(qū)域 //CWindowDC dc(this); CWindowDC dc(GetParent()); dc.MoveTo(m_ptOrigin); dc.LineTo(point); CView::OnLButtonUp(nFlags, point); }
SHCreateDirectoryEx是window flatform下建立文件夾的函數(shù),他的功能比CreateDirectory(Ex)大。如果創(chuàng)建文件夾目錄有的中間目錄不存在,SHCreateDirectoryEx可以建立,而CreateDirectory(Ex)則做不到這一點(diǎn)。
int SHCreateDirectoryEx( HWND hwnd, LPCTSTR pszPath, SECURITY_ATTRIBUTES *psa ); hwnd是窗口句柄,可以為NULL. psa是安全屬性設(shè)置項(xiàng),可以為NULL. pszPath要注意,這個(gè)路徑必須是絕對(duì)路徑. 比如c:\test, d:\hello, 不能寫成test,也不能寫成.\test這樣的相對(duì)路徑。
設(shè)置文件或目錄的屬性,函數(shù)原型如下: BOOL SetFileAttributes( LPCTSTR lpFileName, DWORD dwFileAttributes); 參數(shù): lpFileName:輸入?yún)?shù),為需要設(shè)置文件屬性的文件或目錄。 返回值: 返回BOOL值,表示是否成功。 使用說明: 文件系統(tǒng)中對(duì)文件屬性的表示使用了DWORD類型的數(shù)據(jù),多個(gè)文件屬性用“|”運(yùn)算連在一起 DWORD GetFileAttributes( LPCTSTR lpFilename); 參數(shù): hFileName: 輸入?yún)?shù),為需要獲取屬性的文件或目錄 返回值: 返回DWORD值,表示文件屬性。如果返回INVALID_FILE_ATTRIBUTES,則表示失敗,可使用GetLastError函數(shù)獲取錯(cuò)誤信息 使用說明: 要判斷文件屬性,需要使用“&”與屬性常量進(jìn)行運(yùn)算,如果運(yùn)行結(jié)果為真,則表示具有這種屬性 DWORD GetFileAttributes( LPCTSTR lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId, LPVOID lpFileInfomation); 參數(shù): lpFileName: 輸出參數(shù),為需要獲取屬性的文件或目錄 fInfoLevelId:輸入?yún)?shù),是獲取文件屬性的類別,會(huì)影響到lpFileInfomation參數(shù)具體采用什么形式輸出結(jié)果。但是本參數(shù)一般只能指定為GetFileExInfoStandard lpFileInfomation: 輸出參數(shù),用于返回結(jié)果。如果fInfoLevelId參數(shù)為GetFileInfoStandard,則為LPWIN32_FILE_ATTRIBUTE_DATA類型。 返回值: 返回BOOL值,表示十分成功
這個(gè)錯(cuò)誤首先要在當(dāng)前文檔頭文件添加#include "stdio.h" 嘗試編譯如果不行注意添加的stdio.h要在原來的XXXX.h的下面。 如果使用的是vs2008要把工程的屬性從Unicode改成多字符集。
原理: (1)在NM_CUSTOMDRAW消息處理函數(shù)中根據(jù) dwDrawStage 狀態(tài)來編寫不同的處理代碼 (2)主要是判斷 CDDS_ITEMPREPAINT 狀態(tài) (3)不要在對(duì)話框資源管理器中設(shè)置CListCtrl控件的Owner draw fixed屬性,否則在Debug模式下報(bào)錯(cuò)。 方法一,使用NM_CUSTOMDRAW消息映射 (1)聲明消息處理函數(shù):afx_msg void OnCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult ); (1)手動(dòng)添加消息映射:ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomDrawList ) (2)編寫自繪消息處理函數(shù) void CListCtrl2::OnCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult ) { NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); *pResult = CDRF_DODEFAULT; int rowIndex = static_cast<int>(pLVCD->nmcd.dwItemSpec); if(pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT) { *pResult = CDRF_NOTIFYITEMDRAW; } else if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) { *pResult = CDRF_NOTIFYSUBITEMDRAW; }//畫項(xiàng) else if (pLVCD->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM)) { int nitem = static_cast<int> (pLVCD->nmcd.dwItemSpec); int nsubitem = pLVCD->iSubItem; CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc); CString str; CRect rect; CSize msize; UINT nFormat = DT_VCENTER | DT_SINGLELINE; rect.left += 3; //調(diào)整自繪輸出位置 //get rect of the sub item which is going to paint GetSubItemRect(nitem,nsubitem,LVIR_BOUNDS,rect); //get the context is going to paint on the subitem str = GetItemText(nitem,nsubitem);
//如果選中 if(LVIS_SELECTED == this->GetItemState(rowIndex,LVIS_SELECTED)) //判斷當(dāng)前項(xiàng)是否選中 { //所畫項(xiàng)是選中項(xiàng) pDC->SetTextColor(#d93c28);//字體顏色,因該是白色 pDC->FillSolidRect(&rect,#567de4);//背景,深藍(lán)色吧,試試 } else { pDC->SetTextColor(#000000);//字體顏色,因該是白色 pDC->FillSolidRect(&rect,#ffffff);//背景,深藍(lán)色吧,試試 } msize = pDC->GetTextExtent(str); pDC->DrawText(str, &rect, nFormat); //自繪輸出 *pResult = CDRF_SKIPDEFAULT; } }
ShellExecute( hWnd: HWND; {指定父窗口句柄} Operation: PChar; {指定動(dòng)作, 譬如: open、print} FileName: PChar; {指定要打開的文件或程序} Parameters: PChar; {給要打開的程序指定參數(shù); 如果打開的是文件這里應(yīng)該是 nil} Directory: PChar; {缺省目錄} ShowCmd: Integer {打開選項(xiàng)} ): HINST; {執(zhí)行成功會(huì)返回應(yīng)用程序句柄; 如果這個(gè)值 <= 32, 表示執(zhí)行錯(cuò)誤} //返回值可能的錯(cuò)誤有: = 0 {內(nèi)存不足} ERROR_FILE_NOT_FOUND = 2; {文件名錯(cuò)誤} ERROR_PATH_NOT_FOUND = 3; {路徑名錯(cuò)誤} ERROR_BAD_FORMAT = 11; {EXE 文件無效} SE_ERR_SHARE = 26; {發(fā)生共享錯(cuò)誤} SE_ERR_ASSOCINCOMPLETE = 27; {文件名不完全或無效} SE_ERR_DDETIMEOUT = 28; {超時(shí)} SE_ERR_DDEFAIL = 29; {DDE 事務(wù)失敗} SE_ERR_DDEBUSY = 30; {正在處理其他 DDE 事務(wù)而不能完成該 DDE 事務(wù)} SE_ERR_NOASSOC = 31; {沒有相關(guān)聯(lián)的應(yīng)用程序} //ShowCmd 參數(shù)可選值: SW_HIDE = 0; {隱藏} SW_SHOWNORMAL = 1; {用最近的大小和位置顯示, 激活} SW_NORMAL = 1; {同 SW_SHOWNORMAL} SW_SHOWMINIMIZED = 2; {最小化, 激活} SW_SHOWMAXIMIZED = 3; {最大化, 激活} SW_MAXIMIZE = 3; {同 SW_SHOWMAXIMIZED} SW_SHOWNOACTIVATE = 4; {用最近的大小和位置顯示, 不激活} SW_SHOW = 5; {同 SW_SHOWNORMAL} SW_MINIMIZE = 6; {最小化, 不激活} SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE} SW_SHOWNA = 8; {同 SW_SHOWNOACTIVATE} SW_RESTORE = 9; {同 SW_SHOWNORMAL} SW_SHOWDEFAULT = 10; {同 SW_SHOWNORMAL} SW_MAX = 10; {同 SW_SHOWNORMAL} //舉例說明更多問題 (別忘了 uses ShellAPI;): {譬如用記事本打開一個(gè)文件} begin ShellExecute(Handle, 'open', 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end; {第一個(gè)參數(shù)是用來當(dāng)作錯(cuò)誤提示窗口的父窗口的, 不能是 nil, 可以是 0(也就是桌面窗口)} begin ShellExecute(0, 'open', 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end; {第二個(gè)參數(shù)如果是 nil, 也會(huì)默認(rèn)位 open} begin ShellExecute(0, nil, 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end; {文件路徑可以放在參數(shù)五} begin ShellExecute(0, nil, 'notepad.exe', 'SchedLgU.Txt', 'C:\WINDOWS', SW_SHOWNORMAL); end; {把參數(shù)三直接指定為要打開的文件, 文件將用對(duì)應(yīng)默認(rèn)程序打開; 次數(shù)參數(shù)四應(yīng)為 nil} begin ShellExecute(0, nil, 'SchedLgU.Txt', nil, 'C:\WINDOWS', SW_SHOWNORMAL); end; {如果文件在: 程序目錄/當(dāng)前目錄/System32/Windows/PATH環(huán)境變量中, 參數(shù)五也可以 nil} begin ShellExecute(0, nil, 'SchedLgU.Txt', nil, nil, SW_SHOWNORMAL); end; {如果參數(shù)三是個(gè)文件, 可以用參數(shù)二命令打印} begin ShellExecute(0, 'print', 'SchedLgU.Txt', nil, nil, 1); end; {用 IE 打開網(wǎng)頁} begin ShellExecute(Handle, 'open', 'IExplore.EXE', 'about:blank', nil, SW_SHOWNORMAL); end; {用火狐打開網(wǎng)頁} begin ShellExecute(Handle, 'open', 'firefox.exe', 'about:blank', nil, SW_SHOWNORMAL); end; {用默認(rèn)瀏覽器打開網(wǎng)頁} begin ShellExecute(Handle, 'open', 'Explorer.exe', 'about:blank', nil, SW_SHOWNORMAL); end; {還是用默認(rèn)瀏覽器打開網(wǎng)頁} begin ShellExecute(0, nil, 'http://del.cnblogs.com', nil, nil, 1); end;
|