【解決方法】MFC cstatic で描画する方法


こんにちは、みんな。 MFC CStatic要素に2本の線を描画しようとしています。

アドバイスや助けをいただければ幸いです

私が試したこと:

このコードはプロジェクトに存在します。
そして、どこに問題があるのか​​理解できません

class CtestdrawinstaticDlg : public CDialogEx
{
// Construction
public:
	CtestdrawinstaticDlg(CWnd* pParent = nullptr);	// standard constructor

// Dialog Data
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_TEST_DRAW_IN_STATIC_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support


// Implementation
protected:
	HICON m_hIcon;

	// Generated message map functions
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CStatic m_StaticDraw;
};

BEGIN_MESSAGE_MAP(CtestdrawinstaticDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()


void CtestdrawinstaticDlg::OnPaint()
{
	CPaintDC dc(this);

	CRect rect;
	m_StaticDraw.GetClientRect(&rect);

	CDC memDC;
	memDC.CreateCompatibleDC(&dc);

	CBitmap bitmap;
	bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());

	CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);

	memDC.FillSolidRect(rect, RGB(255, 255, 255));

	CPen pen(PS_SOLID, 1, RGB(0, 0, 0));
	CPen* pOldPen = memDC.SelectObject(&pen);

	memDC.MoveTo(0, 0);
	memDC.LineTo(rect.right, rect.bottom);

	memDC.MoveTo(rect.right, 0);
	memDC.LineTo(0, rect.bottom);

	memDC.SelectObject(pOldPen);
	memDC.SelectObject(pOldBitmap);
	memDC.DeleteDC();

	dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
}

解決策 1

解決策 2

のドキュメントによると、 C静的クラス | Microsoft Learn[^]をオーバーライドする必要があります。 DrawItem 方法。

コメント

タイトルとURLをコピーしました