久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

個人總結的VC編程技巧(范文模版)

時間:2019-05-12 03:57:20下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《個人總結的VC編程技巧(范文模版)》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《個人總結的VC編程技巧(范文模版)》。

第一篇:個人總結的VC編程技巧(范文模版)

1.等于號=表示賦值操作;= =表示邏輯操作。在使用if或(a= =b)時候需要注意。2.浮點型數據判斷相等使用fabs(a-b)<0.00001f 3.數組使用SetSize(nSize)之前需要清空RemoveAll()4.修改資源編譯后exe不執行處理方法:選中資源,將其Property屬性對話框中,修改其File Name屬性,改名,保存后會生成其他文件名

5.對于繪制文字TextOut(),在SetMapMode(MM_LOMETRIC)后,需要重新選擇字體,否則打印預覽時候會出現字體亂碼現象。

6.賦值型條件語句需要加括號,否則先執行運算符,再執行條件語句,如int a=b+c>0 ? 1 :-1,時,將先執行(b+c)。

MFC的消息處理函數

1.AfxWndProc()該函數負責接收消息,找到消息所屬的CWnd對象,然后調用AfxCallWndProc

2.AfxCallWndProc()該函數負責保存消息(保存的內容主要是消息標識符和消息參數)供應用程序以后使用,然后調用WindowProc()函數

3.WindowProc()該函數負責發送消息到OnWndMsg()函數,如果未被處理,則調用DefWindowProc()函數

4.OnWndMsg()該函數的功能首先按字節對消息進行排序,對于WM_COMMAND消息,調用OnCommand()消息響應函數,對于WM_NOTIFY消息調用OnNotify()消息響應函數。任何被遺漏的消息將是一個窗口消息。OnWndMsg()函數搜索類的消息映像,以找到一個能處理任何窗口消息的處理函數。如果OnWndMsg()函數不能找到這樣的處理函數的話,則把消息返回到WindowProc()函數,由它將消息發送給DefWindowProc()函數

5.OnCommand()該函數查看這是不是一個控件通知(lParam參數不為NULL,如果lParam參數為空的話,說明該消息不是控件通知),如果它是,OnCommand()函數會試圖將消息映射到制造通知的控件;如果他不是一個控件通知(或者如果控件拒絕映射的消息)OnCommand()就會調用OnCmdMsg()函數

6.OnCmdMsg()根據接收消息的類,OnCmdMsg()函數將在一個稱為命令傳遞(Command Routing)的過程中潛在的傳遞命令消息和控件通知。例如:如果擁有該窗口的類是一個框架類,則命令和通知消息也被傳遞到視圖和文檔類,并為該類尋找一個消息處理函數

MFC應用程序創建窗口的過程

1.PreCreateWindow()該函數是一個重載函數,在窗口被創建前,可以在該重載函數中改變創建參數(可以設置窗口風格等等)

2.PreSubclassWindow()這也是一個重載函數,允許首先子分類一個窗口

3.OnGetMinMaxInfo()該函數為消息響應函數,響應的是WM_GETMINMAXINFO消息,允許設置窗口的最大或者最小尺寸

4.OnNcCreate()該函數也是一個消息響應函數,響應WM_NCCREATE消息,發送消息以告訴窗口的客戶區即將被創建

5.OnNcCalcSize()該函數也是消息響應函數,響應WM_NCCALCSIZE消息,作用是允許改變窗口客戶區大小

6.OnCreate()該函數也是一個消息響應函數,響應WM_CREATE消息,發送消息告訴一個窗口已經被創建

7.OnSize()該函數也是一個消息響應函數,響應WM_SIZE消息,發送該消息以告訴該窗口大小已經發生變化

8.OnMove()消息響應函數,響應WM_MOVE消息,發送此消息說明窗口在移動

9.OnChildNotify()該函數為重載函數,作為部分消息映射被調用,告訴父窗口即將被告知一個窗口剛剛被創建

MFC應用程序關閉窗口的順序(非模態窗口)

1.OnClose()消息響應函數,響應窗口的WM_CLOSE消息,當關閉按鈕被單擊的時候發送此消息

2.OnDestroy()消息響應函數,響應窗口的WM_DESTROY消息,當一個窗口將被銷毀時,發送此消息

3.OnNcDestroy()消息響應函數,響應窗口的WM_NCDESTROY消息,當一個窗口被銷毀后發送此消息

4.PostNcDestroy()重載函數,作為處理OnNcDestroy()函數的最后動作,被CWnd調用

MFC應用程序中打開模式對話框的函數調用順序

1.DoModal()重載函數,重載DoModal()成員函數 2.PreSubclassWindow()重載函數,允許首先子分類一個窗口

3.OnCreate()消息響應函數,響應WM_CREATE消息,發送此消息以告訴一個窗口已經被創建

4.OnSize()消息響應函數,響應WM_SIZE消息,發送此消息以告訴窗口大小發生變化

5.OnMove()消息響應函數,響應WM_MOVE消息,發送此消息,以告訴窗口正在移動

6.OnSetFont()消息響應函數,響應WM_SETFONT消息,發送此消息,以允許改變對話框中控件的字體

7.OnInitDialog()消息響應函數,響應WM_INITDIALOG消息,發送此消息以允許初始化對話框中的控件,或者是創建新控件

8.OnShowWindow()消息響應函數,響應WM_SHOWWINDOW消息,該函數被ShowWindow()函數調用

9.OnCtlColor()消息響應函數,響應WM_CTLCOLOR消息,被父窗口發送已改變對話框或對話框上面控件的顏色

10.OnChildNotify()重載函數,作為WM_CTLCOLOR消息的結果發送

MFC應用程序中關閉模式對話框的順序

1.OnClose()消息響應函數,響應WM_CLOSE消息,當“關閉”按鈕被單擊的時候,該函數被調用

2.OnKillFocus()消息響應函數,響應WM_KILLFOCUS消息,當一個窗口即將失去鍵盤輸入焦點以前被發送

