有不少朋友反映《循序渐进实现仿QQ界面》里面的示例程序无法编译或编译有问题,以及希望能有MFC的工程,在此集中解答一下。
演示程序编译问题:
1、演示程序需要最新版本的RingSDK,请先用SVN到svn://svnhost.cn/RingSDK更新到最新版本,推荐用TortoiseSVN。TortoiseSVN的下载地址:http://tortoisesvn.net/downloads,安装后在资源管理器新建RingSDK目录,比如c:/ringsdk,在该文件夹上按鼠标右键,选择“SVN 检出”,输入地址svn://svnhost.cn/RingSDK,按确定就获取到了最新版本的RingSDK。
2、安装platform sdk,可以到微软网站去下或是到如下地址:ftp://platformsdk:platformsdk@61.132.59.166/platform_sdk.zip,如果setup不能安装请用setup 目录里的psdk_x86.msi安装。安装后选择VC菜单Tools->Options...,在弹出的对话框中选择Directories页,Show directories for:下拉框里选择include files,然后在下面列表中确认Platform SDK的include目录是排在第一位。同时把RingSDK的include目录加入列表,如下图:
然后Show directories for:下拉框里选择Library files,确认Platform SDK的lib目录排在第一位,把RingSDK的lib目录加入列表。如果你想调试程序时跟进RingSDK源代码,应该把RingSDK下libsrc下的目录加入到Source files列表里面。
3、编译RingSDK,先打开ringsdk/libsrc/freelib目录下3个子目录里的工程,这是3个第3方库,zlib,png和jpeg库,编译一下。然后打开ringsdk/ringsdk.dsw,编译RingSDK库
4、至此环境已经搭建完成,可以编译ringsdk/example下的示例程序和仿QQ界面的演示程序了。
MFC如何调用RingSDK图象库:
这里有个演示程序,MFC工程,下载地址:http://download.youkuaiyun.com/source/2028551
先看看程序截图:
是一个动画异性型窗口,按左键可拖动,按右键弹出菜单可选择退出。在此说明一下步骤,按此步骤可以不用去下这个演示程序,自己就能做出来。
1、新建一MFC对话框工程mfcdibdemo,选择使用MFC静态库。
2、选择VC菜单Project->setting...,General标签页,确认Microsoft Foundation Classes:的选项是Use MFC in a Static Library,然后选择C/C++标签页,Catgory:选择Code Generation,然后在下面的Use run-time library里面选择Debug Multithreaded或Multithreaded,设置完成。
3、把上面的程序截图图片存到本地,加入到资源,资源类型输入"GIF",连引号一起输入,资源ID为IDG_BKG
4、新建菜单资源,如下图:
映射两个菜单项命令函数为OnHelp和OnExit
5、CMfcdibdemoDlg增加WM_LBUTTONDOWN,WM_RBUTTONDOWN,WM_MEARUSEITEM,WM_DRAWITEM,消息的处理
6、代码修改:
mfcdibdemoDlg.h的开始包含图象库和界面库的头文件:
#include "ringdib.h"
#include "ringdows.h"
CMfcdibdemoDlg类增加两个成员变量:
RingDIB m_dib;
RingCoolMenu *m_rm;
修改mfcdibdemoDlg.cpp文件:
CMfcdibdemoDlg::OnInitDialog的最后,//TODO下面添加如下代码:
view plaincopy to clipboardprint?
//MFC调用RingSDK库必须执行此初始化,第一个参数应该是主窗口句柄,可为NULL,第2个参数必须正确传递
InitRingLib(m_hWnd,AfxGetResourceHandle());
DIBREGFORMAT(GIF);
m_dib.Load(MAKEINTRESOURCE(IDG_BKG),"GIF",GIF);
m_dib.SetTarget(m_hWnd);
m_dib.CreateCoolWindow();
m_rm = new RingCoolMenu;
m_rm->LoadPopup(MAKEINTRESOURCE(IDR_POPMENU));
m_rm->SetXPStyle();
//MFC调用RingSDK库必须执行此初始化,第一个参数应该是主窗口句柄,可为NULL,第2个参数必须正确传递
InitRingLib(m_hWnd,AfxGetResourceHandle());
DIBREGFORMAT(GIF);
m_dib.Load(MAKEINTRESOURCE(IDG_BKG),"GIF",GIF);
m_dib.SetTarget(m_hWnd);
m_dib.CreateCoolWindow();
m_rm = new RingCoolMenu;
m_rm->LoadPopup(MAKEINTRESOURCE(IDR_POPMENU));
m_rm->SetXPStyle();
新增的消息代码:
+ expand sourceview plaincopy to clipboardprint?
void CMfcdibdemoDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnLButtonDown(nFlags, point);
EasyMove(m_hWnd);
}
void CMfcdibdemoDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnRButtonDown(nFlags, point);
m_rm->Popup(m_hWnd);
}
void CMfcdibdemoDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO: Add your message handler code here and/or call default
if(lpMeasureItemStruct->CtlType == ODT_MENU)
{
LPRINGMENUSTYLE lprms = (LPRINGMENUSTYLE)lpMeasureItemStruct->itemData;
if(lprms)
{
try
{
lprms->pMenu->MeasureItem(lpMeasureItemStruct);
}
catch(...)
{
}
}
}
//CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
void CMfcdibdemoDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your message handler code here and/or call default
if(lpDrawItemStruct->CtlType == ODT_MENU)
{
LPRINGMENUSTYLE lprms = (LPRINGMENUSTYLE)lpDrawItemStruct->itemData;
if(lprms)
{
try
{
lprms->pMenu->Draw(lpDrawItemStruct);
}
catch(...)
{
}
}
}
//CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
void CMfcdibdemoDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
delete m_rm;
CDialog::OnClose();
}
void CMfcdibdemoDlg::OnExit()
{
// TODO: Add your command handler code here
PostMessage(WM_SYSCOMMAND,SC_CLOSE);
}
void CMfcdibdemoDlg::OnHelp()
{
// TODO: Add your command handler code here
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
void CMfcdibdemoDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnLButtonDown(nFlags, point);
EasyMove(m_hWnd);
}
void CMfcdibdemoDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnRButtonDown(nFlags, point);
m_rm->Popup(m_hWnd);
}
void CMfcdibdemoDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO: Add your message handler code here and/or call default
if(lpMeasureItemStruct->CtlType == ODT_MENU)
{
LPRINGMENUSTYLE lprms = (LPRINGMENUSTYLE)lpMeasureItemStruct->itemData;
if(lprms)
{
try
{
lprms->pMenu->MeasureItem(lpMeasureItemStruct);
}
catch(...)
{
}
}
}
//CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
void CMfcdibdemoDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your message handler code here and/or call default
if(lpDrawItemStruct->CtlType == ODT_MENU)
{
LPRINGMENUSTYLE lprms = (LPRINGMENUSTYLE)lpDrawItemStruct->itemData;
if(lprms)
{
try
{
lprms->pMenu->Draw(lpDrawItemStruct);
}
catch(...)
{
}
}
}
//CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
void CMfcdibdemoDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
delete m_rm;
CDialog::OnClose();
}
void CMfcdibdemoDlg::OnExit()
{
// TODO: Add your command handler code here
PostMessage(WM_SYSCOMMAND,SC_CLOSE);
}
void CMfcdibdemoDlg::OnHelp()
{
// TODO: Add your command handler code here
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
注意OnMeasureItem和OnDrawItem里面不能调用CDialog::OnMeasureItem和CDialog::OnDrawItem,因为MFC会试图获取MFC的菜单对象但是获取不到,会非法操作。
7、完成,编译程序。
说明:用MFC的话其实不应该用RingSDK界面库,因为都是对窗口,控件做了封装,想要把仿QQ界面程序移植到MFC,应该自己创建MFC窗口和控件,贴图代码可以照搬。
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/ringphone/archive/2010/01/29/5271270.aspx