学习笔记总结(VC)
1。關于SendMessage發送CString的問題
方法1:
Send: CString *str = new CString ("aaa");
?????????????? hwnd->SendMessage(WM_USER,0,(LPARAM)str);
Recv:?? void myproc(.......)? //自定義消息處理函數
{????????? CString *pstr = (CString*)lparam;
??????????? .......
??????????? delete pstr; //注意此處要刪除前面send處new出來的CString????? }
方法2:
CString s="aaa";
hwnd->SendMessage(WM_USER,0,(LPARAM)(LPCTSTR)s);
Recv:?? void myproc(.......)? //自定義消息處理函數
{? LPCTSTR pstr=(LPCTSTR)lparam;
................??????? }
2。查找窗口FindWindow( a, b)
a 窗口類名,根據跟蹤看,VC中用“#32770”代替此參數,即可查找出所有彈出的窗口,一般情況下可作NULL。
b 窗口標題,正常查找某一個窗口,即可用此參數作唯一標識。
3。CEdit滑塊根據內容自動滾動
UpdateData(FALSE);???????? //注意更新控件
m_edit.LineScroll(m_edit.GetLineCount( ),0 );?? //參數一是行數,參數二是該行的字符位置;
注意:edit控件要設為multiline屬性。
用此方法,即可保證在輸入多行字符后,edit控件能自動滾動至最后一行。
?
要滾動CEdit,?? 下面幾種辦法都可以:??
? m_edit.SendMessage(?? WM_VSCROLL,?? SB_LINEDOWN,?? 0?? );??
? m_edit.LineScroll(?? 3,?? 3?? );??
? ::SendMessage(m_edit.m_hWnd,EM_LINESCROLL,3,12);?????
????
? 簡單的方法,讓字符在指定的行數顯示:??
? int?? index?? =?? m_edit.LineIndex(?? 5?? );??
? m_edit.SetSel(?? index,?? index?? );??
? m_edit.ReplaceSel(?? "dir"?? );
4。判斷程序是否已啟動
方法 1:
CYourApp::InitInstance()
{?CreateMutex(?? NULL,?? FALSE,?? "Application?? Mutex"?? );//?? 添加互斥量?,參數3自定義即可??
????
?if(GetLastError()==ERROR_ALREADY_EXISTS)??
?{??
??AfxMessageBox("程序以運行!");??
??return?? FALSE;??
?} }
方法 2 :查找到以后,激活程序到前臺,但FindWindow過程中,如果有同名的文件夾,而程序沒啟,文件夾窗口會被激活-_-||? 方法有些小問題待改進。
CYourApp::InitInstance()
{?CString? strCaption;??
?strCaption.LoadString(AFX_IDS_APP_TITLE);??
?CWnd* pwndFirst = CWnd::FindWindow(NULL, strCaption);??
?if (pwndFirst)??
?{??
??//?? another?? instance?? is?? already?? running?? -?? activate?? it??
??CWnd* pwndPopup = pwndFirst->GetLastActivePopup();??
??pwndFirst->SetForegroundWindow();??
??pwndFirst->ShowWindow(SW_SHOWNORMAL);??
??if(pwndFirst != pwndPopup)??
???pwndPopup->SetForegroundWindow();??
??return FALSE;??
?} }
5。CTreeCtrl傳遞參數問題
插入樹中的TVINSERTSTRUCT結構有參數,可通過lparam傳遞,也可通過SetItemData設置,并通過GetItemData獲取。
注意:傳遞的參數是指針值,所以要注意原始傳遞的參數的有效期,否則傳遞過去的即可能不存在而消失。
????????? 參數可以是普通的CString,也可以是結構指針。
???? TVINSERTSTRUCT tvInsert;
???? tvInsert.hParent = hParent;
???? tvInsert.hInsertAfter = NULL;
???? tvInsert.item.iImage = 0;
???? tvInsert.item.iSelectedImage = 0;
???? tvInsert.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_PARAM;
???? tvInsert.item.pszText = (LPTSTR)(LPCTSTR)ph.Name; //標題
???? //tvInsert.item.lParam = (LPARAM)(LPCTSTR)ph.Num;? //指針傳值
????
???? HTREEITEM hSub = m_Infotree.InsertItem(&tvInsert);?
???? m_Infotree.SetItemData(hSub2,(DWORD)(LPCTSTR)ph.Num);? //設置該樹枝的參數供傳遞
在onselchange事件中處理參數:
void CTabDlg0::OnSelchangedInfotree(NMHDR* pNMHDR, LRESULT* pResult)
{
?NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
?// TODO: Add your control notification handler code here
?
?/* 獲取TVITEM的lparam參數值
?LPCTSTR str=(LPCTSTR)pNMTreeView->itemNew.lParam;
??if(CString(str)!="")
???? AfxMessageBox(CString(str));*/
????
?//獲取設置的itemData方法,也可在程序其他部分調用該部分獲取傳遞參數
?HTREEITEM hSelected = pNMTreeView->itemNew.hItem;
?LPCTSTR str = (LPCTSTR)m_Infotree.GetItemData(hSelected);
????????
?*pResult = 0;
}
6。CTreeCtrl遍歷循環方法(參考)
?void Tree{
HTREEITEM hitem=NULL;
?CString str;
?hitem=m_Infotree.GetRootItem();??? //取得根節點
?while(hitem)
?{
??//str=m_Infotree.GetItemText (hitem);
??Traversal(hitem);
??hitem=m_Infotree.GetNextSiblingItem (hitem); //取得指定節點hitem的下一個兄弟節點
?}
}
void Traversal(HTREEITEM hitem)??? //函數Traversal( )采用遞歸方法遍歷指定節點hitem的所有子節點
{
??? HTREEITEM hnext;
??? CString str;
??? hnext=m_Infotree.GetChildItem(hitem);??? //取得指定節點hitem的子節點
??? while(hnext)
?{?
//str=m_Infotree.GetItemText (hnext);????????
??????? Traversal(hnext);
??????? hnext=m_Infotree.GetNextSiblingItem(hnext);? //GetPrevSiblingItem( )取兄弟節點的上一節點
??? }
}
總結
以上是生活随笔為你收集整理的学习笔记总结(VC)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 删除windows隐藏的本地连接
- 下一篇: s3c2440移植MQTT