3.OnDestroy()消息響應函數,響應WM_DESTROY消息,當一個窗口即將被銷毀時,被發送

4.OnNcDestroy()消息響應函數,響應WM_NCDESTROY消息,當一個窗口被銷毀以后被發送

5.PostNcDestroy()重載函數,作為處理OnNcDestroy()函數的最后動作被CWnd調用

打開無模式對話框的順序

1.PreSubclassWindow()重載函數,允許用戶首先子分類一個窗口 2.OnCreate()消息響應函數,響應WM_CREATE消息,發送此消息以告訴一個窗口已經被創建

3.OnSize()消息響應函數,響應WM_SIZE消息,發送此消息以告訴窗口大小發生變化

4.OnMove()消息響應函數,響應WM_MOVE消息,發送此消息以告訴窗口正在移動

5.OnSetFont()消息響應函數,響應WM_SETFONT消息,發送此消息以允許改變對話框中控件的字體

以上這些的執行都是按給定的順序執行!

只有清楚的了解應用程序的執行順序,才能在編寫代碼的時候知道,在什么時候應該執行什么,以及在什么地方該處理什么!

這只是本人總結的一點小小的經驗,希望能對MFC的初學者有所幫助!MFC應用程序中處理消息的順序

1.AfxWndProc()該函數負責接收消息,找到消息所屬的CWnd對象,然后調用AfxCallWndProc

2.AfxCallWndProc()該函數負責保存消息(保存的內容主要是消息標識符和消息參數)供應用程序以后使用,然后調用WindowProc()函數

3.WindowProc()該函數負責發送消息到OnWndMsg()函數,如果未被處理,則調用DefWindowProc()函數

4.OnWndMsg()該函數的功能首先按字節對消息進行排序,對于WM_COMMAND消息,調用OnCommand()消息響應函數,對于WM_NOTIFY消息調用OnNotify()消息響應函數。任何被遺漏的消息將是一個窗口消息。OnWndMsg()函數搜索類的消息映像,以找到一個能處理任何窗口消息的處理函數。如果OnWndMsg()函數不能找到這樣的處理函數的話,則把消息返回到WindowProc()函數,由它將消息發送給DefWindowProc()函數

5.OnCommand()該函數查看這是不是一個控件通知(lParam參數不為NULL,如果lParam參數為空的話,說明該消息不是控件通知),如果它是,OnCommand()函數會試圖將消息映射到制造通知的控件;如果他不是一個控件通知(或者如果控件拒絕映射的消息)OnCommand()就會調用OnCmdMsg()函數

6.OnCmdMsg()根據接收消息的類,OnCmdMsg()函數將在一個稱為命令傳遞(Command Routing)的過程中潛在的傳遞命令消息和控件通知。例如:如果擁有該窗口的類是一個框架類,則命令和通知消息也被傳遞到視圖和文檔類,并為該類尋找一個消息處理函數

MFC應用程序創建窗口的過程

1.PreCreateWindow()該函數是一個重載函數,在窗口被創建前,可以在該重載函數中改變創建參數(可以設置窗口風格等等)

2.PreSubclassWindow()這也是一個重載函數,允許首先子分類一個窗口

3.OnGetMinMaxInfo()該函數為消息響應函數,響應的是WM_GETMINMAXINFO消息,允許設置窗口的最大或者最小尺寸

4.OnNcCreate()該函數也是一個消息響應函數,響應WM_NCCREATE消息,發送消息以告訴窗口的客戶區即將被創建

5.OnNcCalcSize()該函數也是消息響應函數,響應WM_NCCALCSIZE消息,作用是允許改變窗口客戶區大小

6.OnCreate()該函數也是一個消息響應函數,響應WM_CREATE消息,發送消息告訴一個窗口已經被創建

7.OnSize()該函數也是一個消息響應函數,響應WM_SIZE消息,發送該消息以告訴該窗口大小已經發生變化

8.OnMove()消息響應函數,響應WM_MOVE消息,發送此消息說明窗口在移動

9.OnChildNotify()該函數為重載函數,作為部分消息映射被調用,告訴父窗口即將被告知一個窗口剛剛被創建

MFC應用程序關閉窗口的順序(非模態窗口)

1.OnClose()消息響應函數,響應窗口的WM_CLOSE消息,當關閉按鈕被單擊的時候發送此消息

2.OnDestroy()消息響應函數,響應窗口的WM_DESTROY消息,當一個窗口將被銷毀時,發送此消息

3.OnNcDestroy()消息響應函數,響應窗口的WM_NCDESTROY消息,當一個窗口被銷毀后發送此消息

4.PostNcDestroy()重載函數,作為處理OnNcDestroy()函數的最后動作,被CWnd調用

MFC應用程序中打開模式對話框的函數調用順序

1.DoModal()重載函數,重載DoModal()成員函數 2.PreSubclassWindow()重載函數,允許首先子分類一個窗口

3.OnCreate()消息響應函數,響應WM_CREATE消息,發送此消息以告訴一個窗口已經被創建

4.OnSize()消息響應函數,響應WM_SIZE消息,發送此消息以告訴窗口大小發生變化

5.OnMove()消息響應函數,響應WM_MOVE消息,發送此消息,以告訴窗口正在移動

6.OnSetFont()消息響應函數,響應WM_SETFONT消息,發送此消息,以允許改變對話框中控件的字體

7.OnInitDialog()消息響應函數,響應WM_INITDIALOG消息,發送此消息以允許初始化對話框中的控件,或者是創建新控件

8.OnShowWindow()消息響應函數,響應WM_SHOWWINDOW消息,該函數被ShowWindow()函數調用

9.OnCtlColor()消息響應函數,響應WM_CTLCOLOR消息,被父窗口發送已改變對話框或對話框上面控件的顏色

10.OnChildNotify()重載函數,作為WM_CTLCOLOR消息的結果發送

MFC應用程序中關閉模式對話框的順序

1.OnClose()消息響應函數,響應WM_CLOSE消息,當“關閉”按鈕被單擊的時候,該函數被調用

