Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 使用计算的HRGN绘制业主图纸CStatic_Visual C++_Mfc_Paint - Fatal编程技术网

Visual c++ 使用计算的HRGN绘制业主图纸CStatic

Visual c++ 使用计算的HRGN绘制业主图纸CStatic,visual-c++,mfc,paint,Visual C++,Mfc,Paint,我有一个从CStatic继承的类,它是所有者绘制的,并使用SetWindowRgn计算窗口应该具有的区域。 在myDrawItemoverride中,我尝试使用FillRgn传递与计算相同的区域,但该方法返回FALSE。警察说 返回值:函数成功时非零;否则为0 但是当我GetLastError时,消息是“操作成功完成” 窗口区域的设置肯定很好,因为我已经成功地接收到WM_LBUTTONUP消息 这是我的班级: .h文件 .cpp void Country::DrawItem(LPDRAWITEM

我有一个从
CStatic
继承的类,它是所有者绘制的,并使用
SetWindowRgn
计算窗口应该具有的区域。 在my
DrawItem
override中,我尝试使用
FillRgn
传递与计算相同的区域,但该方法返回FALSE。警察说

返回值:函数成功时非零;否则为0

但是当我
GetLastError
时,消息是“操作成功完成”

窗口区域的设置肯定很好,因为我已经成功地接收到
WM_LBUTTONUP
消息

这是我的班级:

.h文件 .cpp
void Country::DrawItem(LPDRAWITEMSTRUCT LPDRAWITEMSTRUCT)
{
CDC*pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
CRgn*clientRgn=CRgn::FromHandle(m_hRgn);
CBrush黑刺(RGB(0,0,0));
如果(!(pDC->FillRgn(客户端RGN和blackBrush)))
{
AfxMessageBox(GetLastErrorMessage());
}
}
无效国家::CreateCountryWindow(CWnd*pParent)
{
如果(创建)(
_T(“”),
WS|u CHILD | WS|u VISIBLE | SS|u NOTIFY | SS|u OWNERDRAW,
正确(m_point.x,问题面板_HEIGHT+m_point.y,m_bm.bmWidth,m_bm.bmHeight),
(租金)
{
ShowWindow(SW_SHOW);
CreateWindowRgn();
}
}
无效国家::CreateWindowRgn()
{
HRGN-hTmpRgn;
m_hRgn=CreateRectRgn(0,0,m_bm.bmWidth,m_bm.bmHeight);
对于(int i=0;i
与大多数MFC问题一样,答案在文档中:

系统不会复制该区域。因此,不要做出错误的决定 使用此区域句柄的其他函数调用

class Country : public CStatic
{
    DECLARE_DYNAMIC(Country)

public:
    Country(HBITMAP hBm, CPoint point);
    virtual ~Country(); 

protected:
    DECLARE_MESSAGE_MAP()
    CPoint m_point;
    HBITMAP m_hBm;
    BITMAP m_bm;
    HDC m_dcBm;
    HRGN m_hRgn;

    void CreateWindowRgn();

public: 
    void CreateCountryWindow(CWnd * pParent);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
};
void Country::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);  
    CRgn * clientRgn = CRgn::FromHandle(m_hRgn);        
    CBrush blackBrush(RGB(0,0,0));
    if(!(pDC->FillRgn(clientRgn, &blackBrush)))
    {
        AfxMessageBox(GetLastErrorMessage());
    }
}

void Country::CreateCountryWindow(CWnd * pParent)
{
    if(Create(
        _T(""), 
        WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_OWNERDRAW, 
        CRect(m_point.x, QUESTION_PANEL_HEIGHT + m_point.y, m_bm.bmWidth, m_bm.bmHeight),  
        pParent))   
    {
        ShowWindow(SW_SHOW);
        CreateWindowRgn();
    }
}

void Country::CreateWindowRgn()
{
    HRGN hTmpRgn;   
    m_hRgn = CreateRectRgn(0,0,m_bm.bmWidth, m_bm.bmHeight);
    for(int i = 0; i < m_bm.bmWidth; i++)
    {
        for(int j = 0; j < m_bm.bmHeight; j++)
        {
            COLORREF c = GetPixel(m_dcBm,i,j);
            if(GetRValue(c) < 10 && GetGValue(c) < 10 && GetBValue(c) < 10)                     
            {
                hTmpRgn = CreateRectRgn(i, j, i+1, j+1);                
                CombineRgn(m_hRgn, m_hRgn, hTmpRgn, RGN_XOR);
                DeleteObject(hTmpRgn);
            }           
        }
    }
    SetWindowRgn(m_hRgn, TRUE);     
}

void Country::OnLButtonUp(UINT nFlags, CPoint point)
{
    AfxMessageBox(_T("Hello World"));
    CStatic::OnLButtonUp(nFlags, point);
}