郑州大学信息工程学院软件学院2008级毕业设计 Unicode只能使用两字节进行编码。例如\这个单词在系统中存储的形式: Unicode的存储形式:
| 42 00 | 6F 00 | 62 00 | 00 00 | |-----------------------------------------------|
| B | o | b | BOS |
MBCS的存储形式:
| 42 | 6F | 62 | 00 |
|-----------------------------------------------|
| B | o | b | BOS |
从上图中就可以可以清楚地看出MBCS格式与Unicode存储形式的区别,所
以在不同编码格式字符串中,如果不进行转换,则在字符串的处理过程中势必会造成乱码等错误。在腾讯微博提供的API中,MBCS与Unicode的转换是通过Utf8ToMbcs()函数进行的.
3.6.2 char*、string和CString的转换
string和CString均是字符串模板类,string为标准模板类(STL)定义
的字符串类,已经纳入C++标准之中而char*为C编程中最常用的字符串指针,一般以'\\0'为结束标志。它们三者之间的转换方法如下:
(1) string 与 CString
string转CString :CString.format(”%s”, string.c_str()); CString转string :string s(CString.GetBuffer()); (2) char* 与CString
char* 转 CString:CString.format(”%s”, char*);
CString 转 char*:char* p= CString.GetBuffer(CString.GetLength()); (3) char* 与string
char转string :string s(char *); string转char*:char *p = string.c_str();
17
郑州大学信息工程学院软件学院2008级毕业设计
四、软件详细设计与实现
4.1 相关变量的定义
在程序中,因为要频繁的使用用户的相关信息,且不只要在一个才类里面
使用,所以,为了方便使用,把用户的相关信息,包括姓名,昵称,粉丝数,广播数等等定义为一个全局结构体,这样就可以方便的在各个类里进行调用了。定义如下: typedef struct info {
CString infName;//用户名称 CString infNick; //用户昵称
CString infHead ; //用户头像的网络地址 CString infHeadPath ; //用户头像的本地地址 CString infId ; //用户ID
CString infFansnum ; //用户粉丝数 CString infIdolnum ; //用户收听数 CString infTweetnum ; //用户广播数
}information ;
extern information MyInf ;
同样的,对于某一条微博的相关信息,也需要在不同的几个类里使用,所以,把一条微博的相关信息也定义为一个全局的结构体变量,定义如下: typedef struct WBInf {
CString WBId;//微博的ID CString WB;//微博的内容
CString WBPicUrl;//微博配图的网路地址
18
郑州大学信息工程学院软件学院2008级毕业设计 CString WBPicPath;//微博配图的本地地址
}MyWbInf ;
extern MyWbInf WbListInf ;
4.2 相关图片的获取和显示
在一个微博客户端中,不仅要能显示用户的头像图片,而且还有很多微博是配备了图片,所以图片的显示也是微博客户端的一个重要功能。用户图像的获取与微博的图片获取方式相似。在客户端获得获取用户的相关信息后,对服务器的返回值进行JSON类型的解析,其中包含有“head”关键字,此关键字的值就是用户头像在网络上url地址,在这里,我们通过URLDownloadToFile()函数,将用户的头像从网络上的url地址下载下来,实现代码如下: URLDownloadToFile(0,MyInf.infHead,L\
其中MyInf.infHead中存储的用户头像的网络地址,“c:\\\\120.bmp”是图像的存储位置。
微博配图的获取用户头像的获取方式基本相似,只不过微博配图网络地址是
通过解析获取微博命令的返回值而得到的,同样的使用URLDownloadToFile()函数将其下载下来。
因为在mfc中的控件只能加载BMP格式的图片,所以使用URLDownloadToFile()
函数时,将图片类型保存为了bmp格式。
在客户端显示图片的方面,我们使用的MFC提供的Picture Control控件,通过获取该控件的显示区域,将图片显示在正确的位置。实现代码如下: CRect rect;
m_staticBitMap.GetClientRect(&rect); //获取相应控件的显示区域 CImage image;
image.Load(MyInf.infHeadPath); //加载要显示的图片路径 CDC* pDC = m_staticBitMap.GetWindowDC();
image.Draw( pDC -> m_hDC,rect); //图片在控件上显示 ReleaseDC(pDC); return 0; 效果图如下:
19
郑州大学信息工程学院软件学院2008级毕业设计
图4-1 用户头像的显示
图4-2 微博配图的显示
4.3 用户登录的设计与实现
用户在登陆客户端的时候,先点击客户端上的授权链接到腾讯授权服务页
面上输入自己的用户名和密码,将得到的授权码输入到客户端中就可完成登陆操作。如果用户输入的授权码得不到腾讯服务器的认证,则用户的登陆就失败,程序就无法再向下进行。登陆界面如下:
图4-3 登陆界面
用户点击“点击从腾讯微博登陆”链接后,客户端会和腾讯服务器通讯完成OAUTH认证的第一和第二步,当用户输入从授权页面获得授权码之后,客户端会完成授权认证的第三部,获得TokenKey和TokenSecrect,从而获得获取用户信息的权限。点击“点击从腾讯微博登陆”后的事件响应如下:
void CLogInDlg::OnNMClickSyslink1(NMHDR *pNMHDR, LRESULT *pResult) {
int irettoken = 0 ;
irettoken =GetRequestTokens(pstrAppKey, pstrAppSecret, strReqkey,
20
郑州大学信息工程学院软件学院2008级毕业设计 strReqsecret);//完成授权认证第一步
if (0 != irettoken) { }
AfxMessageBox(L\获取授权第一步出错\
return ;
std::string strOauthtoken;
irettoken = GetOauthToken(strReqkey, strReqsecret, strOauthtoken);//认证第二步
if (0 != irettoken) { }
*pResult = 0;}
AfxMessageBox(L\获取授权第二步出错\return ;
4.4 用户信息模块的设计与实现
用户登录后,客户端会利用获得的权限,向服务器请求用户的相关信息,
包括用的头像、昵称、微博数、听众数和粉丝数,然后将其显示出来,如图所示:
图4-4 用户信息
在客户端向服务器请求用户数据时,需要带上获得授权的相关信息,具体实现如下:
int AddFixPara(CWeiboParam& oParam, std::string& strAppkey, std::string &strAppsecret, std::string &strTokenkey, std::string &strTokensecret) {
oParam.Clear();
std::string c_strCustomKey std::string c_strTokenKey
= \= \
std::string c_strCustomSecrect
= \
std::string c_strTokenSecrect = \
oParam.AddParam(c_strCustomKey.c_str(), strAppkey.c_str());
21