2.OnKillFocus()消息響應函數,響應WM_KILLFOCUS消息,當一個窗口即將失去鍵盤輸入焦點以前被發送 3.OnDestroy()消息響應函數,響應WM_DESTROY消息,當一個窗口即將被銷毀時,被發送

4.OnNcDestroy()消息響應函數,響應WM_NCDESTROY消息,當一個窗口被銷毀以后被發送

5.PostNcDestroy()重載函數,作為處理OnNcDestroy()函數的最后動作被CWnd調用

打開無模式對話框的順序

1.PreSubclassWindow()重載函數,允許用戶首先子分類一個窗口

2.OnCreate()消息響應函數,響應WM_CREATE消息,發送此消息以告訴一個窗口已經被創建

3.OnSize()消息響應函數,響應WM_SIZE消息,發送此消息以告訴窗口大小發生變化

4.OnMove()消息響應函數,響應WM_MOVE消息,發送此消息以告訴窗口正在移動

5.OnSetFont()消息響應函數,響應WM_SETFONT消息,發送此消息以允許改變對話框中控件的字體

MFC的一些主要成員函數

CWinThread::m_pMainWnd:保存指向應用程序的主窗口指針。CWinThread::GetMainWnd:查詢指向線程主窗口的指針。CWinThread::InitInstance:重載以實現線程實例的初始化。AfxGetApp:獲得指向CWinApp對象的指針。

AfxGetInstanceHandle:獲得當前應用程序實例的句柄。AfxGetResourceHandle:獲得應用程序資源的句柄。

AfxGetAppName:獲得一個字符串指針,其中包含了應用程序的名字。另外,如果你擁有一個指向CWinApp對象的指針,可以通過m_pszExename來獲得應用程序的名字。

CDocument::IsModified:標識文檔從最近一次保存以來是否被修改過。CDocument::UpdateAllViews:通知所有視圖文檔已被修改的消息。CWnd::m_hWnd:指明與這個CWnd對象相關聯的HWND句柄。CWnd::Create:創建并初始化與CWnd對象相關聯的子窗口。

CWnd::PreCreateWindow:在與CWnd對象相關聯的窗口被創建之前調用。CWnd::IsWindowEnabled:確定一個窗口是否允許鼠標和鍵盤輸入。CWnd::EnableWindow:允許或禁止鼠標和鍵盤輸入。CWnd::SetWindowPos:改變子窗口、彈出窗口和頂層窗口的大小、位置以及順序。CWnd::GetDlgItem:獲得指定的對話框中具有指定ID的控件。CWnd::UpdateData:初始化對話框或獲得對話框中的數據。CWnd::GetWindowRect:獲得CWnd的屏幕坐標。CWnd::GetDC:獲得客戶區的設備環境。

CWnd::RedrawWindow:更新客戶區中的指定矩形或區域。CWnd::UpdateWindow:更新客戶區。

CWnd::Invalidate:使整個客戶區無效。CWnd::ShowWindow:顯示或隱藏窗口。

CWnd::ClientToScreen:將給定點或顯示器上矩形的客戶區坐標轉換為屏幕坐標。

CWnd::ScreenToClient:將給定點或顯示器上矩形的屏幕坐標轉換為客戶坐標。CWnd::SetWindowText:將窗口的文本或標題文字(如果有)設為指定的文本。CWnd::SetFont:設置當前字體。

CWnd::GetDlgItemInt:將給定對話框中控件的文本轉換為整數。

CWnd::SetTimer:安裝一個系統定時器,當它被激活時,發送一個WM_TIMER消息。

CWnd::KillTimer:銷毀一個系統定時器。CWnd::FlashWindow:使窗口閃爍一次。CWnd::MessageBox:創建并顯示一個窗口,其中包含了應用程序提供的消息和標題

第二篇:VC編程資料總結

CString類的完美總結

2012-05-04 15:50:50 我來說兩句

收藏

我要投稿

①、CString 類對象的初始化: CString str;

CString str1(_T(“abc”));CString str2 = _T(“defg”);

TCHAR szBuf[] = _T(“kkk”);CString str3(szBuf);CString str4 = szBuf;

TCHAR *p = _T(“1k2”);//TCHAR * 轉換為 CString CString str5(p);CString str6 = p;

CString str7(str1);CString str8 = str7;

②、字符串基本操作: ● 長度:GetLength();CString str(_T(“abc”));

int len = str.GetLength();//len == 3

● 是否為空,即不含字符:IsEmpty();● 清空字符串:Empty();CString str(_T(“abc”));

BOOL mEmpty = str.IsEmpty();//mEmpty == FALSE str.Empty();

mEmpty = str.IsEmpty();//mEmpty == TRUE

● 轉換大小寫:MakeUpper、MakeLower ● 轉換順序:MakeReverse CString str(_T(“Abc”));str.MakeUpper();//str == ABC str.MakeLower();//str == abc str.MakeReverse();//str == cba

● 字符串的連接:+、+= CString str(_T(“abc”));

str = _T(“de”)+ str + _T(“kp”);//str == deabckp str += _T(“123”);//str == deabckp123 TCHAR szBuf[] = _T(“789”);

str += szBuf;//str == deabckp123789

● 字符串的比較:==、!=、(<、>、<=、>= 不常用)、Compare(區分大小寫)、CompareNoCase(不區分大小寫)

CString str1(_T(“abc”));CString str2 = _T(“aBc”);if(str1 == str2){

MessageBox(_T(“str1 等于 str2”));}else{

MessageBox(_T(“str1 不等于 str2”));}

③、字符串的查找:

Find、ReverseFind、FindOneOf 三個函數可以實現字符串的查找操作

Find 從指定位置開始查找指定的字符或者字符串,返回其位置,找不到返回-1;

舉例:

CString str(_T(“abcdefg”));

int idx = str.Find(_T(“cde”), 0);//idx 的值為2;

