我要在对话框里画一些位图,需要透明的,我需要知道对话框的颜色吗??
或者有其他的方法。

解决方案 »

  1.   

    调用CWinApp : : SetDialogBkColor可以改变所有应用程序的背景颜色。第一个参数指定了背景颜色,第二个参数指定了文本颜色。下例将应用程序对话设置为蓝色背景和黄色文本。
    BOOL CSampleApp : : InitInstance ( )
    {
     …
     //use blue dialog with yellow text .
     SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 ,255 , 0 ) )
     …
    }
    需要重画对话(或对话的子控件)时,Windows向对话发送消息WM_CTLCOLOR,通常用户可以让Windows选择绘画背景的刷子,也可重置该消息指定刷子。下例说明了创建一个红色背景对话的步骤。
    首先,给对话基类增加一人成员变量
    CBursh :class CMyFormView : public CFormView
    {
     …
     private :
     CBrush m_ brush // background brush
     …
    }
    其次, 在类的构造函数中将刷子初始化为所需要的背景颜色。
    CMyFormView : : CMyFormView ( )
    {
     // Initialize background brush .
     m_brush .CreateSolidBrush (RGB ( 0, 0, 255) )
    }
    最后,使用ClassWizard处理WM_CTLCOLOR消息并返回一个用来绘画对话背景的刷子句柄。注意:由于当重画对话控件时也要调用该函数,所以要检测nCtlColor参量。
    HBRUSH CMyFormView : : OnCtlColor (CDC* pDC , CWnd*pWnd , UINT nCtlColor
    )
    {
     // Determine if drawing a dialog box . If we are, return +handle to
     //our own background brush . Otherwise let windows handle it .
     if (nCtlColor = = CTLCOLOR _ DLG )
     return (HBRUSH) m_brush.GetSafeHandle ( )
     return CFormView : : OnCtlColor (pDC, pWnd , nCtlColor
    )
    }
      

  2.   

    CWnd *pwnd;
    pwnd=AfxGetMainWnd(); CDC *pDc=(CDC*)pwnd->GetDC();
    COLORREF cl;
    cl=pDc1->GetBkColor();
    COLORREF 是一个结构,含有RGB信息,返回值CL,就是所得的颜色信息
      

  3.   

    我是使用Borland C++ Builder的,BCB提供了透明位图(就是需要指定Bitmap为透明以及
    透明的颜色)。在BCB里只要指明Bitmap为透明的,以及透明颜色为白色,那么在DC上画
    Bitmap时,画出来的Bitmap中,原来的白色就变成原来画布的内容了。就好像Icon一样,
    Icon中如果有部分颜色为透明色,那么透明色这部分就是DC上原来的东西。Icon其实就是
    由2个Bitmap组成的,其中一个是MaskBitmap。BCB中的透明位图的原理也是一样,当你指
    定Bitmap为透明时,BCB会自动根据透明颜色创建一个MaskBitmap。有了MaskBitmap,如果
    位图是1:1显示的,使用API函数MaskBlt就可以了,否则还需要做一些其它处理(BCB自动
    完成)。所以在BCB中使用透明Bitmap是非常简单的。但是BCB源程序,却是花了好多代码
    才实现这个功能的。如果是1:1画透明的Bitmap,还有另外一个方法,就是使用类似不规则窗体的办法,设定画
    图区域。查找Bitmap中的白色点,组成一个区域,然后使用SelectObject(hDC,gRegion)选
    择区域,这样画出来的Bitmap,原来白色的部分就是DC原本的颜色了。
      

  4.   

    同意 jishiping(JSP 季世平)
      

  5.   

    1.用传说中的最简易方法来达到透明:GetDC()->SetBkMode(TRANSPARENT),透明可能拼错哦,查查MSDN。
    2.如果想要真正的噩梦透明法,自己创建一个透明函数比较好,建立几个中间位图,用
    XOR,AND,OR等模式绘图组合一下(六个中间位图比较好,全黑和全白得必须有),也比较简单,试一下就可以了,最后的输出用SRCCOPY。
    3.利用人类视觉弱点采用伪透明技术,这个略显专业,你可能现在一时掌握不了(学了空间物理建模后再说吧)。
      

  6.   

    mfc168我想好像有问题,afxgetmailwnd()得到得是主框架窗口,不是对话框的,再调用getdc()得到得设备上下文我想也有问题,对于对话框来说,用setdialogbkcolor(),再用brush好像是通用的思路,
      

  7.   

    void CMyBitMap::SetDefaultActiveFgColor(BOOL bRepaint)
    {
    m_crActiveFg=::GetSysColor(COLOR_BTNTEXT);

    if(bRepaint==TRUE)Invalidate();
    }