类似qq魔法表情播放器的实现
来源:互联网 发布:淘宝如何设置降价宝贝 编辑:程序博客网 时间:2024/03/29 05:28
qq魔法表情播放器应该是一个dynamic ole object host之类的东东,其能播放swf之类的文件,并且播放时是没有窗体的,这让人看起来感觉很酷,下面简单的讲一下其实现。
首先利用flash.ocx写一个透明显示flash的控件,这个可以参考http://www.codeguru.com/cpp/com-tech/activex/com/article.php/c12229/#more关于写透明flash控件的。
然后在该透明flash控件上添上相关的有用的设置,大家可以添加自己想要的功能,我讲下我添加的功能和实现步骤。
1.用vs2008(推荐vs 6.0,我是没有安装)创建个Win32的项目,然后向项目添加下载的透明flash控件FlashWnd.cpp和FlashWnd.h文件。
2.因为要无窗体显示透明的flash,可以在主窗体创建后并不显示,然后创建相应的CFlashWnd。
3.因为隐藏了主窗口,所以要用透明显示Flash的控件来交互,如加载flash、退出程序,这里可以通过修改FlashWnd.h中的COleContainerWnd窗口的回调函数来实现
4.主窗口的回调函数,与透明显示flash要相关的交互
这样无窗体的可以显示透明flash的播放器就实现了,运行截图
相关源代码(上传不了附件,就搁到资源上了),下载页面
首先利用flash.ocx写一个透明显示flash的控件,这个可以参考http://www.codeguru.com/cpp/com-tech/activex/com/article.php/c12229/#more关于写透明flash控件的。
然后在该透明flash控件上添上相关的有用的设置,大家可以添加自己想要的功能,我讲下我添加的功能和实现步骤。
1.用vs2008(推荐vs 6.0,我是没有安装)创建个Win32的项目,然后向项目添加下载的透明flash控件FlashWnd.cpp和FlashWnd.h文件。
2.因为要无窗体显示透明的flash,可以在主窗体创建后并不显示,然后创建相应的CFlashWnd。
- int APIENTRY _tWinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow)
- {
- UNREFERENCED_PARAMETER(hPrevInstance);
- UNREFERENCED_PARAMETER(lpCmdLine);
- // TODO: 在此放置代码。
- MSG msg;
- HACCEL hAccelTable;
- // 初始化全局字符串
- LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
- LoadString(hInstance, IDC_MAGICFLASH, szWindowClass, MAX_LOADSTRING);
- MyRegisterClass(hInstance);
- // 执行应用程序初始化:
- if (!InitInstance (hInstance, nCmdShow))
- {
- return FALSE;
- }
- hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MAGICFLASH));
- OleInitialize(NULL);
-
- //创建相应的显示透明flash的控件窗口
- g_flashWnd = new CFlashWnd;
- g_flashWnd->Create(ShockwaveFlashObjects::CLSID_ShockwaveFlash,
- WS_EX_LAYERED, WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS,
- g_hWnd, g_hInst);
- // 主消息循环:
- while (GetMessage(&msg, NULL, 0, 0))
- {
- if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- delete g_flashWnd;
- OleUninitialize();
- return (int) msg.wParam;
- }
- OLECONTAINER(LRESULT)::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- int wmId, wmEvent;
- switch (uMsg)
- {
- case WM_COMMAND:
- {
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // 分析菜单选择:
- switch (wmId)
- {
- case ID_RIGHTMENU_LOAD:
- {
- //加载Flash,显示打开文件对话框
- OPENFILENAME ofn;
- memset(&ofn, 0, sizeof(OPENFILENAME));
- memset(szFile, 0, sizeof(szFile));
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = m_hWnd;
- ofn.lpstrFile = szFile;
- ofn.nMaxFile = MAX_PATH;
- ofn.lpstrFilter = TEXT("SWF Files (*.swf)/0*.swf/0");
- ofn.lpstrDefExt = TEXT("swf");
- ofn.lpstrTitle = TEXT("打开SWF文件");
- ofn.nFilterIndex = 1;
- ofn.lpstrFileTitle = NULL;
- ofn.nMaxFileTitle = 0;
- ofn.lpstrInitialDir = NULL;
- if(GetSaveFileName(&ofn))
- {
- WritePrivateProfileString(L"Magic Flash", L"File", szFile, L"MagicFlash.ini");
- m_bGetRect = FALSE;
- m_uSize = ID_RIGHTMENU_NORMAL;
- OnAfterShowingContent();
- }
- }
- break;
- //设置播放Flash的质量,这里采用多态实现,SetQuality为一虚函数,在CFlashWnd中实现
- case ID_RIGHTMENU_LOW:
- case ID_RIGHTMENU_MID:
- case ID_RIGHTMENU_HIGH:
- m_uQuality = wmId;
- SetQuality(m_uQuality);
- break;
- //设置播放flash的大小
- case ID_RIGHTMENU_QUARTER:
- case ID_RIGHTMENU_HALF:
- case ID_RIGHTMENU_THREE_QUARTER:
- case ID_RIGHTMENU_NORMAL:
- case ID_RIGHTMENU_DOUBLE:
- {
- if(!m_bGetRect)
- {
- RECT rt;
- GetWindowRect(hWnd, &rt);
- m_uNormalHeight = rt.bottom - rt.top;
- m_uNormalWidth = rt.right - rt.left;
- m_bGetRect = TRUE;
- }
- m_uSize = wmId;
- SetSize(hWnd, m_uSize);
- }
- break;
- //弹出About窗口,并把消息发给主窗口
- case ID_RIGHTMENU_ABOUT:
- SendMessage(m_hWndParent, WM_COMMAND, IDM_ABOUT, NULL);
- break;
- //设置是否最前显示
- case ID_RIGHTMENU_TOP:
- m_bTopCheck = !m_bTopCheck;
- if(m_bTopCheck)
- {
- SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
- }
- else
- {
- SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
- }
- break;
- //退出消息,发送给主窗口
- case ID_RIGHTMENU_EXIT:
- PostQuitMessage(0);
- SendMessage(m_hWndParent, WM_DESTROY, wParam, lParam);
- break;
- default:
- return DefWindowProc(hWnd, uMsg, wParam, lParam);
- }
- }
- break;
- case WM_CREATE:
- {
- LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
- SetWindowLong(hWnd, GWL_USERDATA, (long)lpcs->lpCreateParams);
- return 0;
- }
- break;
- case WM_PAINT:
- {
- if (!m_bTransparent)
- {
- PAINTSTRUCT ps;
- HDC hdc = ::BeginPaint(GetHWND(), &ps);
- Draw(hdc, &ps.rcPaint, ps.fErase);
- ::EndPaint(GetHWND(), &ps);
- return 0;
- }
- }
- break;
- case WM_NCHITTEST:
- {
- int x = LOWORD(lParam), y = HIWORD(lParam);
- if (m_lpO && m_lpViewObjectEx)
- {
- IViewObjectEx *lpV = m_lpViewObjectEx;
- POINT p = {x, y};
- DWORD dwRes;
- RECT rTotal;
- GetWindowRect(GetHWND(), &rTotal);
- HRESULT hr = lpV->QueryHitPoint(DVASPECT_CONTENT, &rTotal, p, 1, &dwRes);
- if (hr == S_OK)
- {
- if (dwRes == HITRESULT_OUTSIDE)
- return HTTRANSPARENT;
- else
- return HTCLIENT;
- }
- }
- }
- break;
- case WM_LBUTTONDOWN:
- SendMessage(m_hWnd, WM_NCLBUTTONDOWN, HTCAPTION, lParam);
- break;
- case WM_LBUTTONUP:
- SendMessage(m_hWnd, WM_NCLBUTTONUP, HTCAPTION, lParam);
- break;
- case WM_SIZE:
- {
- HRESULT hr;
- RECT rPos;
- GetClientRect(GetHWND(), &rPos);
- RECT rClip = rPos;
- if (m_lpInPlaceObjWindowless)
- hr = m_lpInPlaceObjWindowless->SetObjectRects(&rPos, &rClip);
- else if (m_lpInPlaceObj)
- hr = m_lpInPlaceObj->SetObjectRects(&rPos, &rClip);
- return 0;
- }
- break;
- //弹出相应的右键菜单
- case WM_RBUTTONDOWN:
- {
- POINT curPos;
- GetCursorPos(&curPos);
- HMENU popMenu,rightMenu;
- rightMenu = LoadMenu(m_hInst, MAKEINTRESOURCE(IDR_MENU_RIGHT_POP));
- popMenu = GetSubMenu(rightMenu, 0);
- if(m_bTopCheck)
- {
- CheckMenuItem(popMenu, ID_RIGHTMENU_TOP, MF_BYCOMMAND | MF_CHECKED);
- }
- CheckMenuItem(popMenu, m_uQuality, MF_BYCOMMAND | MF_CHECKED);
- CheckMenuItem(popMenu, m_uSize, MF_BYCOMMAND | MF_CHECKED);
- TrackPopupMenu(popMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,curPos.x,curPos.y,0, hWnd, NULL);
- DestroyMenu(popMenu);
- DestroyMenu(rightMenu);
- }
- break;
- }
- if (m_lpInPlaceObjWindowless)
- {
- if (uMsg == WM_MOUSEMOVE || /*uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONUP ||*/ uMsg == WM_LBUTTONDBLCLK
- || uMsg == WM_RBUTTONUP || uMsg == WM_RBUTTONDBLCLK
- || uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONUP || uMsg == WM_MBUTTONDBLCLK
- || uMsg == WM_MOUSEWHEEL
- || uMsg == WM_KEYDOWN || uMsg == WM_KEYUP || uMsg == WM_CHAR
- || uMsg == WM_SETCURSOR
- )
- {
- HRESULT hr;
- LRESULT res;
- hr = m_lpInPlaceObjWindowless->OnWindowMessage(uMsg, wParam, lParam, &res);
- if (hr == S_OK)
- return res;
- }
- }
- return DefWindowProc(hWnd, uMsg, wParam, lParam);
- }
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- int wmId, wmEvent;
- PAINTSTRUCT ps;
- HDC hdc;
- UINT WM_TASKBARCREATED;
- // 不要修改TaskbarCreated,这是系统任务栏自定义的消息
- WM_TASKBARCREATED = RegisterWindowMessage(TEXT("TaskbarCreated"));
- switch (message)
- {
- case WM_CREATE:
- {
- //添加相应的系统托盘
- nid.cbSize = sizeof(nid);
- nid.hWnd = hWnd;
- nid.uID = 0;
- nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
- nid.uCallbackMessage = WM_USER;
- nid.hIcon = g_hIcon;
- nid.dwState = NIS_SHAREDICON;
- nid.uTimeout = 5000;
- nid.dwInfoFlags = NIIF_INFO;
- lstrcpy(nid.szTip, L"MagicFlash");
- lstrcpy(nid.szInfoTitle, L"MagicFlash");
- lstrcpy(nid.szInfo, L"未加载Flash");
- Shell_NotifyIcon(NIM_ADD, &nid);
- }
- break;
- case WM_USER:
- {
- if (lParam == WM_LBUTTONDBLCLK)
- {
- SetForegroundWindow(g_flashWnd->m_hWnd);
- }
- if (lParam == WM_RBUTTONDOWN)
- {
- SetForegroundWindow(hWnd);
- SendMessage(g_flashWnd->m_hWnd, WM_RBUTTONDOWN, wParam, lParam);
- }
- }
- break;
- case WM_COMMAND:
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // 分析菜单选择:
- switch (wmId)
- {
- case IDM_ABOUT:
- DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), g_flashWnd->m_hWnd, About);
- break;
- case IDM_EXIT:
- DestroyWindow(hWnd);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- break;
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: 在此添加任意绘图代码...
- EndPaint(hWnd, &ps);
- break;
- case WM_DESTROY:
- Shell_NotifyIcon(NIM_DELETE, &nid);
- PostQuitMessage(0);
- break;
- default:
- if(message == WM_TASKBARCREATED)
- {
- SendMessage(hWnd, WM_CREATE, wParam, lParam);
- break;
- }
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }
相关源代码(上传不了附件,就搁到资源上了),下载页面
- 类似qq魔法表情播放器的实现
- 类似QQ秀的魔法表情
- QQ魔法表情实现原理
- QQ魔法表情实现原理
- qq网站的魔法表情
- 类似qq聊天表情实现
- 类似qq聊天表情实现
- android 实现类似qq表情
- QQ魔法表情实现原理源代码下载
- Android: 实现类似QQ、微信的表情输入键盘
- Android: 实现类似QQ、微信的表情输入键盘
- 类似android手机QQ表情实现
- 类似QQ表情的控件 EmotionContainer(原创)
- 类似qq表情
- 用DELPHI、RxRichEdit控件实现类似QQ的表情输入方法
- richTextBox如何实现输入指定的字符显示一个表情图标?类似QQ那样?
- android QQ表情的实现
- 类似QQ表情的功能,包括动态绑定图片
- 2001链接错误
- 功能源码源码列表,Asp.net源码|—51aspx.com
- 高可用高性能系统(五)基于规则的请求路由
- 杨洁篪揭幕中国驻美大使馆新馆(图)
- tangdh - 博客园
- 类似qq魔法表情播放器的实现
- 高可用高性能系统(六)虚拟网
- 找了一下午的错误 ~
- Linux环境下DNS服务器的配置
- TFT液晶和CSTN液晶的区别
- QAS传输
- 转:Windows下OMNET++的安装和各种架构调试心得
- Excel
- 高可用高性能系统(七)状态和无状态