1) CCAction如果是用具體類的actionWithFile(.....)或類似這樣的接口的,則系統默認都是有自動維護引用計數的。即:這類對象創建出來后我們不需要釋放。
2) CCSprite::runAction()接口請一定要與CCSprite::stopAction()或CCSprite::stopAllActions()配合使用。
3) CCSprite在執行CCMoveTo動作時,此時如果再對其設置幀動畫動作,則這兩個動作將是會共存執行的。
------
以上3點很重要。
常用鏈接留言簿(1)我參與的團隊隨筆分類隨筆檔案文章分類文章檔案轉載的鏈接
搜索最新評論
閱讀排行榜評論排行榜 |
CCSprite的動作總結
1) CCAction如果是用具體類的actionWithFile(.....)或類似這樣的接口的,則系統默認都是有自動維護引用計數的。即:這類對象創建出來后我們不需要釋放。 2) CCSprite::runAction()接口請一定要與CCSprite::stopAction()或CCSprite::stopAllActions()配合使用。 3) CCSprite在執行CCMoveTo動作時,此時如果再對其設置幀動畫動作,則這兩個動作將是會共存執行的。 ------ 以上3點很重要。 在介紹前,先介紹說幾點:
像opengl、directx是沒有自帶界面的,不過cocos可以為我們創建一個主界面,以用于顯示游戲場景等。該主界面由CCDirector類實例實現。 cocos2d中所有需要用到的類,基本上都繼承自CCObject類。它維護一個引用計數。所有從CCObject出來的類,都可以添加到自動釋放池中進行自動維護。(與objective-c中的對象有點類似) 多數情況下,我們使用的對象,還是從CCNode出來的。CCNode是繼承自CCObject的一個類。 下面簡要介紹下各個主要類的功能 1) CCDirector 主要功能一:負責生成一個游戲主界面及游戲的初始化并。并在該界面上,渲染游戲場景。 主要功能二:負責控制各游戲場景間的相互切換。 主要功能三:負責初始化設置游戲的一些重要屬性。如:游戲渲染的幀率。游戲視窗的尺寸(即:960 X 640 還是 480 X 320等) 主要功能四:負責清空游戲中的緩存數據(個人認為這個還是很重要的。因為到了手機上的游戲,硬內存不多,及時清除是很有必要的) 注意:該對象是單實例的,不需要用戶維護。 2) CCScene 游戲中的場景類。當程序啟動后,必須要為其設置一個場景,然后所有的對象在場景中場景。 主要功能:負責接收游戲中的任何對象。并將它們展現出來(如果可以展現的話,如:CCSprite等) 習慣上,用其維護多個的CCLayer 3) CCLayer 游戲中的層。習慣上,用其對資源展現進行布局管理。 4) CCSprite 游戲中的精靈對象。游戲中,必不可少的。會用到許多的可視對象。這些,多數都是精靈對象。 5) CCTargetedTouchDelegate 觸摸響應類。提供響應觸摸響應開始結束、觸摸移動以及取消觸摸幾個接口。多是需要在其派生類中進行具體實現。如:一個精靈, 可支持觸摸功能,則它需要自行實現這些接口。 以上只是簡單介紹cocos2d中的幾個較為主要及常用的類。初學,如有介紹不對的,請大家不吝指點。共同學習,共同進步。 編程時在C中需要用的類似Java的Split函數來解析一個長字符串,分割成子段使用,查函數庫發現有strtok可用,看了示例卻對它的用法有些疑惑為什么傳值是NULL,于是上網查資料,找到這篇包含strtok函數源碼的解釋,轉過來學習,仔細研讀收獲良多。 查函數庫看到的strtok的解釋和示例: strtok
Syntax: #include <cstring> char *strtok( char *str1, const char *str2 );
The strtok() function returns a pointer to the next "token" in str1, where str2 contains the delimiters that determine the token. strtok() returns NULL if no token is found. In order to convert a string to tokens, the first call to strtok() should have str1 point to the string to be tokenized. All calls after this should have str1 be NULL. For example:
The above code will display the following output:
下面是查到的網絡文章對源碼的解釋: 原型:char * strtok(char * s,const char * ct) 用途:在s中找出以ct中的字符為分隔的字符串,即是源串中除去了含有分隔串中的所有字符后余下的一段段的字符串,每調用一次找到一串,找不到則返回空串。第一次調用必須傳給它有效的字符串,第二次傳NULL就可以了,每次調用返回找到的子串的時候都會把源串中該子串的尾部字符(原來是搜索串中的某一字符)修改成'/0'字符返回值為每次調用得到的字串。 下面看一下它的使用 ///char *pbody= "Presetptz/r/nPreset1=hello/r/nPreset2=ttttt/r/nend/r/n";//errror char *___strtok;//關鍵這個全局指針變量 char * strtok(char * s,const char * ct) 其中: char * strpbrk(const char * cs,const char * ct)//返回指向ct中任一字符在cs中第一次出現的位置 這個函數不難分析,___strtok指針指向除去第一個有效字串后面的位置,到這里我們應該清楚為什么第二次調用時只要傳NULL就可以了,當然這里也暴露了它的缺點,就是說不能有兩個線程同時使用strtok否則就會出現錯誤。還有就是我在使用這個函數時碰到的問題,如上面的代碼如果我把sbody換成 pbody,則編譯沒有問題,運行時就會出錯,為什么?還是自己的基本功不扎實,pbody在是個靜態字符串,說白了,它是在編譯時就已經賦值而且相當于是一個const常量,不能被修改,而strtok是需要修改字符串的,所以產生問題不足為奇。 原文出處:http://www.cnblogs.com/finallyliuyu/archive/2010/10/11/1848130.html ================================================================================== 本文由青松原創并依GPL-V2及其后續版本發放,轉載請注明出處且應包含本行聲明。 C++中常用rand()函數生成隨機數,但嚴格意義上來講生成的只是偽隨機數(pseudo-random integral number)。生成隨機數時需要我們指定一個種子,如果在程序內循環,那么下一次生成隨機數時調用上一次的結果作為種子。但如果分兩次執行程序,那么由于種子相同,生成的“隨機數”也是相同的。 在工程應用時,我們一般將系統當前時間(Unix時間)作為種子,這樣生成的隨機數更接近于實際意義上的隨機數。給一下例程如下: #include <iostream> int main() double random(double start, double end) int main() double random(double start, double end) 另:在Linux下利用GCC編譯程序,即使我執行了1000000次運算,是否將random函數定義了inline函數似乎對程序沒有任何影響,有理由相信,GCC已經為我們做了優化。但是冥冥之中我又記得要做inline優化得加O3才行... 不行,于是我們把循環次數改為10億次,用time命令查看執行時間: real 2m7.768s real 2m7.269s 前一次為進行inline優化的情形,后一次為沒有作inline優化的情形,兩次結果相差不大,甚至各項指標后者還要好一些,不知是何緣由... =================================================================================
原諒轉載自:http://lukas06.blog.sohu.com/94010246.html 如果希望動態鏈接庫文件在編譯時,導出函數的名稱不要發生改變,那么在定義導出函數時,需要加上限定符:extern "C"。注意:雙引號中的“C”一定要大寫。 例如:Dll1.h頭文件 DLL1_API int add(int a,int b); 但是還有一個問題是,如果使用了標準調用約定,也就是pascal調用約定,WINAPI調用約定:_stdcall,此時即使使用了extern "C",仍然會出現導出函數名字被改編的問題。例如:使用C語言編寫一個DLL文件,而客戶端使用Delphi進行編寫,那么在編寫導出函數時,應該指定其使用標準的函數調用約定。此時,就會出現問題,即C語言編寫的DLL文件的導出函數發生了名字改編。在這種情況下,可以使用一個稱為模塊定義文件(DEF)的方式解決名字改編問題。 EXPORTS LIBRARY "VerifyLocalResType" EXPORTS VerifyDDSSize
原為某著名軟件公司試題,大意如下:請實現以下兩個函數:char toupper(char c); char tolower(char c); 分別用于將傳入的字母轉為大寫和小寫。兩個函數傳入的參數取值范圍都是[a-zA-Z],并且為ASCII編碼,實現時不用檢查參數合法性。兩個函數的實現不能使用任何形式的分支、跳轉等類型的語句或指令(特別說明:C/C++的條件操作符?:也是分支指令的一種形式,故而不能使用)。請盡可能多的寫出你知道的辦法。 分析解決:此題比較特別,限制嚴格,根據題目要求,排除if else、for、while、do while、switch case、?:外,能使用的語句就只有 =、+=、-=、&、|、^、++、--這些了,想要實現大小寫轉換,只能從這些語句中進行選擇思考,由于字符集為ASCII編碼,且范圍明確為[a-zA-Z],我們知道,a-z對應ASCII值為97-122,A-Z對應ASCII為65-90,觀察這些數字,可以發現97-122都大于96 ,65-90都大于64且小于96,進一步從二進制上考慮,則發現所有小寫字母對應的二進制形式為011XXXXX,大寫字母對應的二進制形式為010XXXXX,一到這里,哈哈,答案就出來了,通過位運算&和|就可實現了。代碼描述如下 1char toupper(char c)
#include <time.h>
//* 方法一 time_t tt = time(NULL);//這句返回的只是一個時間cuo tm* t= localtime(&tt); printf("%d-%02d-%02d %02d:%02d:%02d\n", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); //* 方法二 SYSTEMTIME st = {0}; GetLocalTime(&st); printf("%d-%02d-%02d %02d:%02d:%02d\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); 下面幾個,是網上找的:轉載地址:http://apps.hi.baidu.com/share/detail/17815869 注意:GetLocalTime()與GetSystemTime()是有區別的
http://www.4ucode.com/Study/Topic/1996448
VS2008中創建DLL工程 文件->新建->項目->visual c++->win32->win32控制臺應用程序(win32項目也可以) 填寫項目名稱MyDLL->確定->下一步->DLL(附加選項 對空項目打鉤)->完成。 到這里DLL工程就創建完畢了,下面新建兩個文件testDLL.cpp和testDLL.h。 C++ .h 文件 #define DLL_EXPORT __declspec(dllexport) extern "C" DLL_EXPORT int MyMinus(int a,int b); .cpp 文件 // testDLL.cpp : 定義 DLL 應用程序的導出函數。 // #include "stdafx.h" #include "testDLL.h" int MyMinus(int a,int b) { return (a-b); } delphi調用代碼 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) edt1: TEdit; edt2: TEdit; lbl1: TLabel; lbl2: TLabel; lbl3: TLabel; btn1: TButton; lbl4: TLabel; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; const TestDll = 'testDLL.dll'; function MyMinus(a:Integer;b:Integer):Integer;cdecl;external TestDll; implementation {$R *.dfm} procedure TForm1.btn1Click(Sender: TObject); begin lbl4.Caption := IntToStr(MyMinus(StrToInt(edt1.Text),StrToInt(edt2.Text))); end; end.
原諒轉載自:http://tech.ddvip.com/2008-11/122662837992492.html
Visual C++中提供的MFC類CtreeCtrl(樹型控件)用來顯示具有一定層次結構的數據項時方便、直觀,所以它已經被廣泛地應用在各種軟件中,如資源管理器中的磁盤目錄就用的是樹型控件,我們在編程中也會經常用到這個控件,但是這個控件也有缺陷,那就是它并不直接支持拖動節點等高級特性,這使得程序員在編程時使用它受到了很大限制,同時又給軟件用戶帶來了一些不便。為此,本實例通過從 CTreeCtrl 中派生了一個類 CXTreeCtrl ,實現樹型控件中節點的拖動。這個類具有如下的功能:⑴ 基本項目條拖動的實現;⑵ 處理項目條的無意拖動;⑶ 能處理項目條拖動過程中的滾動問題;⑷ 拖動過程中節點會智能展開。程序編譯運行后的效果如圖所示:
圖一:樹型控件節點拖動示例 一、實現方法 我們針對上述自定義類的實現功能,介紹實現思路和方法。 (1)基本項目條拖動的實現 當我們要拖動樹型控件的一個項目條時,樹型控件會給它的父窗口發送一個TVN_BEGINDRAG通知消息,所以可以在此消息的響應函數中,調用 CTreeCtrl ::CreateDragImage ()函數創建表示當前項目條正處在拖動操作中的圖象,該函數創建的圖象由項目條的圖象和標簽文本組成。創建了拖動圖象后,調用CImageList::BeginDrag()函數指定拖動圖象的熱點位置,然后調用CImageList::DragEnter()函數顯示拖動圖象。接下來處理 WM_MOUSEMOVE 消息用于更新拖動圖象,我們想讓移動中的圖象經過某些項目時高亮度顯示,這可以調用 CTreeCtrl ::SelectDropTarget() 來實現。在調用 SelectDropTarget()函數之前,需要先調用CImageList::DragShowNolock ( false )函數來隱藏圖象列表,然后再調用CImageList::DragShowNolock ( true ) 函數來恢復圖象列表的顯示,這樣就不會在拖動過程中留下難看的軌跡。最后我們處理 WM_LBUTTONUP 消息用于完成拖動操作,在該消息響應函數中,我們需要完成結束拖動圖象的顯示、刪除拖動圖象、釋放鼠標、節點的拷貝/刪除等操作。在節點的拷貝/刪除操作中,如果是父節點拖到子節點上,我們可以先將父節點拷到根結點下的臨時節點中,再從臨時結點處拷到子節點,然后將根結點下的臨時節點刪除,這樣做的目的是防止產生異常。 (2)處理項目條的無意拖動 牐犎綣在鼠標按下時不小心移動了鼠標,這時系統就認為產生了一個移動操作,這就產生了誤操作。解決這個問題的方法是設置時間延遲,也就是說當用戶按下鼠標后必須在原位置停留一段時間,才能激活拖動操作。 (3)處理拖動過程中的滾動問題 當我們拖動樹型控件的項目條時,如果目的節點不可見,則需要拖動滾動條或收攏其它一些節點以使得目的節點顯示出來,無疑,這會給我們帶來很大的不便。為此就要給樹型控件添加自動滾動支持。首先設置一個定時器,在 WM_TIMER 消息中檢測鼠標的位置,如果靠近樹型控件的下邊緣,則使得控件向下滾動。靠近上邊緣則向上滾動。滾動速度根據鼠標的位置確定。 (4)拖動過程中節點的智能展開 為了實現在拖動過程中鼠標停留在某個節點上一段時間后,該節點會自動展開的功能。設置一個定時器,當鼠標在拖動過程中停止在某個節點上時,定時器被啟動,再設置一變量保存當前的鼠標位置。 二、編程步驟 1、 新建一對話框工程DragTree,編輯資源,在對話框中加入一樹型控件IDC_TREE ,屬性設置為:Has Buttons、Has Lines、Lines at root、Edit Labels、Border; 2、 使用Class Wizard給該控件添加一個成員變量 m_wndTree ,在代碼部分將該控件的類型修改為CXTreeCtrl。 3、 在對話框的OnInitDialog()函數中添加代碼,初始化樹型控件的項目條; 4、 制作一個圖像資源(ID為IDB_TREEIMAGE),其中包含兩個小圖標,用來作為樹型控件項目條的顯示圖標; 5、 添加代碼,編譯運行程序。 三、程序代碼 // XTreeCtrl.h : header file
#if !defined(AFX_XTREECTRL_H__3EF12526_EF66_4FD9_A572_59476441D79A__INCLUDED_) #define AFX_XTREECTRL_H__3EF12526_EF66_4FD9_A572_59476441D79A__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CXTreeCtrl : public CTreeCtrl { // Construction public: CXTreeCtrl(); // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CXTreeCtrl) //}}AFX_VIRTUAL // Implementation public: virtual ~CXTreeCtrl(); // Generated message map functions protected: UINT m_TimerTicks; //處理滾動的定時器所經過的時間 UINT m_nScrollTimerID; //處理滾動的定時器 CPoint m_HoverPoint; //鼠標位置 UINT m_nHoverTimerID; //鼠標敏感定時器 DWORD m_dwDragStart; //按下鼠標左鍵那一刻的時間 BOOL m_bDragging; //標識是否正在拖動過程中 CImageList* m_pDragImage; //拖動時顯示的圖象列表 HTREEITEM m_hItemDragS; //被拖動的標簽 HTREEITEM m_hItemDragD; //接受拖動的標簽 //{{AFX_MSG(CXTreeCtrl) afx_msg void OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnTimer(UINT nIDEvent); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: HTREEITEM CopyBranch(HTREEITEM htiBranch,HTREEITEM htiNewParent,HTREEITEM htiAfter); HTREEITEM CopyItem(HTREEITEM hItem,HTREEITEM htiNewParent,HTREEITEM htiAfter); }; #endif //////////////////////////////////////////////////////////// CXTreeCtrl #include "stdafx.h" #include "DragTree.h" #include "XTreeCtrl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define DRAG_DELAY 60 CXTreeCtrl::CXTreeCtrl() { m_bDragging = false; } CXTreeCtrl::~CXTreeCtrl() {} BEGIN_MESSAGE_MAP(CXTreeCtrl, CTreeCtrl) //{{AFX_MSG_MAP(CXTreeCtrl) ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag) ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() ON_WM_LBUTTONDOWN() ON_WM_TIMER() //}}AFX_MSG_MAP END_MESSAGE_MAP() void CXTreeCtrl::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; *pResult = 0; //如果是無意拖曳,則放棄操作 if( (GetTickCount() - m_dwDragStart) < DRAG_DELAY ) return; m_hItemDragS = pNMTreeView->itemNew.hItem; m_hItemDragD = NULL; //得到用于拖動時顯示的圖象列表 m_pDragImage = CreateDragImage( m_hItemDragS ); if( !m_pDragImage ) return; m_bDragging = true; m_pDragImage->BeginDrag ( 0,CPoint(8,8) ); CPoint pt = pNMTreeView->ptDrag; ClientToScreen( &pt ); m_pDragImage->DragEnter ( this,pt ); //"this"將拖曳動作限制在該窗口 SetCapture(); m_nScrollTimerID = SetTimer( 2,40,NULL ); } void CXTreeCtrl::OnMouseMove(UINT nFlags, CPoint point) { HTREEITEM hItem; UINT flags; //檢測鼠標敏感定時器是否存在,如果存在則刪除,刪除后再定時 if( m_nHoverTimerID ) { KillTimer( m_nHoverTimerID ); m_nHoverTimerID = 0; } m_nHoverTimerID = SetTimer( 1,800,NULL ); //定時為 0.8 秒則自動展開 m_HoverPoint = point; if( m_bDragging ) { CPoint pt = point; CImageList::DragMove( pt ); //鼠標經過時高亮顯示 CImageList::DragShowNolock( false ); //避免鼠標經過時留下難看的痕跡 if( (hItem = HitTest(point,&flags)) != NULL ) { SelectDropTarget( hItem ); m_hItemDragD = hItem; } CImageList::DragShowNolock( true ); //當條目被拖曳到左邊緣時,將條目放在根下 CRect rect; GetClientRect( &rect ); if( point.x < rect.left + 20 ) m_hItemDragD = NULL; } CTreeCtrl::OnMouseMove(nFlags, point); } void CXTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point) { CTreeCtrl::OnLButtonUp(nFlags, point); if( m_bDragging ) { m_bDragging = FALSE; CImageList::DragLeave( this ); CImageList::EndDrag(); ReleaseCapture(); delete m_pDragImage; SelectDropTarget( NULL ); if( m_hItemDragS == m_hItemDragD ) { KillTimer( m_nScrollTimerID ); return; } Expand( m_hItemDragD,TVE_EXPAND ); HTREEITEM htiParent = m_hItemDragD; while( (htiParent = GetParentItem(htiParent)) != NULL ) { if( htiParent == m_hItemDragS ) { HTREEITEM htiNewTemp = CopyBranch( m_hItemDragS,NULL,TVI_LAST ); HTREEITEM htiNew = CopyBranch( htiNewTemp,m_hItemDragD,TVI_LAST ); DeleteItem( htiNewTemp ); SelectItem( htiNew ); KillTimer( m_nScrollTimerID ); return; } } HTREEITEM htiNew = CopyBranch( m_hItemDragS,m_hItemDragD,TVI_LAST ); DeleteItem( m_hItemDragS ); SelectItem( htiNew ); KillTimer( m_nScrollTimerID ); } } HTREEITEM CXTreeCtrl::CopyItem(HTREEITEM hItem, HTREEITEM htiNewParent, HTREEITEM htiAfter) //拷貝條目 { TV_INSERTSTRUCT tvstruct; HTREEITEM hNewItem; CString sText; //得到源條目的信息 tvstruct.item.hItem = hItem; tvstruct.item.mask=TVIF_CHILDREN|TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE; GetItem( &tvstruct.item ); sText = GetItemText( hItem ); tvstruct.item.cchTextMax = sText.GetLength (); tvstruct.item.pszText = sText.LockBuffer (); //將條目插入到合適的位置 tvstruct.hParent = htiNewParent; tvstruct.hInsertAfter = htiAfter; tvstruct.item.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT; hNewItem = InsertItem( &tvstruct ); sText.ReleaseBuffer (); //限制拷貝條目數據和條目狀態 SetItemData( hNewItem,GetItemData(hItem) ); SetItemState( hNewItem,GetItemState(hItem,TVIS_STATEIMAGEMASK),TVIS_STATEIMAGEMASK); return hNewItem; } HTREEITEM CXTreeCtrl::CopyBranch(HTREEITEM htiBranch, HTREEITEM htiNewParent, HTREEITEM htiAfter) //拷貝分支 { HTREEITEM hChild; HTREEITEM hNewItem = CopyItem( htiBranch,htiNewParent,htiAfter ); hChild = GetChildItem( htiBranch ); while( hChild != NULL ) { CopyBranch( hChild,hNewItem,htiAfter ); hChild = GetNextSiblingItem( hChild ); } return hNewItem; } void CXTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point) //處理無意拖曳 { m_dwDragStart = GetTickCount(); CTreeCtrl::OnLButtonDown(nFlags, point); } void CXTreeCtrl::OnTimer(UINT nIDEvent) { //鼠標敏感節點 if( nIDEvent == m_nHoverTimerID ) { KillTimer( m_nHoverTimerID ); m_nHoverTimerID = 0; HTREEITEM trItem = 0; UINT uFlag = 0; trItem = HitTest( m_HoverPoint,&uFlag ); if( trItem && m_bDragging ) { SelectItem( trItem ); Expand( trItem,TVE_EXPAND ); } } //處理拖曳過程中的滾動問題 else if( nIDEvent == m_nScrollTimerID ) { m_TimerTicks++; CPoint pt; GetCursorPos( &pt ); CRect rect; GetClientRect( &rect ); ClientToScreen( &rect ); HTREEITEM hItem = GetFirstVisibleItem(); if( pt.y < rect.top +10 ) { //向上滾動 int slowscroll = 6 - (rect.top + 10 - pt.y )/20; if( 0 == (m_TimerTicks % ((slowscroll > 0) ? slowscroll : 1)) ) { CImageList::DragShowNolock ( false ); SendMessage( WM_VSCROLL,SB_LINEUP ); SelectDropTarget( hItem ); m_hItemDragD = hItem; CImageList::DragShowNolock ( true ); } } else if( pt.y > rect.bottom - 10 ) { //向下滾動 int slowscroll = 6 - (pt.y - rect.bottom + 10)/20; if( 0 == (m_TimerTicks % ((slowscroll > 0) ? slowscroll : 1)) ) { CImageList::DragShowNolock ( false ); SendMessage( WM_VSCROLL,SB_LINEDOWN ); int nCount = GetVisibleCount(); for( int i=0 ; i<nCount-1 ; i++ ) hItem = GetNextVisibleItem( hItem ); if( hItem ) SelectDropTarget( hItem ); m_hItemDragD = hItem; CImageList::DragShowNolock ( true ); } } } else CTreeCtrl::OnTimer(nIDEvent); } //////////////////////////////////////////////////////////// BOOL CDragTreeDlg::OnInitDialog() { CDialog::OnInitDialog(); …………………….//此處代碼省略 // TODO: Add extra initialization here m_image.Create ( IDB_TREEIMAGE,16,1,RGB(255,255,255) ); m_wndTree.SetImageList ( &m_image,TVSIL_NORMAL ); HTREEITEM hti1 = m_wndTree.InsertItem ( _T("唐詩"),0,1 ); HTREEITEM hti2 = m_wndTree.InsertItem ( _T("宋詞"),0,1 ); HTREEITEM hti3 = m_wndTree.InsertItem ( _T("元曲"),0,1 ); HTREEITEM hti4 = m_wndTree.InsertItem ( _T("李白"),0,1,hti1 ); m_wndTree.InsertItem ( _T("靜夜思(床前明月光)"),0,1,hti4 ); m_wndTree.InsertItem ( _T("將進酒(君不見黃河之水天上來)"),0,1,hti4 ); m_wndTree.InsertItem ( _T("望廬山瀑布(日照香爐生紫煙)"),0,1,hti4 ); m_wndTree.InsertItem ( _T("蜀道難(噫吁戲,危乎高哉)"),0,1,hti4 ); HTREEITEM hti5 = m_wndTree.InsertItem ( _T("杜甫"),0,1,hti1 ); m_wndTree.InsertItem ( _T("蜀相(丞相祠堂何處尋)"),0,1,hti5 ); m_wndTree.InsertItem ( _T("春望(國破山河在)"),0,1,hti5 ); m_wndTree.InsertItem ( _T("茅屋為秋風所破歌(八月秋高風怒號)"),0,1,hti5 ); HTREEITEM hti6 = m_wndTree.InsertItem ( _T("白居易"),0,1,hti1 ); m_wndTree.InsertItem ( _T("長恨歌(漢皇重色思傾國)"),0,1,hti6 ); m_wndTree.InsertItem ( _T("琵琶行並序(潯陽江頭夜送客)"),0,1,hti6 ); m_wndTree.InsertItem ( _T("李清照"),0,1,hti2 ); m_wndTree.InsertItem ( _T("柳永"),0,1,hti2 ); return TRUE; // return TRUE unless you set the focus to a control }
void CMenuView::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: //動態創建彈出菜單 CMenu menu; menu.CreatePopupMenu(); //創建一個彈出菜單 menu.AppendMenuW(MF_BYCOMMAND | MF_STRING, ID_RIGHT_CLEAR, _T("剪切(&X)")); //添加子菜單項 menu.AppendMenuW(MF_BYCOMMAND | MF_STRING, ID_RIGHT_COPY, _T("復制(&C)")); menu.AppendMenuW(MF_BYCOMMAND | MF_STRING, ID_RIGHT_PASTE, _T("粘貼(&P)")); menu.AppendMenuW(MF_SEPARATOR); menu.AppendMenuW(MF_BYCOMMAND | MF_STRING, ID_RIGHT_CLEAR, _T("清除\tCtrl + C")); ClientToScreen(&point); //將客戶區的坐標轉化為屏幕的坐標 menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTALIGN, point.x, point.y, this); //加載彈出菜單
CView::OnRButtonDown(nFlags, point); } |