ReverseFind 從字符串末尾開始查找指定的字符,返回其位置,找不到返回-1,雖然是從后向前查找,但是位置為從開始算起;

CString str(_T(“abcdefg”));

int idx = str.ReverseFind('e');//idx 的值為4;

FindOneOf 查找參數中給定字符串中的任意字符,返回第一次出現的位置,找不到返回-1;

CString str(_T(“abcabcd”));

int idx = str.FindOneOf(_T(“cbd”));//idx 的值為1;

④、字符串的替換與刪除:

Replace 替換 CString 對象中的指定的字符或者字符串,返回替換的個數,無匹配字符返回 0;

CString str(_T(“abcdabc”));int num = str.Replace('b', 'k');//str == akcdakc, num == 2

CString str(_T(“abcdabc”));

int num = str.Replace(_T(“bc”), _T(“kw”));//str == akwdakw, num == 2

Remove 刪除 CString 對象中的指定字符,返回刪除字符的個數,有多個時都會刪除;

CString str(_T(“abcdabcb”));

int num = str.Remove('b');//str == acdac, num == 3

Delete 刪除 CString 對象中的指定位置的字符,返回處理后的字符串長度;

CString str(_T(“abcd”));

int num = str.Delete(1, 3);//str == a, num == 1

⑤、字符串的提取:

Left、Mid、Right 三個函數分別實現從 CString 對象的 左、中、右 進行字符串的提取操作;

CString str(_T(“abcd”));

CString strResult = str.Left(2);//strResult == ab strResult = str.Mid(1);//strResult == bcd strResult = str.Mid(0, 2);//strResult == ab strResult = str.Right(2);//strResult == cd

⑥、單個字符的修改: GetAt、SetAt 可以獲取與修改 CString 對象中的單個 TCHAR 類型字符;

操作符也可以獲取 CString 對象中的單個字符,但為只讀的,不能進行修改;

CString str(_T(“abcd”));

str.SetAt(0, 'k');//str == kbck TCHAR ch = str.GetAt(2);//ch == c

⑦、其他類型與 CString 對象類型的轉換:

● 格式化字符串:Format 方法,實現從 int、long 等數值類型、TCHAR、TCHAR * 等類型向 CString 類型的轉換;

int num = 6;CString str;

str.Format(_T(“%d”), num);

● CString 類型向 int 等數值類型、TCHAR * 類型的轉換: TCHAR *pszBuf = str.GetBuffer();str.ReleaseBuffer();

TCHAR *p =(LPTSTR)(LPCTSTR)str;

CString str1(_T(“123”));int num = _ttoi(str1);

⑧、CString 對象的 Ansi 與 Unicode 轉換: 大家可以直接使用上節課給大家講解的方法,此外這里給大家介紹一種從 Ansi 轉換到 Unicode 的隱含方法:

//當前工程環境為Unicode CString str;str = “abc”;char *p = “defg”;str = p;

⑨、CString 對象字符串所占用的字節數: CString str = _T(“abc”);

錯誤的求法:sizeof(CString)、sizeof(str)

正確的求法:str.GetLength()*sizeof(TCHAR)

⑩、當作為 TCHAR * 類型傳參時,確保申請了足夠用的空間,比如使用 GetModuleFileName 函數

轉載]CString、TCHAR*、char*轉換

[轉載]CString、TCHAR*、char*轉換 char*、TCHAR*轉換CString CString str(****)下面詳細寫一下其它轉換

////////////////////////////// /* *********************************************************************** * 函數: TransCStringToTCHAR * 描述:將CString 轉換為 TCHAR* * 日期:

*********************************************************************** */ TCHAR* CPublic::CString2TCHAR(CString &str){ int iLen = str.GetLength();TCHAR* szRs = new TCHAR[iLen];lstrcpy(szRs, str.GetBuffer(iLen));str.ReleaseBuffer();return szRs;} /* *********************************************************************** * 函數: TCHAR2Char * 描述:將TCHAR* 轉換為 char* * 日期:

*********************************************************************** */ char* TCHAR2char(TCHAR* tchStr){ int iLen = 2*wcslen(tchStr);//CString,TCHAR漢字算一個字符,因此不用普通計算長度

char* chRtn = new char[iLen+1] wcstombs(chRtn,tchStr,iLen+1);//轉換成功返回為非負值 return chRtn;} /* *********************************************************************** * 函數: char2tchar * 描述:將 char* 轉換為 TCHAR* * 日期:

*********************************************************************** */ TCHAR *char2tchar(char *str){ int iLen = strlen(str);TCHAR *chRtn = new TCHAR[iLen+1];mbstowcs(chRtn, str, iLen+1);return chRtn;} /* *********************************************************************** * 函數: CString2char * 描述:將CString轉換為 char* * 日期:

*********************************************************************** */ char* CPublic::CString2char(CString &str){ int len = str.GetLength();char* chRtn =(char*)malloc((len*2+1)*sizeof(char));//CString的長度中漢字算一個長度

memset(chRtn, 0, 2*len+1);USES_CONVERSION;strcpy((LPSTR)chRtn,OLE2A(str.LockBuffer()));return chRtn;} //參考

/////////////////////// //Pocket PC上的UNICODE和ANSI字符串

//By Vassili Philippov, September 26, 2001.//楊方思歧 譯

//////////////////////// /* *********************************************************************** * 函 數 名:GetAnsiString * 描 述:將CString(unicode)轉換為char*(ANSI)* 參 數:CString &s 要轉換的CString * 返 回 值:返回轉換結果 * 創建日期:

* 最后修改:

*********************************************************************** */ char* GetAnsiString(const CString &s){ int nSize = 2*s.GetLength();char *pAnsiString = new char[nSize+1];wcstombs(pAnsiString, s, nSize+1);return pAnsiString;}

////////////////////////////////////////////////////////////////////////////////////////////// WideCharToMultiByte和MultiByteToWideChar函數的用法

支持Unicode編碼,需要多字節與寬字節之間的相互轉換

WideCharToMultiByte的代碼頁用來標記與新轉換的字符串相關的代碼頁。

MultiByteToWideChar的代碼頁用來標記與一個多字節字符串相關的代碼頁。

常用的代碼頁由CP_ACP和CP_UTF8兩個。

使用CP_ACP代碼頁就實現了ANSI與Unicode之間的轉換。

使用CP_UTF8代碼頁就實現了UTF-8與Unicode之間的轉換。

wstring AnsiToUnicode((const string& str){ int len = 0;

len = str.length();

int unicodeLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(),-1,NULL,0);

wchar_t * pUnicode;

pUnicode = new wchar_t[unicodeLen+1];

memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));

