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