在WindowsMobil系统中实现透明树组件

    技术2022-05-19  23

    因一个工程中需要使用WM来开发一款IM软件,后期实现界面的时候很费了一翻功夫,主要是在WM系统下TreeView的功能太有限了,不行添加背景,也不能实现行选择,这样效果就很差,单击事件也没有,后来通过查看Msdn资料和网上的一些资料,终于通过自绘实现了这些功能,这里将部分代码贴出来,希望对有这方面需求的朋友有所帮助,有时间我会做一个Demo便于大家下载.

     

    标题中说是实现透明树,实际只是在TreeView组件中实现了背景,行选择,图标功能,全是自绘的,运行起来效果还勉强,效果如下.

     

    部分核心代码:

    int WM_Paint_Handler( IntPtr hwnd, uint msg, uint wParam, int lParam, ref bool handled) { Win32.RECT updateRect = new Win32.RECT(); if (Win32.GetUpdateRect(hwnd, ref updateRect, false) == 0) { handled = true; return 0; } Win32.PAINTSTRUCT ps = new Win32.PAINTSTRUCT(); Win32.BeginPaint(hwnd, ref ps); IntPtr screenHdc = Win32.GetDC(hwnd); Graphics gs = Graphics.FromHdc(screenHdc); //双缓冲还是慢 Bitmap memBmp = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height); Graphics screenGraphics = Graphics.FromImage(memBmp); { //得到第一行 // check to see if the click was on an item int itemHeight = this.ImageList.ImageSize.Height;//获取到TreeNode的RECT高度有问题,这里通过固定值进行设置 Rectangle ClientRect = new Rectangle(0, 0, _bkBitmap.Width, _bkBitmap.Height); //_BkImage.Draw(screenGraphics, this.ClientRectangle, true); //AlphaImage对象使用的是AlphaBlend绘制,AlphaBlend对大图片有效率问题 screenGraphics.DrawImage(_bkBitmap, this.ClientRectangle, ClientRect, GraphicsUnit.Pixel); for (int Row = 1; Row < this.Height; Row++) { Win32.TVHITTESTINFO hti = new Win32.TVHITTESTINFO(); hti.pt.X = 0;// msgPos.X; //在Mobil系统中Win32.TVS_FULLROWSELECT样式无法使用,只有使用这种方式. hti.pt.Y = Row; int hitem = Win32.SendMessage(this.Handle, Win32.TVM_HITTEST, 0, ref hti); uint htMask = ( Win32.TVHT_ONITEMICON | Win32.TVHT_ONITEMLABEL | Win32.TVHT_ONITEMINDENT | Win32.TVHT_ONITEMBUTTON | Win32.TVHT_ONITEMRIGHT | Win32.TVHT_ONITEMSTATEICON); if ((hti.flags & htMask) != 0) { Win32.RECT rc = new Win32.RECT(); rc.left = (int)hti.hItem; Win32.SendMessage(this.Handle, Win32.TVM_GETITEMRECT, 0, ref rc); TreeNode tn = FindTreeNodeFromHandle(this.Nodes, hti.hItem); if (tn != null) { Rectangle rect = new Rectangle(rc.left, rc.top, rc.right, itemHeight); if (tn.Equals(this.SelectedNode) && this.SelectedNode != null) this.OnDrawItem(screenGraphics, 1, tn, rect); else this.OnDrawItem(screenGraphics, 0, tn, rect); } Row += (rc.bottom - rc.top); } else { break; } } } gs.DrawImage(memBmp, 0, 0); memBmp.Dispose(); screenGraphics.Dispose(); gs.Dispose(); //Tear down Win32.EndPaint(hwnd, ref ps); handled = true; return 0; }


    最新回复(0)