使用 C++/MFC 和 GDI(不是 GDI+),总体目标是创建一个有图案HBRUSH
的 ,它将用于OnCtlColor
以红色勾勒一个编辑控件,并能够打开和关闭轮廓。为此,您将位图附加到HBRUSH
using CreatePatternBrush
。这是使用存储的位图资源执行此操作的代码:
CDialog::OnInitDialog();
BOOL ok = redBoxBitmap.LoadBitmap(MAKEINTRESOURCE(IDB_mespe_EditBox_Red));
ok = redBoxBrush.CreatePatternBrush(&redBoxBitmap);
并且在OnCtlColor
HBRUSH CModelEditorSpecies::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr;
int ctrlID=pWnd->GetDlgCtrlID();
if(ctrlID==IDC_MyEditControl)
hbr=(HBRUSH) redBoxBrush;
else
hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
上面的代码都可以按需要工作。但是,这取决于位图的大小调整到编辑控件。我现在需要的是能够在 C++ 程序中创建位图,其大小为控件的客户区,这取决于控件的设计大小(在对话框编辑器中)和用户在Windows 10 设置。
我找不到一种直接的方法来构建位图,或者更好的是,创建一个适当大小的空位图(可以做),将其选择为CDC
(可以做),将红色框绘制到其中(可以做),然后从CDC
(怎么办?)中提取更新位图。
任何人都可以建议如何以编程方式创建位图,或者建议一种更好的方法,在程序需要时将编辑控件以红色框起来?
为响应@Constantine Georgiou 3/9 的回答而添加:
新代码:
CBitmap redBoxBitmap; // member variables of class CModelEditorSpecies
CBrush redBoxBrush;
BOOL CModelEditorSpecies::OnInitDialog()
{
CDialog::OnInitDialog();
BOOL ok;
CRect r; defaultSpecies1Ctrl.GetClientRect(&r);
xx(r.Width(), r.Height()/*, redBoxBrush*/);
ok = redBoxBrush.CreatePatternBrush(&redBoxBitmap);
//...
}
void CModelEditorSpecies::xx(const int w, const int h)
{
CDC *pDC=GetDC();
redBoxBitmap.CreateCompatibleBitmap(pDC, w, h);
// Create a red pen
CPen redPen;
redPen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
// Draw the bitmap - red pen & default background brush
CBitmap *pOldBitmap=pDC->SelectObject(&redBoxBitmap);
pDC->SelectObject(&redPen);
CBrush editBoxBrush;
editBoxBrush.CreateSysColorBrush(COLOR_WINDOW);
pDC->SelectObject(&editBoxBrush);
pDC->Rectangle(0, 0, w, h);
pDC->SelectObject(pOldBitmap);
// Create the edit-control custom brush
redBoxBrush.CreatePatternBrush(&redBoxBitmap);
return;
}
此代码生成一个全黑的编辑控件,就好像正在使用的位图是单色的。如果在 dc 中绘制不会影响位图,或者如果在 dc 兼容的位图中绘制不使用 and 中的颜色,这是可以预期的redPen
,editBoxBrush
正如@IInspectable 所建议的那样。