::MultiByteToWideChar(CP_ACP,0, str.c_str(),-1,(LPWSTR)pUnicode, unicodeLen);

wstring rt;rt =(wchar_t*)pUnicode;delete pUnicode;return rt;}

string UnicodeToAnsi(const wstring& str){

char* pElementText;int iTextLen;

// wide char to multi char

iTextLen = WideCharToMultiByte(CP_ACP, 0, str.c_str(),-1, NULL, 0, NULL, NULL);

pElementText = new char[iTextLen + 1];

memset((void*)pElementText, 0, sizeof(char)*(iTextLen + 1));

::WideCharToMultiByte(CP_ACP, 0, str.c_str(),-1, pElementText,iTextLen,NULL,NULL);

string strText;

strText = pElementText;

delete[] pElementText;

return strText;}

wstring UTF8ToUnicode((const string& str){ int len = 0;

len = str.length();

int unicodeLen = ::MultiByteToWideChar(CP_UTF8, 0, str.c_str(),-1,NULL,0);

wchar_t * pUnicode;

pUnicode = new wchar_t[unicodeLen+1];

memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));

::MultiByteToWideChar(CP_UTF8,0, str.c_str(),-1,(LPWSTR)pUnicode, unicodeLen);

wstring rt;rt =(wchar_t*)pUnicode;delete pUnicode;return rt;}

string UnicodeToUTF8(const wstring& str){

char* pElementText;int iTextLen;

// wide char to multi char

iTextLen = WideCharToMultiByte(CP_UTF8, 0, str.c_str(),-1, NULL, 0, NULL, NULL);

pElementText = new char[iTextLen + 1];

memset((void*)pElementText, 0, sizeof(char)*(iTextLen + 1));

::WideCharToMultiByte(CP_UTF8, 0, str.c_str(),-1, pElementText,iTextLen,NULL,NULL);

string strText;

strText = pElementText;

delete[] pElementText;

return strText;}

第三篇:PB11.5+WEB客戶端編程技巧總結

PB11.5 WEB客戶端編程技巧總結

一、概述

用PB11.5把現有C/S程序轉換成WEB應用程序后,保留了大部分C/S環境下的代碼,并且大部分都能執行過去。但是在BS平臺下,原來的PB代碼從客戶端轉成了IIS上的服務代碼,原的“客戶端”就成了瀏覽器,轉換后的客戶端編程其實就是面向瀏覽器的編程。

根據目前我對PB11.5所了解的情況,PB11在代碼方面可以使用條件編譯方式嵌入.NET代碼,其實我感覺.net里能實現的內容,用PB代碼也基本能實現,.net里不能實現的,PB也可實現(如datawindow),但這些都屬于服務端的編程范疇,實際應用中很少會碰到在PB里再嵌入.net代碼的,除非要寫一些很特殊的代碼,所以,可以說,服務端方面僅用PB代碼就可以徹底解決。

但實際上,這種純PB代碼的程序一發布成WEB后,會存在不少問題,在C/S環境下,要完成一個操作往往需要多個交互過程,如“打開窗口、選擇行、輸入數據、返回、刷新頁面”這么一個過程,轉成B/S后,運行是這樣的“打開窗口(POSTBACK)、選擇行(POSTBACK)、輸入數據(回車后POSTBACK)、返回(POSTBACK)”,那么多的POSTBACK使得操作變得很笨重,就連簡單的一個MESSAGEBOX,都要2次POSTBACK:“打開消息窗(POSTBACK)、點確定(POSTBACK)”。因此,使用PB11開發WEB程序將要面臨一個很嚴峻的問題:如何提高客戶端的性能,減少POSTBACK次數。

值得慶幸的是,PB11.5的WEB頁面使用了AJAX技術,POSTBACK并不會產生整個頁面的提交,而是部分提交。另外,PB11.5還提供了不少客戶端的編程接口,可以通過這些編程接口進一步優化頁面。那么,有哪些地方可以運用javascript和html代碼優化頁面呢?

1、數據窗口對象appendedhtml屬性。

剛接觸PB11.5的WEB開發的時候,一定會被他的那么多unsupport屬性所蒙蔽,原先在C/S下絢麗多彩的界面,轉成B/S后變得暗淡無光,因此也就失去了進一步開發的樂趣。其實不然,PB提供了appendedhtml的屬性后,使WEB界面編程變得更為靈活,一個小小的appendedhtml,可以將DHTML、javascript等所有頁面技術嵌入到里面去。可以實現的效果如:透明、垂直居中、漸變、鼠標移動特效等等。

查看發布成WEB后的頁面代碼,會發現,appendedhtml里的內容是放在

里,也就是說,數據窗口的內容轉成了WEB元素,如標簽轉成了
,列就是。Appendedhtml的寫法:引號必須使用轉義符~如:modify(‘sfz.html.appendedhtml = “style = ~~”padding-top:2px;~~“’),至于如何設置元素屬性,可以查看《DHTML手冊》。

2、數據窗口事件。此方法是在數據窗口對象初始化的時候寫入對應的腳本,如: #IF DEFINED PBWEBFORM THEN dw_1.JavaScriptFile = ”uo_dw.js“ dw_1.OnClientItemChanged = ”MyItemChanged“ #END IF 另外,在發布成WEB的時候,必須嵌入已寫好的javascript腳本,這些被腳本會在頁面的head區被包含進去。

