首页
社区
课程
招聘
[旧帖] 求助,关于SetPixel的问题 0.00雪花
发表于: 2012-10-18 11:24 4306

[旧帖] 求助,关于SetPixel的问题 0.00雪花

2012-10-18 11:24
4306
前言:我写了一个  二维码  的小软件,想在界面上显示生成出来的二维码

问题:1.显示的二维图像太小。2.一刷新就没了。

小弟折腾了已经将近3-4天了,百度和谷歌都无果,所以前来求大神指点。小弟先声谢过了。

上一下我的代码:
BOOL CQRDlg::OnInitDialog()
{
	m_pSymbleDC = ((CStatic *)GetDlgItem(IDC_BITMAP_1))->GetDC();
}
void CQRDlg::OnBnClickedButton1()
{
	CQR_Encode* pQR_Encode = new CQR_Encode;

	int nLevel = m_comboLevel.GetCurSel();
	int nVersion = QR_VRESION_L;
	int nMaskingNo = 1;
	 
	BOOL bAutoExtent = TRUE;

	CString strEdit1;
	GetDlgItemText(IDC_EDIT1,strEdit1);

	m_bDataEncoded = pQR_Encode->EncodeData(nLevel, nVersion, bAutoExtent, nMaskingNo, CStringA(strEdit1).GetString());

	if (m_bDataEncoded)
	{		
		
		//------------------------------------------------------------------------------
		// 主要是这里出现问题
		//------------------------------------------------------------------------------
		// 获取尺寸
		m_nSymbleSize = pQR_Encode->m_nSymbleSize + (QR_MARGIN * 2);

		CBitmap *m_pSymbleBitmap = new CBitmap;
		m_pSymbleBitmap->CreateCompatibleBitmap(m_pSymbleDC,m_nSymbleSize,m_nSymbleSize);

		// 将背景填充为白色
 		m_pSymbleDC->PatBlt(0, 0, m_nSymbleSize, m_nSymbleSize, WHITENESS);

		for (int i = 0; i < pQR_Encode->m_nSymbleSize; ++i)
		{
			for (int j = 0; j < pQR_Encode->m_nSymbleSize; ++j)
			{
				if (pQR_Encode->m_byModuleData[i][j])
					SetPixel(m_pSymbleDC->GetSafeHdc(),i + QR_MARGIN, j + QR_MARGIN, RGB(0, 0, 0));
			}
		}
		
		// 获得HBITMAP主要用来以后保存为bmp文件
		hBitmap = GetSrcBit(m_pSymbleDC->GetSafeHdc(),m_nSymbleSize,m_nSymbleSize);
	}

	delete pQR_Encode;


}

HBITMAP   CQRDlg::GetSrcBit(HDC   hDC,DWORD   BitWidth,   DWORD   BitHeight) 
{ 
	HDC   hBufDC; 
	HBITMAP   hBitmap,   hBitTemp; 

	//创建设备上下文(HDC) 
	hBufDC   =   CreateCompatibleDC(hDC); 

	//创建HBITMAP 
	hBitmap   =   CreateCompatibleBitmap(hDC,   BitWidth,   BitHeight); 
	hBitTemp   =   (HBITMAP)   SelectObject(hBufDC,   hBitmap); 

	//得到位图缓冲区 
	StretchBlt(hBufDC,   0,   0,   BitWidth,   BitHeight, 
		hDC,   0,   0,   BitWidth,   BitHeight,   SRCCOPY); 

	//得到最终的位图信息 
	hBitmap   =   (HBITMAP)   SelectObject(hBufDC,   hBitTemp); 

	//释放内存 

	::DeleteDC(hBufDC); 

	return   hBitmap; 
} 



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你那个SetPixel是点的绘图函数,效率忒低了。楼主完全可以创建一个笔刷然后用BRUSH进行描绘,笔刷是可以选择宽度的。你说的一刷就没了是因为你绘图代码写错位置了,建议楼主学习下MFC。每次绘图触发的是WM_PAINT消息。对应的函数是OnPaint,理论上应该再这里绘图。当然对MFC架构了解得多的话,再OnEraseBkGnd,PreSubClassDlgItem,DrawItem等里面绘图也是可以的。你把绘图部分函数移动到OnPaint中就会解决一刷就没滴问题。
2012-10-18 11:50
0
雪    币: 330
活跃值: (105)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
回二楼大神,我如果不用SetPixel可以用什么函数来代替他啊,这个函数非要打在屏幕上,真是太烦人了。
而且我如果将
BOOL CQRDlg::OnInitDialog()
{
//  m_pSymbleDC = ((CStatic *)GetDlgItem(IDC_BITMAP_1))->GetDC();
     m_pSymbleDC = new CDC();
}
打出的却是乱图,这个能用什么办法解决啊。
2012-10-18 12:43
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
……
DC是这样的:
OnPaint()
{
……
CClientDC dc(this);
……//这里是你的东西dc不是new出来的要与设备相关 至于SetPixel可以用moveto lineto等函数进行替换。建议你找个简单的MFC带有界面美化的源码看一下。挺简单的
}
2012-10-18 13:08
0
雪    币: 225
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
图像太小可用DrawRect代替SetPixel
2012-10-18 13:20
0
游客
登录 | 注册 方可回帖
返回
//