C++小键盘(二)——带tab切换样式
2017-06-08 10:34
232 查看
实现上面这种针对车牌号的小键盘。
1、省份和 数字/字母 的切换
2、如果点击 省份按钮,始终省份文字是在edit内容的最前面
首先有个对话框类CmyNumCarDlg,
然后,这个对话框作为父窗口,上面放 省份和 数字/字母 按钮,关闭按钮,以及两个 子窗口 CmyNumPageDlg* pTabPage[2] ;
CmyNumCarDlg文件中涉及到的 键盘窗口调出和 销毁的过程参考 C++小键盘(一)
按钮切换时对应的pTabPage的切换,略。
set strBtnSet1,strBtnSet2;
这两个set容器中分别 insert pTabPage[0]和pTabPage[1]中的按钮的文本内容。
SetSetData(); //set容器中插入值 pTabPage[0] = new CmyNumPageDlg((CSkinEdit*)m_pParentWnd, strBtnSet1,TRUE,this); pTabPage[1] = new CmyNumPageDlg((CSkinEdit*)m_pParentWnd, strBtnSet1,FALSE,this); pTabPage[0]->Create(IDD_DIALOG_NUM_PAGE, this); pTabPage[1]->Create(IDD_DIALOG_NUM_PAGE, this); .......
CreatePageBtn(strBtnSet1,pTabPage[0], CSize(4, 9), CSize(35,35),CPoint(5,5),CSize(4,6),vecBtn1); CreatePageBtn(strBtnSet2, pTabPage[1], CSize(5, 10), CSize(35,35), CPoint(5, 5), CSize(4,6),vecBtn2);
下面这个函数,动态创建tab页中的btn,并对button的宽高,以及上下左右间距统一进行设置,并存放在vector容器中,如果要对某个btn改变大小,再另写设置。
void CmyNumCarDlg::CreatePageBtn(set<CString>& myset,CmyNumPageDlg* pDlg,CSize &sizeRC,CSize &sizeWH,CPoint &sizeBegin,CSize &jianju,vector<CSkinButton*> &vecBtn) { //第一个button左上角是起始位置 set<CString>::iterator ite = myset.begin(); POINT pt; SIZE size; for (int i = 0; i < sizeRC.cx; i++) { pt.x = sizeBegin.x; pt.y = sizeBegin.y + i*(sizeWH.cy + jianju.cy); size = sizeWH; //CRect tmpRc(sizeBegin.x, sizeBegin.y+i*(sizeWH.cy+jianju.cy),sizeWH.cx, sizeWH.cy); CRect tmpRc(pt,size); int j=0; for (j=0;j < sizeRC.cy; j++) { CSkinButton* pBtn = new CSkinButton; //new的别忘记释放 if (pBtn->Create(_T(""), WS_CHILD | WS_VISIBLE,tmpRc, pDlg,WM_USER+i*sizeRC.cy+j)) //此处怎样避免ID冲突呢 { pBtn->SetFont(CFont::FromHandle(RenderEngine->GetFont(10))); } InitBtn(pBtn); pBtn->MoveWindow(&tmpRc); pBtn->SetWindowTextW(*ite); vecBtn.push_back(pBtn); ite++; if (ite == myset.end()) return; tmpRc.MoveToX(tmpRc.right + jianju.cx); } } }
CmyNumPageDlg这个对话框类是针对每个tab页:
CmyNumPageDlg::CmyNumPageDlg(CSkinEdit* pEdit,set<CString>& myset,BOOL isAllChinese,CWnd* pParent):CmyNumPageDlg(pParent)
传入 edit,tab页对应的set容器,是否全是中文(省份那个tab页全是中文)
以下是操作小键盘时的响应:
BOOL CmyNumPageDlg::OnCommand(WPARAM wParam, LPARAM lParam) { CString str; GetDlgItem(LOWORD(wParam))->GetWindowText(str); if (!str.IsEmpty()) { SendCharMsg(LOWORD(wParam)); if (isAllChinese) { ::PostMessage(GetParent()->m_hWnd, WM_COMMAND, MAKEWPARAM(IDC_BUTTON_NUM_NUMABC,BN_CLICKED),(LPARAM)GetParent()->GetDlgItem(IDC_BUTTON_NUM_NUMABC)->m_hWnd); } } return CSkinDialog::OnCommand(wParam, lParam); }
void CmyNumPageDlg::SendCharMsg(const UINT& uid) { if (NULL == pEdit) return; CString str; GetDlgItem(uid)->GetWindowText(str); //UINT ascid = 0; //ascid = str[0]; if (isAllChinese) { //如果第一个字符是省会 CString strEdit; pEdit->GetWindowTextW(strEdit); if (!strEdit.IsEmpty()) { CString strTmp(strEdit.GetAt(0)); set<CString>::iterator it = myset.find(strTmp); if (it != myset.end()) { //如果第一个字符是省会简称 strEdit.SetAt(0, str[0]); pEdit->SetWindowTextW(strEdit); } else { strEdit.Insert(0, str[0]); pEdit->SetWindowTextW(strEdit); } } else { strEdit.Insert(0, str[0]); pEdit->SetWindowTextW(strEdit); } int len = strEdit.GetLength(); pEdit->SetSel(len, len); //使光标定位在末尾 return; } if (str == _T("确认")) { ::PostMessage(GetParent()->m_hWnd, WM_COMMAND, MAKEWPARAM(IDCANCEL, BN_CLICKED),(LPARAM)GetParent()->GetDlgItem(IDCANCEL)->m_hWnd); } else if (str == _T("删除")) { ::PostMessage(pEdit->GetSafeHwnd(), WM_CHAR, 8, 0); } else { ::PostMessage(pEdit->GetSafeHwnd(), WM_CHAR, (WPARAM)str[0], 0); } }
相关文章推荐
- 滚动切换tab样式的效果实现
- js实现简单百度分页和两种tab样式切换简单实现
- DIV+CSS 样式简单布局Tab 切换
- 网页样式(css+js)tab自动切换的minisite
- Vue2.0 给Tab标签页和页面切换过渡添加样式
- 源码推荐:仿写映客直播 ,快速切换主题 ,星星评分控件,表格样式,可以横向移动的表格, 仿微信键盘-
- Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
- 在Firefox中使用键盘(F7插入式浏览,可用键盘选中要复制的文字,通过tab切换光标的位置)
- 自定义可滑动的tab选项卡,可切换选项卡样式(下划线,仿小米三角形,方形背景)
- jQueryday05(动画效果 切换样式 tab切换 DOM基本操作)
- Axure:巧用交互样式实现多tab切换效果
- linux fedora 24 设置 virtualbox 虚拟机程序 alt+tab 可切换 (键盘非独占)
- 解决升级火狐后无法使用键盘的Tab切换键以及复制粘贴键
- 菜单导航tab切换样式的小技巧
- jQuery带tab切换搜索框样式代码
- vue实现tab切换外加样式切换方法
- jQuery带tab切换搜索框样式代码
- [c++]模拟键盘热键调别的程序
- 多风格选择 样式实时切换
- 在Asp.Net 2.0中使用Css Tab Design样式美化菜单