| 智能ABC窗口的实现 下载源代码 高级顶层窗口是一种无标题栏、菜单、工具条的一种常居顶层的窗口,最常见的例子就是输入法窗口,比如智能ABC窗口。这类窗口的特点除了上边所说的,最重要的就是窗口移动。普通窗口移动是通过标题栏由系统自动实现的,对于这类窗口就无法依靠系统了,需要手工实现。实现的方法有两种:
显然,后者较前者简单。本文采用后者。 void Draw3dRect( LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight) 实现了3D边框的绘制。
1、创建窗口: bool CMainWnd::CreateMainWnd(void) { if(!CreateEx(0, ::AfxRegisterWndClass(0, ::LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW)), GetSysColorBrush(COLOR_ACTIVEBORDER) ), NULL, WS_POPUP, 0,0,300,50, NULL, NULL)) return false; return true; }2、窗口绘制:根据四个位图“按钮”标志变量绘制相应的位图。 void CMainWnd::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CWnd::OnPaint() CBitmap* pOldBmp; CDC CompatibleDC; CompatibleDC.CreateCompatibleDC(&dc); //绘制第一个按钮 if(m_bBTState[0]) pOldBmp=CompatibleDC.SelectObject(&m_BT1_1); else pOldBmp=CompatibleDC.SelectObject(&m_BT1_2); dc.BitBlt(m_rcBT1.left,m_rcBT1.top,m_rcBT1.Width(),m_rcBT1.Height(),&CompatibleDC,0,0,SRCCOPY); //绘制第二个按钮 if(m_bBTState[1]) CompatibleDC.SelectObject(&m_BT2_1); else CompatibleDC.SelectObject(&m_BT2_2); dc.BitBlt(m_rcBT2.left,m_rcBT2.top,m_rcBT2.Width(),m_rcBT2.Height(),&CompatibleDC,0,0,SRCCOPY); //绘制第三个按钮 if(m_bBTState[2]) CompatibleDC.SelectObject(&m_BT3_1); else CompatibleDC.SelectObject(&m_BT3_2); dc.BitBlt(m_rcBT3.left,m_rcBT3.top,m_rcBT3.Width(),m_rcBT3.Height(),&CompatibleDC,0,0,SRCCOPY); //绘制第四个按钮 if(m_bBTState[3]) CompatibleDC.SelectObject(&m_BT4_1); else CompatibleDC.SelectObject(&m_BT4_2); dc.BitBlt(m_rcBT4.left,m_rcBT4.top,m_rcBT4.Width(),m_rcBT4.Height(),&CompatibleDC,0,0,SRCCOPY); //绘制第五个按钮 if(m_bBTState[4]) CompatibleDC.SelectObject(&m_BT5_1); else CompatibleDC.SelectObject(&m_BT5_2); dc.BitBlt(m_rcBT5.left,m_rcBT5.top,m_rcBT5.Width(),m_rcBT5.Height(),&CompatibleDC,0,0,SRCCOPY); //绘制边框 CRect rcClient; GetClientRect(&rcClient); dc.Draw3dRect(&rcClient,RGB(192,192,192),RGB(0,0,0)); rcClient.DeflateRect(1,1,1,1); dc.Draw3dRect(&rcClient,RGB(255,255,255),RGB(144,144,144)); CompatibleDC.SelectObject(pOldBmp); }3、WM_MOUSEMOVE 消息处理函数 void CMainWnd::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 bool bInRegionNow=IsInRegion(point); TRACE("Mouse move:(%d,%d) InRegion=%d\n",point.x,point.y,bInRegionNow); if(bInRegionNow) { SetCursor(m_hCrossCursor);//设置十字形光标 if(nFlags&MK_LBUTTON) { POINT pt; pt.x=point.x;pt.y=point.y; ClientToScreen(&pt); //发送移动消息 SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,(LPARAM)(pt.x|(pt.y>>16))); } } CWnd::OnMouseMove(nFlags, point); } 程序运行效果 效果如下: |