分类: C/C++
2008-08-07 17:42:27
//得到位图 CBitmap m_Bitmap; HBITMAP hBitmap = m_Logo.GetBitmap(); ASSERT(hBitmap); //得到位图的信息 m_Bitmap.Attach(hBitmap); BITMAP bmp; m_Bitmap.GetBitmap(&bmp); //得到位图的大小 int nX = bmp.bmWidth; int nY = bmp.bmHeight; //根据位图的大小移动窗口 MoveWindow(0,0,nX,nY); m_Logo.MoveWindow(0,0,nX,nY); CenterWindow();2、前端显示。
//通过SetWindowsPos函数将窗口前端显示。 ::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);3、在客户区内按下鼠标左键可以随意拖动窗口的位置。响应WM_HITTEST函数,当鼠标左键按下并在客户区内,返回HTCAPTION,欺骗Windows,达到跟在标题栏拖动窗口一样的效果。
UINT CFloatWnd::OnNcHitTest(CPoint pt) { UINT nHitTest = CDialog::OnNcHitTest(pt); if (nHitTest == HTCLIENT && ::GetAsyncKeyState(MK_LBUTTON) < 0) // 如果鼠标左键按下,GetAsyncKeyState函数的返回值小于0 nHitTest = HTCAPTION; return nHitTest; }4、改变窗口的透明度。将窗口样式设置为WS_EX_LAYERED,并调用SetLayeredWindowAttributes函数来改变窗口的透明度。WS_EX_LAYERED可能没定义,我们可以直接取值0x80000。
//加入WS_EX_LAYERED扩展属性 SetWindowLong(m_hWnd,GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);BOOL SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);
//更新窗口透明度的代码,其中iTransparent为透明度。 void CFloatWnd::OnUpdateTransparent(int iTransparent) { HINSTANCE hInst = LoadLibrary("User32.DLL"); if(hInst) { typedef BOOL (WINAPI *SLWA)(HWND,COLORREF,BYTE,DWORD); SLWA pFun = NULL; //取得SetLayeredWindowAttributes函数指针 pFun = (SLWA)GetProcAddress(hInst,"SetLayeredWindowAttributes"); if(pFun) { pFun(m_hWnd,0,iTransparent,2); } FreeLibrary(hInst); } }5、双击可以将主窗口激活并显示。由于WM_HITTEST消息的影响,我们双击鼠标的时候产生的是WM_NCLBUTTONDBLCLK消息,而不是WM_LBUTTONDBLCLK消息。
void CFloatWnd::OnNcLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CWnd *pParent = GetParent(); ASSERT(pParent); //显示窗口 if(!pParent->IsWindowVisible()) pParent->ShowWindow(SW_SHOW); //置窗口到最前面 pParent->SetForegroundWindow(); CDialog::OnNcLButtonDblClk(nFlags, point); }关于调节透明度的Slider使用,也写了一些代码,一并贴出来,供大家参考。
void CMainDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default //得到Slider的位置 int iCurPos = m_Slider.GetPos(); //得到最大值、最小值,及页大小 int nMax = m_Slider.GetRangeMax(); int nMin = m_Slider.GetRangeMin(); int nPageSize = m_Slider.GetPageSize(); switch(nSBCode) { case SB_LINELEFT: if(iCurPos > nMin) iCurPos --; break; case SB_LINERIGHT: if(iCurPos < nMax) iCurPos ; break; case SB_PAGELEFT: if(iCurPos > nMin) iCurPos = max(nMin,iCurPos - nPageSize); break; case SB_PAGERIGHT: if(iCurPos < nMax) iCurPos = min(nMax,iCurPos nPageSize); break; case SB_THUMBTRACK: iCurPos = nPos; break; case SB_THUMBPOSITION: iCurPos = nPos; break; } //设置Slider位置 m_Slider.SetPos(iCurPos); //更新透明度 pFloatWnd->OnUpdateTransparent(iCurPos); CDialog::OnHScroll(nSBCode, nPos, pScrollBar); }至于该窗口的右键菜单,窗口的显示与隐藏,程序的退出等简单代码我就不多介绍了。