經過上面代碼一處理,數據窗口的事件被觸發后就會直接跳到javascript腳本去處理而不執行回調(就是PB里寫的程序不會被執行)。

那么,哪些事件支持腳本編程呢?根據PB11.5文檔所提供的技術說明,目前僅限于數據窗口內事件處理,包括clicked、DoubleClicked、RButtonDown、ButtonClicked、ButtonClicking、ItemFocusChanged、ItemError、ItemChanged、RowFocusChanged。在指定客戶端事件腳本的時候,事件前都必須加”OnClient”。

二、客戶端程序的優化思路

借助javascript腳本技術,我們可以對目前程序上的幾個操作瓶頸進行優化。

1、數據窗口的條件性POSTBACK。

如果不對datawindow進行腳本處理,那么如果事件內有代碼,則將會在觸發該事件的時候執行POSTBACK,這樣會有很多沒必要的POSTBACK。如,在itemchanged事件里寫入了對身份證輸入后進行檢查的代碼,在IE下運行的情況是,該數據窗口的任何列輸入完后都會執行POSTBACK,有沒有辦法實現只輸入身份證的時候才POSTBACK呢?可以通過以下方法:

(1)在窗口的open事件里寫入腳本。#IF DEFINED PBWEBFORM THEN dw_1.JavaScriptFile = ”uo_dw.js“ dw_1.OnClientItemChanged = ”MyItemChanged“ #END IF(2)腳本里寫入條件回調程序。

function MyItemChanged(sender, rowNumber, columnName,newValue){if(columnName== ‘sfz’){return PBDataWindow_ItemChangedReject(sender, rowNumber, columnName, newValue);} Else {//do nothing} } 其中,PBDataWindow_ItemChangedReject為調用數據窗口的itemchanged事件,數據窗口提供的回調函數,可以在PBDataWindow.js找到,查閱PB幫助文檔可以查看其具體用法。

2、PB代碼向javascript腳本轉化。

首先,必須理解PB-WEB程序的運行模式,見下圖: 數據庫 SQL 數據集 EASERVER 代理對象 IIS PBVM request IE 代理對象 response 從上圖可以看出,IE與數據庫之間其實就是數據請求的關系,我們可以認為,除了需要從服務端下載數據和頁面加載的請求外,其他都是沒必要的請求。這些沒必要的請求包括:

1)messagebox。消息提示可以說是UI界面交互的最重要的環節之一,幾乎所有業務操作都會涉及,很遺憾的是,除了數據窗口事件里的javascript支持本地消息提示外,目前還沒有一種辦法可以脫離IIS,直接在PB代碼里調用IE消息提示的方法。2)簡單的數據檢查。如登錄時的驗證碼、輸入格式校驗、身份證合法性檢查等,可以直接在javascript里處理。

3)輔助性的數據輸入。包括下拉數據窗口、下拉日歷等。在傳統的C/S模式下,直接打開一個窗口就可以實現下拉數據選擇功能,但是這種方法在WEB下已經行不通,頻繁的POSTBACK會使操作變得笨重、緩慢,甚至比直接輸入來的慢。但是有些下拉的數據又需要從服務端取,這樣可以將下拉窗口設計成共用模塊啟動時直接裝載到頁面,在需要調用的地方用javascript代碼顯示出來,然后象服務端請求數據,選擇數據后返回、設置數據、隱藏下拉窗口,這一過程只要一個POSTBACK,即數據請求過程。

4)頁面切換。在IE下打開多個業務窗口,這些窗口都已經裝載到了IE下,可以通過javascript腳本實現頁面顯示、隱藏,以提高響應速度。

5)窗口、對象的關閉、銷毀。類似此操作,可以直接在IE下完成,無需要再送到IIS上處理。

6)實現回車后焦點切換。打開PB安裝文件所在路徑,打開F:Program FilesSybasePowerBuilder 11.5DotNETwebrootscripts目錄下的dwcommon.js,并修改其代碼段。函數為:HTDW_inputKeyDown()代碼if(event.keyCode == 9 &&!event.ctrlKey &&!event.altKey &&!event.shiftKey)ProcessTab(obj);修改為if((event.keyCode == 9 || event.keyCode == 13)&&!event.ctrlKey &&!event.altKey &&!event.shiftKey)ProcessTab(obj);實現按回車鍵的tab效果。

三、PB與javascript混合編程技巧

1、使用PB提供的javascript函數

打開IIS目錄,在發布好的站點文件夾下,有個scripts文件夾,存放的是所有PB的內置函數,這些函數描述了客戶端的調用、回調方法,具體使用方法在PB文檔里有做了描述。

數據窗口對象(大部分數據窗口函數接口里都用sender做為參數)可以引用的函數可以在dwcommon.js里的function HTDW_DataWindowClass(name)里找到,如下圖:

如:this.SetItem = HTDW_SetItem;這行表示,可以調用數據窗口的SetItem()函數進行設置數據窗口值,至于SetItem參數,可以查找HTDW_SetItem函數的參數結構。如下圖:

調用舉例:

數據窗口的回調函數,可以在PBDataWindow.js里找到,上面已經舉過例子,這里不做描述了。

2、靈活地操控WEB元素

WEB頁面上,每個元素都有一個ID值,是唯一標識該元素的鍵值。如表示“確定”按鈕的ID為ID_OK。

要在javascript里編寫程序實現與頁面元素交互,最重要的一點是要弄清楚從PB轉換成頁面后的元素的ID值,這些ID值是IIS發送過來的,與PB里的對象名有一定的對應關系。目前PB技術文檔沒有這方面的說明,但我們可以通過多種途徑來獲得這些元素ID。1)利用event對象獲得窗口事件的源、父對象

如,可以定義var o = window.event.srcElement;獲取鼠標在窗口上點擊的對象,通過o.parentElement可以獲取該對象的父對象。

2)通過getElementByName、getElementById、getElementsByTagName等方法獲取對象ID。

