解决方案 »

  1.   

    http://tech.sina.com.cn/c/1162.html
      

  2.   

    保留       CPaintDC dc(this); // 用于绘制的设备上下文
      

  3.   

            dc.TextOut(0,0,_T("德玛西亚"));  
      

  4.   

    这个我不是太明白“CWindowDC dc(NULL);”我需要这一句来获取屏幕的dc啊,如果保留的话这个dc就只是窗口的了啊
      

  5.   

    你在
    void CDMtestDlg::OnPaint()
    没有  CPaintDC dc(this); // 刷新窗口, 使窗口有效.
    可能 因为 对话框窗口 总是无效, 而 Onpaint 不止. dc.TextOut(0,0,_T("德玛西亚")); 
    是让你 把字画到 对话框外.
      

  6.   

    “CWindowDC dc(NULL);”我需要这一句来获取屏幕的dc啊,
    这句还是要的!
      

  7.   

    或者:
    // CPaintDC dc1(this); // device context for painting
    CDialog::OnPaint();
    CWindowDC dc(NULL);  
      

  8.   

      我还是没搞好void CDMtestDlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CPaintDC dc1(this);//刷新窗口, 使窗口有效.
    CWindowDC dc(NULL);  
    //  CRect rect;
    //  GetClientRect(&rect);
    CFont myFont;  
    myFont.CreateFont (   
    120, // nHeight 字体高度  
    40, // nWidth 字体宽度  
    0, // nEscapement 显示角度  
    0, // nOrientation 字体角度  
    FW_NORMAL, // nWeight 字体磅值  
    FALSE, // bItalic 是否倾斜  
    FALSE, // bUnderline 是否斜体  
    0, // cStrikeOut 是否加删除线  
    ANSI_CHARSET, // nCharSet 指定字符集  
    OUT_DEFAULT_PRECIS, // nOutPrecision 指定输出精度  
    CLIP_DEFAULT_PRECIS, // nClipPrecision 指定剪切精度  
    DEFAULT_QUALITY, // nQuality 指定输出质量  
    DEFAULT_PITCH | FF_SWISS, /*nPitchAndFamily 字符族*/_T("Arial")); // 指定字体的字样名  
    CFont* oldFont = dc.SelectObject ( &myFont);  
    dc.SetTextColor (RGB (0,155,255));  
    /* hbr = */
    //HBRUSH hbr =  (HBRUSH)GetStockObject(NULL_BRUSH);
    //dc.SelectObject (hbr);  
    //(HBRUSH)GetStockObject(NULL_BRUSH);
    dc.SetBkMode (TRANSPARENT); //背景模式为透明  
    //InvalidateRect(NULL,true);
    //UpdateWindow();
    //HWND hWnd = ::GetDesktopWindow();//获得屏幕的HWND.
    //InvalidateRect(NULL,FALSE);
    dc.TextOut(200,0,_T("德玛西亚"));  
    dc.SelectObject ( oldFont);  
    }
    }onpaint函数里面的else加上了“ CPaintDC dc1(this);//刷新窗口, 使窗口有效.”这行,可是效果还是没变
       可能是我太笨了 
      

  9.   

    dc.TextOut(500,500,_T("德玛西亚")); 
    是透明的.
    "hechao" 哪里来的?
    现在的图是
    "hechao" 在下面. "德玛西亚" 在它上面 (也是透明的)
      

  10.   

    很明显那个白框就是你的dialog, 因为你没有在dialog中画任何东西,所以显示的是背景(也就是用WindowClass中那个brush充填的内容--默认的WM_ERASEBKGND干的事)。至于那个 "德玛西亚" 则很明显是透明画到desktop上的内容
      

  11.   

    所以叫他画到对话框外看看:
    dc.TextOut(0,0,_T("德玛西亚")); 
      

  12.   

    "hechao" 哪里来的?dc.TextOut(0,0,_T("德玛西亚"));  已经是第二次
      

  13.   

    参考
    “桌面小球.zip”
    “http://download.csdn.net/detail/schlafenhamster/4362660”“包含3个工程。 1。DeskBallBmp 一个圆位图在桌面上移动,但圆内有闪烁。 2。DeskBallCli 一个圆位图在带背景的客户区内移动,圆内无闪烁。 3。DeskBallWin 一个圆型窗口在桌面上移动,圆内无闪烁。”
      

  14.   

    桌面输出文字的实现方法,其实就是创建个透明窗口,把文字显示在窗口上,跟酷狗歌词那个一样.
    所以首先要创建透明窗口.
    BOOL CTextOutDlg::OnInitDialog()
    {
    CDialog::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE); // 设置大图标
    SetIcon(m_hIcon, FALSE); // 设置小图标

    //窗口透明化
    ModifyStyleEx(NULL, WS_EX_LAYERED);
    SetLayeredWindowAttributes(0, 50/*值1-255,越小越透明*/, LWA_ALPHA);
    //去掉标题栏
    ModifyStyle(WS_CAPTION, 0);  return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }void CTextOutDlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CPaintDC dc(this);
    CFont myFont;  
    myFont.CreateFont (   
    120, // nHeight 字体高度  
    40, // nWidth 字体宽度  
    0, // nEscapement 显示角度  
    0, // nOrientation 字体角度  
    FW_NORMAL, // nWeight 字体磅值  
    FALSE, // bItalic 是否倾斜  
    FALSE, // bUnderline 是否斜体  
    0, // cStrikeOut 是否加删除线  
    ANSI_CHARSET, // nCharSet 指定字符集  
    OUT_DEFAULT_PRECIS, // nOutPrecision 指定输出精度  
    CLIP_DEFAULT_PRECIS, // nClipPrecision 指定剪切精度  
    DEFAULT_QUALITY, // nQuality 指定输出质量  
    DEFAULT_PITCH | FF_SWISS, /*nPitchAndFamily 字符族*/_T("宋体")); // 指定字体的字样名  
    CFont* oldFont = dc.SelectObject ( &myFont);  
    dc.SetTextColor (RGB (0,155,255));  
    /*    hbr = */
    //HBRUSH hbr =  (HBRUSH)GetStockObject(NULL_BRUSH);
    //dc.SelectObject (hbr);  
    //(HBRUSH)GetStockObject(NULL_BRUSH);
    dc.SetBkMode (TRANSPARENT); //背景模式为透明  
    //InvalidateRect(NULL,true);
    //UpdateWindow();
    dc.TextOut(100,100,_T("德玛西亚"));  
    dc.SelectObject ( oldFont);  
    CDialog::OnPaint();
    }
    }
      

  15.   

    照这样做之后,窗口虽然透明了,但是输出的字也透明了 
    http://bbs.csdn.net/topics/330203668  这个哥们好像实现了  但是看不太懂
      

  16.   

    其实 就是 做个 “异型” 窗口。使用 SetWindowRgn 函数。1. 创建 内存 DC
    2. memDC 背景 填白
    3. 把 字符 画到  memDC
    4. 遍历 每个 点, 把 白的点 去除, 留下 字符点 成为 一个点 的 rgn, 把 所有点 (rgn) combine 起来 , 成 一个 字符串 rgn
    5. SetWindowRgn
      

  17.   

    void CxxxDlg::StrRgn(CString &str)
    {
    CRect rc;
    GetWindowRect(rc);CWindowDC dc(this);
    CDC memDC;
    memDC.CreateComPatibleDC(&dc);CBitmap bmp;
    bmp.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height());
    HBITMAP old=(BITMAP)memDC.SelectObject(bmp);
    // fill background
    memDC.FillSolidRect(&rc,RGB(255,255,255));
    // text
    HFONT oldFont=(HFONT)memDC.SelectObject(m_Font);// 在初始化时创建
    memDC.SetBkMode(TRANSPARENT);
    memDC.TextOut(2,2,str);
    // creat window rgn
    int x,y;
    CRgn wndRgn,tmpRgn;
    wndRgn.CreateRectRgn(0,0,0,0);
    // 
    for(x=0;x<=rc.Width();x++)
    {
        for(y=0;y<rc.Height();y++)
        {
             if(memDC.GetPixel(x,y) < RGB(250,250,250))
             {// add one point
                 tmpRgn.CreateRectRgn(x,y,x+1,y+1);// one point rgn
                 wndRgn.CombineRgn(&wndRgn,&tmpRgn,RGN_OR);// sum of all points
                 tmpRgn.DeleteObject();
             }
        }
    }
    //
    SetWindowRgn((HRGN)wndRgn,TRUE);
    // free
    memDC.SelectObject(old);
    memDC.SelectObject(oldFont);
    wndRgn.DeleteObject();
    }// move Window 在字符串里 移动窗口!
    UINT CxxxDlg::OnNcHitTest()
    {
    UINT nHitTest=CDialog::OnNcHitTest();
    return(nHitTest==HTCLIENT) ? HTCAPTION : nHitTest);
    }在对话框 初始化中:StrRgn(CString("哈哈"));对话框属性 无标题
      

  18.   

    改进:
    CRect rc;
    GetWindowRect(rc);
    rc.OffsetRect(-rc.left,-rc.top);
    否则第二次 调用这个函数时 , 坐标会错误。