0

から継承するクラスがありますCStatic。これは所有者が描画し、を使用してウィンドウに必要な領域を計算しますSetWindowRgn。私のDrawItemオーバーライドFillRgnでは、計算されたのと同じ領域での受け渡しを使用しようとしましたが、メソッドは FALSE を返します。ドキュメンテーションによると

戻り値: 関数が成功した場合はゼロ以外。それ以外の場合は 0。

しかし、GetLastError「操作は正常に完了しました」というメッセージが表示されます。

メッセージを受信できたので、ウィンドウの領域は間違いなくうまく設定されていWM_LBUTTONUPます。

これが私のクラスです:

.h ファイル

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);
};

.cpp

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);
}
4

1 に答える 1

0

ほとんどの MFC の問題と同様に、答えはドキュメントにあります。

システムはリージョンのコピーを作成しません。したがって、このリージョン ハンドルを使用してさらに関数を呼び出さないでください。

ドキュメンテーション

于 2013-09-17T13:38:02.787 に答える