windows mobile系统自带的输入法没有标题栏,用户没有办法移动它的显示位置。如果对话框的底部,有需要输入的编辑框,就会被弹出的输入法遮挡住,这样用户无法实时看到自己输入的内容。

参考mobile自带的系统程序,一般可以做成下面这种效果。也就是弹出输入法时,自动给窗口添加一个滚动条。用户可以通过滚动条调整界面的显示。当关闭输入法时,将滚动条去掉,同时窗口恢复到弹出输入法之前的默认显示。

  

下面介绍如何实现这种功能。首先需要在系统“弹出输入法”和“关闭输入法”时,能够获得一个通知。这可以通过响应WM_SETTINGCHANGE消息来完成。

当执行到自定义的WM_SETTINGCHANGE消息响应函数时,需要判断“输入法”是被“弹出”还是被“关闭”了?这可以通过如下代码获得:

SIPINFO sip_info = {0};
sip_info.cbSize = sizeof(sip_info);
SHSipInfo(SPI_GETSIPINFO, 0, &sip_info, 0);
bool sipf_on = sip_info.fdwFlags & SIPF_ON;

当sipf_on为true时,表示“弹出输入法”,此时可以调整窗口显示,比如添加一个垂直滚动条,并将窗体初始滚到一个合适的位置,将最想让用户见到的部分显示出来。

SCROLLINFO scroll_info = {0};
scroll_info.cbSize = sizeof(SCROLLINFO);
scroll_info.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;scroll_info.nMin = 0;
scroll_info.nMax = 90;
scroll_info.nPage = 10;
vert_scroll_pos_ = 80;
scroll_info.nPos = vert_scroll_pos_;SetScrollInfo(SB_VERT, &scroll_info);
ScrollWindowEx(0, -scroll_info.nPos, NULL, NULL, NULL, NULL, SW_ERASE | SW_INVALIDATE | SW_SCROLLCHILDREN);

当sipf_on为false时,表示“关闭输入法”,此时可以关闭滚动条,同时窗口恢复到弹出输入法之前的默认显示。

GetScrollInfo (SB_VERT, &scroll_info);
ScrollWindowEx(0, scroll_info.nPos, NULL, NULL, NULL, NULL, SW_ERASE | SW_INVALIDATE | SW_SCROLLCHILDREN);ShowScrollBar(SB_VERT, FALSE);
vert_scroll_pos_ = 0;

最后还需要注意的是,因为添加了垂直滚动条,所以需要响应WM_VSCROLL消息并进行处理。

void XXXDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{SCROLLINFO scroll_info = {sizeof(SCROLLINFO), SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS, 0, 0, 0, 0, 0};GetScrollInfo (SB_VERT, &scroll_info);int move_distance = 0;int new_position = 0;switch (nSBCode){case SB_TOP:   scroll_info.nPos = scroll_info.nMin;   break;   case SB_BOTTOM:   scroll_info.nPos = scroll_info.nMax - scroll_info.nPage;   break;case SB_LINEDOWN:new_position = scroll_info.nPage + scroll_info.nPos;if(scroll_info.nMax > new_position)   move_distance = 5;   break;case SB_LINEUP:if(scroll_info.nPos <= scroll_info.nMin)   return;  move_distance = -5;   break;  case SB_PAGEUP:if(scroll_info.nPos <= scroll_info.nMin)   return;   new_position = (scroll_info.nPos - scroll_info.nPage);  move_distance = -(new_position <0 ? (int)scroll_info.nPage + new_position : (int)scroll_info.nPage);break;  case SB_PAGEDOWN:if(scroll_info.nMax <= scroll_info.nPos)   return;new_position = (scroll_info.nPos + scroll_info.nPage + scroll_info.nPage);move_distance = new_position >scroll_info.nMax ? scroll_info.nPage-(new_position - scroll_info.nMax) : scroll_info.nPage;break;case SB_THUMBTRACK:case SB_THUMBPOSITION:move_distance = (int)nPos - vert_scroll_pos_;break;}vert_scroll_pos_ += move_distance;if(0 != move_distance){SetScrollPos(SB_VERT, GetScrollPos(SB_VERT) + move_distance);   ScrollWindowEx(0, -move_distance, NULL, NULL, NULL, NULL, SW_ERASE | SW_SCROLLCHILDREN);}CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

转载于:https://www.cnblogs.com/zhuyf87/archive/2012/12/11/2812558.html

Windows Mobile系统弹出输入法时,自动调整窗口显示相关推荐

  1. 计算机任务计划程序已损坏,win7系统弹出任务计划程序窗口显示该任务映像损坏或已篡改0x80041321错误代码的解决方法...

    win7系统使用久了,好多网友反馈说win7系统弹出任务计划程序窗口显示该任务映像损坏或已篡改0x80041321错误代码的问题,非常不方便.有什么办法可以永久解决win7系统弹出任务计划程序窗口显示 ...

  2. MUI - 解决弹出输入法时页面高度变小导致底部上浮的问题

    MUI - 解决弹出输入法时页面高度变小导致底部上浮的问题 参考文章: (1)MUI - 解决弹出输入法时页面高度变小导致底部上浮的问题 (2)https://www.cnblogs.com/phil ...

  3. 关闭windows server 2016弹出交互式服务检测窗口

    在使用windows server 2016的时候,忘记点了什么之后,一直弹出: 如何关闭呢? 1.Win+R组合键打开运行,输入services.msc,点击回车: 2.在服务列表中找到Intera ...

  4. showdialog wpf 如何关闭_WPF用ShowDialog()弹出窗体时控制该窗体的显示位置,并传值回父窗体...

    原文:http://blog.csdn.net/kiss0622/article/details/5852153 方法一: 1.父窗口代码 Window1.xaml.cs private void B ...

  5. 玩游戏的时候计算机弹出,电脑玩游戏时总是弹出输入法怎么办?

    原标题:电脑玩游戏时总是弹出输入法怎么办? 相信不少喜欢打游戏多小伙伴有遇到过这个一个烦人的情况:在我们电脑上激烈地进行游戏时,突然按键切换到了输入法打字上了,这时我们的游戏就被无法操作进而影响到游戏 ...

  6. Android使用Windows弹出输入法

    Android系统除了可以使用InputMethodManager来弹出输入法外,还可以使用window弹出输入法,特别是在弹窗里有Edittext需要自动弹出输入法时,使用window弹出输入法比较 ...

  7. Win11系统玩游戏的时候总是弹出输入法怎么回事?

    Win11系统玩游戏的时候总是弹出输入法怎么回事?有的用户在玩电脑游戏的时候,突然电脑屏幕上就会自动弹出输入法,影响自己的游戏操作.那么这个问题要如何去解决它呢?一起看看以下的具体操作分享吧.     ...

  8. 手机调用系统的拍照和裁剪功能,假设界面有输入框EditText,在一些手机会出现点击EditText会弹出输入法,却不能输入的情况。...

    1. 拍照裁剪后 点击EditText会弹出输入法,却不能输入.可是点击点一EdtiText就能够输入了,所以我就写了一个看不见的EdtiText,切换焦点,这样就攻克了这个奇怪的这问题,应该是and ...

  9. android 弹出对话框时显示键盘

    今天,简单讲讲如何在弹出自定义的对话框时,弹出软键盘. 之前,我讲了如何制作自定义的对话框,现在,如果在弹出对话框时,自动弹出软键盘,将光标直接聚焦到自定义对话框的输入框内,那该怎么做呢? 在网上搜索 ...

最新文章

  1. 移动互联网的创新与91生态
  2. 不管你的x86能不能升级Win 11,反正树莓派能!|安装教程
  3. 图像梯度处理MATLAB代码
  4. 四种可变交流swap方法
  5. (转帖)C#--web services之wsdl文件生成cs
  6. catia钣金根据线段折弯_SolidWorks钣金折弯边角余料处理技巧,钣金工艺设计师都在用...
  7. java按钮鼠标_我想用java做一个鼠标永远点不到button的应用,下面这个程序的错误在哪?...
  8. 计算机的字体要怎么删除,计算机安装删除字体
  9. 一文读懂斗鱼上市:直播江湖风云再起,强行盈利背后的艰难上市路
  10. UCOS操作系统——系统内部任务(六)
  11. VMware清理vmdk文件
  12. 扒一扒最近很火的被马云强东联手封杀性感女黑帽
  13. 简单的学生选课系统——基于Servlet+Ajax
  14. HPE server 如何利用SPP包升级BIOS
  15. STM32时钟--基于正点原子STM32视频教程
  16. 云服务器ecs是虚拟机,云服务器ecs虚拟机
  17. 几款常用UML建模工具解析
  18. Canvas 画九宫格图片
  19. CSS高级雪碧图插入方法
  20. 4、公司融资 - 开公司创业系列文章

热门文章

  1. iOS开发—在@interface,@implementation和@property中变量的定义
  2. 前后端开发是怎么合作分工的
  3. ab 轻量的压测工具
  4. 园区交换网络和路由网络综合设计,测试完工啦
  5. Makefile和shell脚本调用上的一些总结
  6. Jetty架构解析及应用示例
  7. 今天微软关闭Silverlight官网,Sivlerlight真得要死了吗?
  8. 纯C++创建Windows窗体(理解WinMain()与WndProc())
  9. C# XML 添加,修改,删除Xml节点
  10. IOS基础之仿酷狗音乐第1天