MFC大杂烩

判断窗口是否已最小化
    BOOL IsIconic(hWnd: HWND );
判断窗口是否已最大化
    BOOL IsZoomed(hWnd: HWND );
   
在自绘窗口中运动窗口(重载鼠标单击的消息)
    SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
   
CPaintDC
    CPaintDC对象只在响应一个WM_PAINT消息的时候被使用,也就是说它只用在OnPaint函数中。
    声明一个CPaintDC对象
    CPaintDC dc(this);
    将会把WM_PAINT消息从消息队列中取出
   
   
异形窗口 参考文章 http://www.vckbase.com/document/viewdoc/?id=1345
    1) 简单“region”的创建
    在OnInitDialog()函数中添加
    {
        ...
        CRgn m_rgn;
        CRect rcDialog;
        GetClientRect (rcDialog);
        m_rgn.CreateEllipticRgn (0, 0, rcDialog.Width(), rcDialog.Height());
        ::SetWindowRgn (GetSafeHwnd(), (HRGN)m_rgn, TRUE);
        ...
    }
   
    2) 作图路径法创建”region”
    void OnTest()
    {
        HRGN wndRgn;
        CClientDC dc(this);
        CFont mFont;
       
        if (dc.m_hDC!=NULL)
        {
            VERIFY(mFont.CreateFont(
                200, 50, 0, 0, FW_HEAVY, TRUE, FALSE,
                0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,       
                CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,            
                DEFAULT_PITCH | FF_SWISS, "宋体"));                 
       
            //开始记录窗体轮廓路径
            dc.BeginPath();       

            //设置背景为透明模式,这句话是必须有的。
            dc.SetBkMode(TRANSPARENT);   
           
            CFont * pOldFont;
            pOldFont = dc.SelectObject( &mFont );
            dc.TextOut(0, 0, "Hello");
       
            //结束记录窗体轮廓路径
            dc.SelectObject( pOldFont );
            dc.EndPath();
           
            //把所记录的路径转化为窗体轮廓句柄
            wndRgn = ::PathToRegion(dc.m_hDC);

            //赋予窗体指定的轮廓形状
            this->SetWindowRgn(wndRgn, TRUE);       
        }
    }

    3) 根据图像创建”regin”
    int CRgn::CombineRgn( CRgn* pRgn1, CRgn* pRgn2, int nCombineMode );
  其中pRgn1,pRgn2为要合并的两个“region”,nCombineMode为合并的方式,此应用中取RGN_OR,即两”region”全部合并去处重复部分。代码实现如下:
    void SetupRegion(CDC *pDC, //窗体的DC指针
        CBitmap &cBitmap, //含有窗体形状的位图对象
        COLORREF TransColor //透明色
        )
    {    CDC memDC;
        //创建与传入DC兼容的临时DC
        memDC.CreateCompatibleDC(pDC);

        CBitmap *pOldMemBmp=NULL;
        //将位图选入临时DC
        pOldMemBmp=memDC.SelectObject(&cBitmap);
      
        CRgn wndRgn;
        //创建总的窗体区域,初始region为0
        wndRgn.CreateRectRgn(0,0,0,0);
     
        BITMAP bit;  
        cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽    
      
        int y;
            for(y=0;y<=bit.bmHeight  ;y++)
            {
            CRgn rgnTemp; //保存临时region
               
                int iX = 0;
                do
                {
                    //跳过透明色找到下一个非透明色的点.
                    while (iX <= bit.bmWidth  && memDC.GetPixel(iX, y) == TransColor)
                        iX++;

                    //记住这个起始点
                    int iLeftX = iX;

                    //寻找下个透明色的点
                    while (iX <= bit.bmWidth  && memDC.GetPixel(iX, y) != TransColor)
                        ++iX;

                    //创建一个包含起点与重点间高为1像素的临时“region”
                    rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);

                    //合并到主"region".
                    wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);
                   
            //删除临时"region",否则下次创建时和出错
                    rgnTemp.DeleteObject();
                }while(iX GetWindow();
        pWnd->SetWindowRgn(wndRgn,TRUE);   
        pWnd->SetForegroundWindow();   
    }

你可能感兴趣的:(null,mfc)