做项目过程中,需要将字符串显示在屏幕的任意位置,并可用鼠标拖动以改变位置,研究了下,实现如下:
//创建字体 CFont font; HRGN wndRgn; CDC dc, *pDC = GetDC(); font.CreateFont( 90, // nHeight 45, // nWidth 0, // nEscapement 0, // nOrientation FW_BOLD , // nWeight /*FW_BOLD*/FW_NORMAL FALSE, // bItalic FALSE, // bUnderline 0, // cStrikeOut GB2312_CHARSET, // nCharSet OUT_DEFAULT_PRECIS, // nOutPrecision CLIP_DEFAULT_PRECIS, // nClipPrecision DEFAULT_QUALITY, // nQuality DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily "楷体"); // lpszFacename黑体 if (pDC && dc.CreateCompatibleDC(pDC)) { CRect rect; ::GetClientRect(GetSafeHwnd(), &rect); dc.SelectObject(&font); CSize size; CString strText = "文字对话框"; //计算要输出的字符串的高度和宽度 ::GetTextExtentPoint32(dc.GetSafeHdc(), strText, strText.GetLength(), &size); //居中输出,计算文字要输出的位置 int x = (rect.Width()-size.cx)/2; int y = (rect.Height()-size.cy)/2; dc.SetBkMode(TRANSPARENT); //开始记录窗体轮廓路径 dc.BeginPath(); dc.TextOut(x, y, strText, strText.GetLength()); dc.EndPath(); //把所记录的路径转化为窗体轮廓句柄 wndRgn = PathToRegion(dc.GetSafeHdc()); //赋予窗体指定的轮廓形状 SetWindowRgn(wndRgn, TRUE); DeleteObject(wndRgn); dc.DeleteDC(); ReleaseDC(pDC); }
这段代码可放在OnInitDialog()函数或者按钮菜单等的响应函数中。这样,显示对话框时就只能看到镂空的字符串,对话框的其它部分都看不到了。显示的字符串颜色为对话框的颜色,如果要改变颜色,可将对话框加背景色:
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default CRect rc; GetClientRect(&rc); pDC->FillSolidRect(&rc,RGB(0,255,0)); return TRUE; }
若要想该显示的字符串可用鼠标拖动改变位置,那就更简单了,实现原理就是无标题对话框的拖动:
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y)); CDialog::OnLButtonDown(nFlags, point); }