第一篇:个人总结的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里的内容是放在
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)
文档为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,所以即便是在商业上,大家也可以安心使用。 现在大家可以从这个......