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
计算窗口应该具有的区域。
在myDrawItem
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);
}