3)通過alert消息提示將對象ID顯示出來。

有了這些ID,接下去如何操控界面元素,就和C/S編程差不多了,有關函數操作、屬性操作等可以參考javascript和DHTML相關資料。

應用舉例:

第四篇:數控車床編程(個人總結)

數控車床編程入門

第一節

在數控系統中采用了兩種系統即機床坐標系XOY和編程坐標系XpOpYp,在手動控制、對刀、回零過程中采用的市機床坐標系。在編程即自動加工時則是編程坐標系。

一、機床坐標系

機床坐標系采用標準坐標系,即右手笛卡爾坐標系

二、編程坐標系

第二節

在數控系統中,每個加工程序的最大容量是8K(即8196個字符),并最多可擁有999個程序段。在輸入程序時,必須按照系統所能接受的格式來編程。

一、程序段的格式

所謂程序段的格式,是指程序段書寫規則,它包含機床所要求執行的功能和運動所需要的幾何數據和工藝數據。

一個零件加工程序由若干以段號大小次序排列的程序段組成,每個程序段由以下幾個部分組成:

N程序段號001——999

G準備功能01——99

XZ坐標或增量值?0.01——?9999.99

F進給速度10mm/min——500mm/min

M輔助功能

S主軸速度0——2500轉/分

T刀具號1——8

數控車床控制系統采用的程序段格式是可變程序段格式,所謂可變程序段格式就是程序段長度隨著輸入數據和字長的變化而變化。

程序通常由地址字和地址字后的數字和符號組成。一個程序段由一個或多個程序地址字組成。例如:

X——110F400

這種程序段格式,以地址功能字為首,后跟一串數字組成。若干個程序地址字組成程序段。例如:

N072G03X70Z——36.5I0K——2F200(上段程序中NGXZIKF均為地址字功能字)

N程序段號G準備功能X Z I K 坐標地址F進給量除英制螺紋加工段中螺紋節距值以外,其余的加工段中坐標值均為公制(mm)。

直徑編程:程序段中X軸的編程采用直徑編程,也就是說輸入X軸的尺寸值均采用直徑量。

第三節

準備功能用字母G后跟兩位數字來編程,它總是編在程序段的開始,用來定義幾何形態和車床的工作狀態。

下面就G功能作詳細說明:

① G90絕對值方式:一旦采用本指令后,后面的程序段的坐標值都按絕對值方式編程,即所有點的表示數值都是在編程坐標系中的點坐標值,直到執行G91為

止。

② G91增量方式:一旦采用本指令后,后面的程序段的坐標值都應按增量方式來

編程,即所有點的表示數值均以前一個坐標位置作為起點來計算運動終點的位置矢量。直到執行G90指令為止。

G00快速定位:執行此條指令時將先沿X方向再沿Z方向快速運動至定位點。G01直線插補:不運動的坐標可以省略,數值不必寫入。

G02順時針圓弧插補:用G02指令編時,可以自動過象限,但不得超過1800。G03逆時針圓弧插補:用G03指令編時,除圓弧運動方向相反外,其余跟G02指令完全相同。

⑦ G04暫停指令:指程序在執行到某一段后,需要暫停一段時間,進行某些人為的調整,這時就可以用G04指令使程序暫停,當暫停時間一到,繼續執行下一⑧ 段程序。暫停時間由P后數值說明,單位為秒,范圍為0.01——99.99秒。③ ④ ⑤ ⑥

第五篇:powerbuilder編程簡單入門(個人總結)

2011-4 by 邵家鑫 From Tsinghua 一種簡單的powerbuilder10數據庫編程介紹

1、需求分析與數據庫建立

進行需求分析(需求分析文檔),確定數據關系,建立各種數據表,建立數據庫(Access),設置ODBC數據源(控制面板->管理工具->數據源ODBC->“用戶DSN”菜單下點“添加”?選相應的數據源驅動程序,如果用Access2003建立的,則選第三項“Driver do Microsoft Access(*.mdb),然后點擊“完成”->輸入數據源名,如mydata,然后點擊“選擇”按鈕選擇建好的數據庫,最后點“確定”,如下圖所示)

2、界面設計(功能界面、重要數據表維護界面)

界面設計主要分為幾個部分

(1)按照管理系統所需的功能設計界面。

首先畫出所有可能的業務流程(數據的各種可能輸入、修改、刪除業務,數據的輸出、顯示業務)

(2)按照需要維護的表設計界面(往往給最高權限管理員直接修改數據用)

3、開始程序編寫

(1)新建一個workspace(new->workspace->workspace)(2)在workspace下建立一個目標

(new->Target->application),可取名frame

2011-4 by 邵家鑫 From Tsinghua(3)在目標下建一個主窗口

可取名w_main,窗體名一般以w_開頭(new->PB Object->Window),將其Window Type設為“mdihelp!”

(4)為主窗口建一個主菜單

可取名m_frame,菜單名一般以m_開頭(new->PB Object->Menu)(5)程序中設置ODB ODBC 點擊按鈕,選中“ODB ODBC”項,然后單擊右邊“New”按鈕,彈出如下對話框,設置Profile Name和Data Source,如圖所示。

(6)建立配置文件

配置文件取名“config.ini”,內容如下:

[MyDB] DBMS=ODBC AutoCommit=False DBParm=ConnectString='DSN=mydata;UID=;PWD='

(7)自動連接數據庫與退出程序關閉數據庫的編寫

2011-4 by 邵家鑫 From Tsinghua 首先建立Global Variables如下: string gs_userid,gs_username //登錄用戶標識、用戶姓名 string gs_root_path,gs_ini_path

//應用路徑和主配置文件路徑

其次申明Global External Functions如下:

