关于菜单的创建和电表读数据的一些错误屏蔽和按钮中添加Bitmap
今天学习了关于菜单的创建。
1.拖取一个菜单,进行编辑想要创建的每个菜单项。记录每个菜单项的ID
在要菜单弹出的地方进行如下的操作:
1 CMenu menu; 2 menu.LoadMenu(IDR_MENU1); 3 CMenu *pMenu = menu.GetSubMenu(0); 4 if (!m_pPackageRfid->IsUseable()) 5 { 6 for (int i = ID_INVSTART; i <= ID_INVONCE; ++i) 7 pMenu->EnableMenuItem(i, MF_GRAYED); 8 } 9 pMenu->TrackPopupMenu(TPM_LEFTALIGN, m_Point.x, m_Point.y, this);
首先要通过该菜单的ID载入该菜单。然后获取菜单中的第0项。如果你想获取菜单的第一项也是可以。在刚开始的时候忘记这条语句,所以在下面的操作中,总是只是出现一条线,没有出现菜单项。在4~8行中,本来想要屏蔽在某些不符合要求的一些菜单的子项,只能通过该方法,找不到另外的方法来进行屏蔽。这里我用了MF_GRAYED,而不是MF_DIABLED这个,这个原因在msdn上面有很详细的解释。
1.5:手动创建菜单
在手动创建菜单的时候这里我为了对菜单进行绘画,所以先继承了CMenu。很多都是和通过ID载入菜单的差不多。不过在进行手动创建菜单时,并且要调用DrawItem的时候要注意一些问题。
a. AppendMenu(MF_OWNERDRAW);每个菜单或者子菜单都要调用这样的一个函数,是要告诉程序我要自己绘制该菜单从而才能去调用DrawItem
b.(UINT_PTR)menuSubRadio.m_hMenu,在添加子菜单的那个位置的ID要设置成这个某个子菜单的ID号,这样子才能去在点击的时候弹出子菜单。并且我使用的是弹出式的所以第一个参数的flag要置成MF_POPUP
但是现在我这里有一个问题就是我的界面太难看了,需要重绘下界面,因为我是在手持机上面进行开发,不能用一些特定的函数,所以不懂在DrawItem那里绘制,所以需要哪位大神帮忙说下,留下一点脚印。
2.电表错误的屏蔽
在前几天帮公司给客户一个自己写的关于红外抄读电表电量的程序中。由于我这里没有电表进行测试,所以只能把写好的程序发送到客户那里进行测试,可惜总是不成功。自己找原因也没找到。
刚才重新检查我的代码的时候,发现了我的程序在读取数据的时候有一个盲区:Sleep(20),由于该语句的存在所以在发送指令完成后可能电表反应的速度很快,在20毫秒之内就已经反馈回来了,我的程序还没来得及接收。所以总是出现异常的情况。
所以我把该语句屏蔽掉,在接收语句里面添加了一些的代码的处理程序自发自收的情况。
if (SUCCESS_RESPOND != SendData(pUchrSend, iLenth)) return FAILURE_TIMEOUT; //Sleep(20); return RecvData(pUchrRecv, rIRecvLen);
要添加接收语句的判断的原因是因为我们公司自己开发的手持机存在着这样的一个问题就是会出现自发自收的情况,导致收到的指令异常。
3.在按钮中添加图片
在按钮中添加图片的通用方式是在DrawItem中进行绘制。
1.获取按钮的大小和按钮的DC
2.载入位图LoadBitmap
3.创建内存设备环境,让它与按钮dc相容
4.获取位图的信息(数据结构)
5.把位图拷贝到按钮中
void CDrawButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CRect rc = lpDrawItemStruct->rcItem; CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CBitmap DrawBmp; if(lpDrawItemStruct->itemState & ODS_SELECTED) { DrawBmp.LoadBitmap(IDB_BITMAP2); } else DrawBmp.LoadBitmap(IDB_BITMAP1); CDC memDC; memDC.CreateCompatibleDC(pDC); BITMAP bmp; DrawBmp.GetBitmap(&bmp); CBitmap *pOldBmp = memDC.SelectObject(&DrawBmp); pDC->BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&memDC,0,0,SRCCOPY); memDC.SelectObject(pOldBmp); memDC.DeleteDC(); }