目前用visual studio做一个基于windows mobile5.0的camera应用程序.想完全设计自己风格的界面,遇到一个问题怎么也解决不了,请各位达人群策群力帮忙思考.
1.首先利用visual studio应用程序建立向导生成一基于smart device的mfc应用程序框架,生成的框架中会自动生成一commandbar,放在最底部.由于想整个界面风格一直,在oninitdialog中去掉了该commandbar的生成代码
#if 0
if (!m_dlgcommandbar.create(this) ¦ ¦
!m_dlgcommandbar.insertmenubar(idr_menu_mymenu))
{
trace0( "failed to create commandbar\n ");
return false; // fail to create
}
#endif
2.通过自己响应vk_tsoft1,vk_tsoft2,即左右软键来弹出自己的主菜单或退出程序.
然而由于vk_tsoft1,vk_tsoft2被注册成系统热键,只能在pretranslatemessage中截获到key_up事件,没办法将就着用,检测到有vk_tsoft1就用trackpopupmenuex弹出自己的主菜单.问题出现了,由于trackpopupmenuex有自己的消息循环机制,像黑洞一样吃掉了所有的按键事件包括vk_tsoft1键,结果再也没机会通过vk_tsoft1消除之了.经过两天的折磨,想出了如下办法解决,结果每种方案总有饶不过去的坎,简直疯狂.
解决方案一.
添加键盘勾子,在弹出菜单后监听按键事件,判断如果有vk_tsoft1按下则收起pop菜单.
g_hhookapidll = loadlibrary(_t( "coredll.dll "));
setwindowshookex = (_setwindowshookexw)getprocaddress(g_hhookapidll, _t( "setwindowshookexw "));
g_hinstalledllkbdhook = setwindowshookex(wh_keyboard_ll, llkeyboardhookcallbackfunction,hinstance, 0);
callnexthookex = (_callnexthookex)getprocaddress(g_hhookapidll, _t( "callnexthookex "));
unhookwindowshookex = (_unhookwindowshookex)getprocaddress(g_hhookapidll, _t( "unhookwindowshookex "));
然而发现setwindowshookex调用不成功,在msdn狂查一遍后才知道wince4.2以后已经不支持这样使用键盘勾子了.由于我在windows mobile5.0下开发,系统是wince5.0没法再继续下去.只好作罢
解决方案二.
1.解除vk_tsoft1,vk_tsoft2的系统热键,在自己的应用程序中定义其行为.
typedef bool (__stdcall *unregisterfunc1proc)( uint, uint );
hinstance hcoredll;
unregisterfunc1proc procundergisterfunc;
hcoredll = loadlibrary(_t( "coredll.dll "));
assert(hcoredll);
procundergisterfunc = (unregisterfunc1proc)getprocaddress(
hcoredll, _t( "unregisterfunc1 "));
assert(procundergisterfunc);
procundergisterfunc(mod_keyup ¦ mod_win, vk_tsoft1);
bool bres = registerhotkey(m_hwnd, vk_tsoft1,mod_keyup ¦
mod_win, vk_tsoft1);
2.响应wm_hotkey
on_message(wm_hotkey,&ccebuttondlg::onhotkey)
在onhotkey函数中弹出或收起pop menu.
这样处理后,本可以实现,但是泄气的是,当退出应用程序后,由于调用unregisterfunc1proc函数,vk_tsoft1,vk_tsoft2本来的行为恢复不了拉,idle界面下再也响应不了vk_tsoft1,vk_tsoft2事件了.然而在coredll中我又找不到恢复其默认系统热键的函数,只好放弃
解决方案三.
创建commandbar,但使其隐藏或者高度为0,然后利用shcmbm_overridekey改变vk_tsoft1,vk_tsoft2的行为
1.
#if 1
if (!m_dlgcommandbar.create(this) ¦ ¦
!m_dlgcommandbar.insertmenubar(idr_menu_mymenu))
{
trace0( "failed to create commandbar\n ");
return false; // fail to create
}
#endif
2.
::sendmessage (m_dlgcommandbar, shcmbm_overridekey, vk_tsoft2, makelparam
(shmbof_nodefault ¦ shmbof_notify, shmbof_nodefault ¦ shmbof_notify));
::sendmessage (m_dlgcommandbar, shcmbm_overridekey, vk_tsoft1, makelparam
(shmbof_nodefault ¦ shmbof_notify, shmbof_nodefault ¦ shmbof_notify));
m_dlgcommandbar.show(false);
3.在onhotkey函数中接收vk_tsoft1,vk_tsoft2的按键事件,弹出或收起pop 菜单
然而郁闷之至的是,如果commandbar设为不可见,则onhotkey中接收不到vk_tsoft1,vk_tsoft2事件,设为可见m_dlgcommandbar.show(true),虽然可以收到事件并正常弹出或收起菜单,但是底部默认的commandbar无法消除或覆盖,影响整体的风格.我是想在底部放两个自绘的水晶按钮的. 然而按钮却被commandbar给覆盖掉了
写这么多不知道有人能耐心看完不,或许我的方案从根本上就错了,按理设计一个全屏应用程序不该如此困难的吧
分享到:
相关推荐
首先,创建新项目时,选择“文件”->“新建”->“项目”,在“项目类型”中选择“Visual C++项目”,然后在“模板”中选择“Win32 控制台应用程序”。项目名称可根据个人喜好自定义,例如“PureC”。 在“Win32 ...
在本文中,我们将深入探讨如何使用Visual Studio 2010和C#语言来创建一个基本的窗体应用程序,特别关注用户登录界面的构建以及图片的本地加载功能。Visual Studio 2010是一款强大的集成开发环境(IDE),它为开发者...
Visual Stdio 2017 + QT 5.9 编译QScintilla库,分别编译了debug和release版本。编译步骤见https://blog.csdn.net/QIUCHUNHUIGE/article/details/89186937
在软件开发领域,Microsoft Visual Studio 2015(简称VS2015)是一款强大的集成开发环境(IDE),广泛应用于Windows平台上的应用程序开发。其中,C++是其重要的编程语言支持之一。然而,有时候在开发过程中,可能会...
MySQL是世界上最受欢迎的开源数据库系统之一,而ODBC(Open Database Connectivity)则是一种标准的应用程序编程接口(API),它允许应用程序通过独立于数据库系统的数据源访问数据库。在本主题中,我们将探讨如何...
ArcGIS Silverlight Visual Stdio项目模版-ShowcaseTemplate
ArcGIS Silverlight Visual Stdio项目模版-MinimalTemplate
在IT领域,Visual Studio是一款广泛使用的集成开发环境(IDE),尤其在Windows平台上的软件开发中占据主导地位。...通过掌握这些知识,开发者可以有效地在Visual Studio中开发出高效、功能丰富的图像处理应用程序。
C++是一种静态类型、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的程序设计语言。C++的发展基于C语言,但增加了类、模板、异常处理等特性,使得它更适合大型系统开发和复杂问题的解决...
【标题】"用Visual Studio 2005开发的MyQQ聊天室程序"涉及的核心知识点主要集中在使用Visual Studio 2005这个集成开发环境(IDE)以及C#编程语言来构建一个网络通信应用,即MyQQ聊天室。Visual Studio 2005是微软...
"Visual Studio 中的 Debug 使用" 在 Visual Studio 中,Debug 是一个非常重要的功能,它可以帮助开发者快速地发现程序中的错误和问题。在本文中,我们将介绍如何在 Visual Studio 中设置断点并调试程序,从而更快...
Visual stdio2010测试版,最新关于Visual stdio的测试版本
visual stdio 批量编译
挺不错的vs功能强大,实用性强,整合了多种语言,方便快捷
《Visual Studio 2008 C# 图书管理系统》是一个基于C#编程语言,利用Microsoft Visual Studio 2008开发环境构建的应用程序,主要用于图书馆的信息化管理。这个系统涵盖了图书馆管理的核心功能,如读者管理、图书入库...