FUNCTION int GetComputerNameA(ref string computername,ref long size)LIBRARY “KERNEL32.DLL” alias for “GetComputerNameA;Ansi” FUNCTION long GetCurrentDirectoryA(long nBufferLength, REF string szBuffer)LIBRARY “KERNEL32.DLL” alias for “GetCurrentDirectoryA;Ansi” FUNCTION long SetCurrentDirectoryA(string szPathName)LIBRARY “KERNEL32.DLL” alias for “SetCurrentDirectoryA;Ansi” //end prototypes 在程序的總入口(進入“”)Open事件中寫入以下代碼: // Profile moneyandfriends string ls_1

//設置應用根目錄

gs_root_path = space(255)GetCurrentDirectoryA(255, gs_root_path)if right(gs_root_path,1)= '' then gs_root_path = left(gs_root_path,len(gs_root_path)1)if pos(ps_sql, “group by ”)> 0 then

ls_end = right(ps_sql, len(ps_sql)pos(ps_sql, “order by ”)+ 1)

ls_where = mid(ps_sql, pos(ps_sql, “where ”)+6, len(ps_sql)-len(ls_front)-len(ls_end)-6)else

ls_where = mid(ps_sql, pos(ps_sql, “where ”)+6, len(ps_sql)-len(ls_front)-6)end if

2011-4 by 邵家鑫 From Tsinghua ls_return = ls_front + “where(” + ls_where +“)and ” + ps_where + “ ” + ls_end else if pos(ps_sql, “group by ”)> 0 then

ls_front = left(ps_sql, pos(ps_sql, “group by ”)pos(ps_sql, “group by ”)+ 1)elseif pos(ps_sql, “order by ”)> 0 then

ls_front = left(ps_sql, pos(ps_sql, “order by ”)pos(ps_sql, “order by ”)+ 1)else

ls_front = ps_sql

ls_end = “" end if ls_return = ls_front + ” where “ + ps_where + ” “ + ls_end end if return ls_return(2)在窗口中聲明局部變量用來記錄最初的沒有where語句的窗口的SQL查詢語句 string is_original_sql

(3)聲明局部變量ls_old_select, ls_new_select,如下使用 string ls_old_select, ls_new_select ls_old_select = dw_ttxx.GetSQLSelect()if is_original_sql = ”" then is_original_sql = ls_old_select else //避免條件被循環添加

ls_old_select = is_original_sql end if

ls_new_select = f_change_where(ls_old_select, is_conditions)dw_窗口.SetSQLSelect(ls_new_select)

下載個人總結的VC編程技巧(范文模版)word格式文檔
下載個人總結的VC編程技巧(范文模版).doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    [推薦]加工中心編程技巧小結

    [推薦]加工中心編程技巧小結 一般編程技巧 cnc加工中心中幾組常用指令的區別及編程技巧 隨著科技的發展和社會的進步,人們對產品的性能和質量要求越來越高,從而使數控機床應......

    數控車床編程和改造技巧(5篇)

    數控車床編程和改造技巧 摘 要:隨著科學技術的發展,普通機床越來越不能滿足市場的需求,其勞動強度大,危險性高,且不能滿足現代科學的批量生產需要,越來越多的企業將普通機床逐漸轉......

    實驗一 VC開發環境的使用和常用算法的編程概要

    實驗一 VC開發環境的使用和常用算法的編程 一、實驗目的 熟悉VC++6.0的集成開發環境,學會用它編寫、調試、運行程序。 二、 實驗要求 對VC++6.0集成開發環境進行操作,用它編寫......

    C++編程例題個人總結2014-07-06

    VS2008通過編譯 1、交換兩個數值 #include using namespace std; void swap(int x,int y); int main {int a=2,b=3;swap(a,b);printf("a=%d,b=%d",a,b);return 0;} void s......

    刀具和編程總結

    ① 白鋼刀(即高速鋼刀具)因其通體銀白色而得名,主要用于直壁加工。白鋼刀價格便宜,但切削壽命短、吃刀量小、進給速度低、加工效率低,在數控加工中較少使用。 ② 飛刀(即鑲嵌式刀......

    編程題總結(范文大全)

    C作業匯總 1. short a,b=32767; /*short類型在內存中占2B*/ a=b+1; 問:a的值是多少?并分析原因。 2. 有一4位數整數,假設用abcd表示,請把這個4位數的每個數位用表達式表示出來......

    數據庫編程總結(推薦)

    數據庫編程總結 當前各種主流數據庫有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS A......

    一點Duilib編程總結

    一點Duilib編程總結 1.duilib簡介 duilib是一個開源的DirectUI界面庫,簡潔但是功能強大。而且還是BSD的license,所以即便是在商業上,大家也可以安心使用。 現在大家可以從這個......

主站蜘蛛池模板: 人人爽人人爽人人片av| 色综合久久久久无码专区| 80s国产成年女人毛片| 久久久综合九色合综国产精品| 波多野无码黑人在线播放| 67194成l人在线观看线路无码| 制服丝袜人妻中文字幕在线| 国产真实露脸乱子伦原著| 特级a欧美做爰片第一次| 午夜不卡久久精品无码免费| 久久精品国产99精品国产亚洲性色| 亚洲成av人片一区二区| 一本一道久久综合久久| 日韩中文高清在线专区| 久久久亚洲一区二区三区| 免费观看的av毛片的网站| 久久精品中文字幕免费| 天堂а√在线地址在线| 精品国产福利一区二区三区| 午夜无码片在线观看影视| 国产成人a在线视频免费| 无码国产乱人伦偷精品视频| 国产精品美女久久久久av福利| 夜夜精品无码一区二区三区| 一本色综合网久久| 熟妇无码熟妇毛片| 精品推荐国产麻豆剧传媒| 亚洲色欲色欲综合网站| 国产成人久久精品流白浆| 囯产精品久久久久久久久久妞妞| 少妇极品熟妇人妻| 无码人妻视频一区二区三区| 人妻aⅴ中文字幕| 欧美成人高清ww| 天天综合网亚在线| 无码人妻一区二区三区免费视频| 88国产精品欧美一区二区三区| 亚洲av无码国产精品色午夜洪| 国产亚洲一区二区在线观看| 欧美人妻体内射射| 波多野结衣久久一区二区|