将dlg中的picture control刷黑

本文详细介绍了如何使用C语言实现C打印对话框的绘图和填充功能,包括获取设备上下文、创建画刷、设置颜色并填充矩形区域。

代码如下:

void CPrintDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialog::OnPaint()
CWnd* pWnd = this->GetDlgItem(IDC_STATIC); //IDC_STATIC为控件ID
CDC* pDC = pWnd->GetDC();
CRect rc;
pWnd->GetClientRect(&rc);
//GetClientRect(&rc);
CBrush brush;
brush.CreateSolidBrush( RGB(0, 0, 0) );

//dc.FillRect((LPCRECT)rc, &brush);
pDC->FillRect((LPCRECT)rc, &brush);
}


MFC中重绘插入的Picture Control控件有多种方法,以下为你详细介绍: #### 方法一:继承`STATIC`类并重写`OnPaint`函数 通过继承`STATIC`类,创建自定义的`CMyPictureControl`类,在`OnPaint`函数内进行图片加载和绘制,既保证了效率,也避免了图片会被新掉的风险。代码示例如下: ```cpp void CMyPictureControl::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 CRect rect; CBrush brush; CBitmap bmp; GetClientRect(&rect); bmp.LoadBitmap(IDB_BITMAP_1); //IDB_BITMAP_1通过资源管理器加载好的图片 brush.CreatePatternBrush(bmp); dc.FillRect(rect, &brush); bmp.DeleteObject(); brush.DeleteObject(); // 不为绘图消息调用 CStatic::OnPaint() } ``` 在这个方法中,`OnPaint`函数会在控件需要重绘被调用,在函数内部,首先获取控件的客户区矩形,然后加载指定的位图资源,创建一个图案画,并使用该画填充整个客户区,最后删除位图和画对象,避免资源泄漏[^1]。 #### 方法二:在按钮点击事件中重绘 在按钮的点击事件处理函数中,重新加载并显示图片,实现Picture Control控件的重绘。例如: ```cpp void Cpicture_test_controlDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 //需要再资源视图中增加资源,资源类型为Bitmap CBitmap img; if (!img.LoadBitmap(IDB_BITMAP2)) { AfxMessageBox("imread error"); } // 获取Picture Control的设备上下文 CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC); CDC *pDC = pStatic->GetDC(); // 获取对话和图片的尺寸 CRect rect; pStatic->GetClientRect(&rect); BITMAP bmpInfo; img.GetBitmap(&bmpInfo); // 创建兼容的内存设备上下文 CDC memDC; memDC.CreateCompatibleDC(pDC); CBitmap* pOldBitmap = memDC.SelectObject(&img); // 绘制缩放后的图片 int iStretchMode = pDC->SetStretchBltMode(COLORONCOLOR); // 色彩保留 pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY); pDC->SetStretchBltMode(iStretchMode); // 清理 memDC.SelectObject(pOldBitmap); ReleaseDC(pDC); } ``` 此方法通过在按钮点击事件中重新加载位图资源,获取Picture Control控件的设备上下文,创建兼容的内存设备上下文,将位图选入内存设备上下文,然后使用`StretchBlt`函数将图片绘制到Picture Control控件上,最后进行资源清理工作[^2]。 #### 方法三:直接设置位图句柄 在按钮点击事件中,通过`LoadBitmap`加载位图资源,获取位图句柄,然后使用`SetBitmap`方法将位图设置到Picture Control控件上,实现重绘。示例代码如下: ```cpp void Ctest07Dlg::OnBnClickedLoadPicButton() { // TODO: 在此添加控件通知处理程序代码 CBitmap bitmap; // CBitmap对象,用于加载位图 HBITMAP hBmp; // 保存CBitmap加载的位图的句柄 bitmap.LoadBitmap(IDB_BITMAP1); // 将位图IDB_BITMAP1加载到bitmap hBmp = (HBITMAP)bitmap.GetSafeHandle(); // 获取bitmap加载位图的句柄 m_jzmPicture.SetBitmap(hBmp); // 设置图片控件m_jzmPicture的位图图片为IDB_BITMAP1 } ``` 该方法较为简单直接,通过`LoadBitmap`加载指定的位图资源,获取其句柄,然后使用`SetBitmap`方法将该位图句柄设置到Picture Control控件上,从而实现控件的重绘[^3]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值