- 瑞瑞爱吃桃
-
我这有几个函数你看看
CreateCompatibleDC
函数功能
该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。通过GetDc()获取的HDC直接与相关设备沟通,而本函数创建的DC,则是与内存中的一个表面相关联。
函数原型
HDC CreateCompatibleDC(HDC hdc);
参数
hdc:现有设备上下文环境的句柄,如果该句柄为NULL,该函数创建一个与应用程序的当前显示器兼容的内存设备上下文环境。
返回值:如果成功,则返回内存设备上下文环境的句柄;如果失败,则返回值为NULL。
Windows NT:若想获得更多错误信息,请调用GetLastError函数。
注释:内存设备上下文环境是仅在内存中存在的设备上下文环境,当内存设备上下文环境被创建时,它的显示界面是标准的一个单色像素宽和一个单色像素高,在一个应用程序可以使用内存设备上下文环境进行绘图操作之前,它必须选择一个高和宽都正确的位图到设备上下文环境中,这可以通过使用CreateCompatibleBitmap函数指定高、宽和色彩组合以满足函数调用的需要。
当一个内存设备上下文环境创建时,所有的特性都设为缺省值,内存设备上下文环境作为一个普通的设备上下文环境使用,当然也可以设置这些特性为非缺省值,得到它的特性的当前设置,为它选择画笔,刷子和区域。
CreateCompatibleDc函数只适用于支持光栅操作的设备,应用程序可以通过调用GetDeviceCaps函数来确定一个设备是否支持这些操作。
当不再需要内存设备上下文环境时,可调用DeleteDc函数删除它。
ICM:如果通过该函数的hdc参数传送给该函数设备上下文环境(Dc)对于独立颜色管理(ICM)是能用的,则该函数创建的设备上下文环境(Dc)是ICM能用的,资源和目标颜色间隔是在Dc中定义。
CreateCompatibleBitmap
函数功能:该函数创建与指定的设备环境相关的设备兼容的位图。
函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight);
参数:
hdc: 设备环境句柄。
nWidth:指定位图的宽度,单位为像素。
nHeight:指定位图的高度,单位为像素。
返回值:如果函数执行成功,那么返回值是位图的句柄;如果函数执行失败,那么返回值为NULL。若想获取更多错误信息,请调用GetLastError。
备注:由CreateCompatibleBitmap函数创建的位图的颜色格式与由参数hdc标识的设备的颜色格式匹配。该位图可以选入任意一个与原设备兼容的内存设备环境中。由于内存设备环境允许彩色和单色两种位图。因此当指定的设备环境是内存设备环境时,由CreateCompatibleBitmap函数返回的位图格式不一定相同。然而为非内存设备环境创建的兼容位图通常拥有相同的颜色格式,并且使用与指定的设备环境一样的色彩调色板。
fillsolidrect
void FillSolidRect(
int x,
int y,
int cx,
int cy,
COLORREF clr
);
参数:
lpRec
指向RECT数据结构的指针,包含被填充的矩形的逻辑坐标,可以为该参数传递RECT数据结构或CRect对象的指针。
clr
指定填充矩形使用的颜色。
x
矩形左上角的X逻辑坐标。
y
矩形左上角的Y逻辑坐标。
cx
指定矩形的宽度。
cy
指定矩形的高度。
说明:
调用该成员函数用指定的固体色填充矩形。
FillSolidRect与CDC::FillRect类似,FillSolidRect只能使用固体色(由COLORREF参数决定)。但FillRect带有画刷,因此可以为矩形填充固体色、抖动色、阴影或使用调色板。FillRect通常比FillSolidRect慢。
注意:调用FillSolidRect时,以前用SetBkColor设置的背景色,被设置为clr指定的颜色。
Detach
detach()函数:
MFC类里CMENU类的成员函数。功能是切断一个CWnd对象和一个有效窗口的联系。
由于WNDCLASS其实和CWnd根本没有什么关系,它们之间只是通过CWnd的成员HWND联系起来的。Detach的作用是切断一个CWnd对象和一个有效窗口的联系。因为CWnd是C++的对象,C++的对象有一个生存期的概念,脱离了该对象的作用域,这个对象就要被销毁,但是Windows对象没有这个特点,当销毁CWnd对象的时候,我们不一定希望WNDCLASS一起被销毁,那么在此之前,我们就先要把这个联系切断。
当我们建立了一个局部的菜单对象后,比如 在一个窗口类的函数里建立了一个局部菜单对象,当这个窗口函数的生命周期结束时,如果不希望菜单对象也被销毁,就要用detach()函数把菜单句柄和这个菜单对象分离。这样,当局部的菜单对象被销毁时,它不会销毁一个它不具备拥有权的菜单。
GetClientRect
函数功能
该函数获取窗口客户区的坐标。客户区坐标指定客户区的左上角和右下角。由于客户区坐标是相对子窗口客户区的左上角而言的,因此左上角坐标为(0,0)
函数原型
在Win32 SDK, 该API函数原型为
BOOL GetClientRect(
HWND hWnd, // 窗口句柄
LPRECT lpRect // 客户区坐标
);
在MFC中,该函数的原型为void GetClientRect(LPRECT lpRect) const;
参数
hWnd
[输入]是程序窗口的句柄。
lpRect
[输出]是一个指针,指向一个RECT类型的rectangle结构。该结构有四个LONG字段,分别为left、top、right和bottom。GetClientRect将这四个字段设定为窗口显示区域的尺寸。left和top字段通常设定为0。right和bottom字段设定为显示区域的宽度和高度(像素点数)。 也可以是一个CRrect对象指针。CRect对象有多个参数,与RECT用法相同。
返回值
如果函数成功,返回一个非零值。
如果函数失败,返回零。要得到更多的错误信息,请使用GetLastError函数。
BitBlt
函数功能
该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。
函数原型
BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);
参数
hdcDest:指向目标设备环境的句柄。
nXDest:指定目标矩形区域左上角的X轴逻辑坐标。
nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。
nWidth:指定源和目标矩形区域的逻辑宽度。
nHeight:指定源和目标矩形区域的逻辑高度。
hdcSrc:指向源设备环境的句柄。
nXSrc:指定源矩形区域左上角的X轴逻辑坐标。
nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。
dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。
下面列出了一些常见的光栅操作代码:
BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。
DSTINVERT:表示使目标矩形区域颜色取反。
MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。
MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。
NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。
NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。
PATCOPY:将特定的模式拷贝到目标位图上。
PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。
PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。
SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。
SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。
SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。
SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。
SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。
WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。
返回值
如果函数成功,那么返回值非零;如果函数失败,则返回值为零。
SetClassLong
函数功能:该函数替换在额外类存储空间的指定偏移地址的32位长整型值,或替换指定窗口所属类的WNDCLASSEX结构。
函数原型:DWORD SetClassLong(HWND hWnd,int nlndex,LONG dwNewLong);
参数:
hWnd:窗口句柄及间接给出的窗口所属的类。
nlndex:指定将被替换的32位值。在额外类存储空间中设置32位值,应指定一个大于或等于0的偏移量。
有效值的范围从0到额外类的存储空间的字节数一4;例如,若指定了12个字节或多于12个字节的额外类存储空间,则索引值为8时,对应的是第三个32位整数值。要设置WNDCLASSEX结构中的任何值,指定下面索引之一:
GCL_CBCLSEXTRA:设置与类相关的尺寸的字节大小。设定该值不改变己分配的额外字节数。
GCL_CBWNDEXTRA:设置与类中的每一个窗口相关的尺寸的字节大小。设定该值不改变已分配额外字节数。查看如何进入该内存,参看SetWindowLOng。
GCL_HBRBACKGROUND:替换与类有关的背景刷子的句柄。
GCL_HCURSOR:替换与类有关的光标的句柄。GCL_HICON:替换与类有关的图标的句柄。
GCL_HMODULE:替换注册类的模块的句柄。GCL_STYLE:替换窗口类的风格位。
GCL_MENUNAME :替换菜单名字符串的地址。该字符串标识与类有关的菜单资源。
GCL_WNDPROC :替换与窗口类有关的窗口过程的地址。
dwNewLong:指定的替换值。
返回值:如果函数成功,返回值是原来类结构中32位整数;如果未事先设定,返回值为0。如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。
备注;如果使用SetClassLong函数和GCL_WNDPROC索引值来替换窗口过程,新的窗口过程必须与WindowProc回调函数中所规定的规则一致。
以带GCL_WNDPROC索引值的SetClassLong函数修改的一个窗口类的的子类将会影响所有随后以该类创建的窗口。应用程序可以创建一个系统类的子类,但是不能创建由其他进程创建的类的子类。
通过使用RegisterClassEx函数将WNDCLASSEX结构中的cbWndExtra单元指定为一个非零值来保留额外的的类存储空间。
使用SetClassLong函数要小心。例如,可以通过使用SetClassLong来改变类的背景颜色,但是这种改变不会马上生效,直到属于该类的窗体下次重绘,除非使用UpdateWindow()强迫窗体更新。
Windows CE:nlndex参数是一个字节偏移量但必须是4的倍数。Unaligned不支持。
不支持在nlndex参数中的标准的CGL_★值,只有一个例外,如果目标设各支持鼠标,则可以在nlndex参数中指定CGL_HCURSOR。
MFC程序,在onpaint里用fillsolidrect给背景填充黑色,想改为其他颜色发现不起作用。。onpaint内容如下:
CRect rect;CPaintDC dc(this);GetClientRect(rect);dc.FillSolidRect(rect,RGB(0,255,0)); //设置为绿色背景2023-06-25 15:33:021
MFC 如何指定一个矩形并填充颜色
FillRect函数2023-06-25 15:33:163
请问MFC中有类似油漆桶的函数么?比如TC下的fillflood?
MFC CDC 类有许多涂色画图函数。例如:FillSolidRect (用于填矩形)PolyPolygon (用于填多边形)FloodFill (用于区域)等等。2023-06-25 15:33:231
vc双缓冲 除了文字部分其他都是黑色
HBITMAP hBitmap = CreateCompatibleBitmap(Vhdc,rect->right,rect->bottom);----》改为HBITMAP hBitmap = CreateCompatibleBitmap(hdc,rect->right,rect->bottom);2023-06-25 15:33:302
MFC 还原静态文本框背景颜色
改变之前先得到静态文本框的背景色存起来,想变回来的时候再用这个颜色添充就好了2023-06-25 15:33:372
MFC CDC 用 BitBlt 绘图后,如何清空画布?
三个办法:如果是在OnDraw/OnPaint中(你这个应该不是),那么条件语句分支屏蔽BitBlt即可如果不在OnDraw/OnPaint中,调用Invalidate();语句,触发重绘即可获取画布区域rect,用底色FillSolidRect画一个矩形也可以。2023-06-25 15:33:441
求救,怎么用HDC完成双缓冲绘图
参考一下这个CRect rect;//定义一个区域GetClientRect(&rect);//要画的区域CDC memdc; //画布对象 CBitmap bitmap; //内存位图 memdc.CreateCompatibleDC(pDC); //创建与显示设备兼容的位图 bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); //加载位图CBitmap *pOldBit=memdc.SelectObject(&bitmap); //将位图选入设备 memdc.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255)); //绘图//如果在memdc这个DC里画东西,可以看见,而你用pDC->来画的话,是看不见的。while(ii<200){ii++;memdc.MoveTo(0,0);memdc.LineTo(100+ii,100);}//释放资源 pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memdc, 0, 0, SRCCOPY); bitmap.DeleteObject(); //释放位图memdc.DeleteDC(); //释放内存画布ReleaseDC(pDC); //这个看情况 记得把背景去掉2023-06-25 15:33:511
mfc中静态框变颜色时遇到的问题
第一个问题没明白关于ID可以用循环来实现的,添加三个static text控件,设置它们的ID的最后数字部分为连续的(IDC_COLOR1, IDC_COLOR2, IDC_COLOR3)HBRUSH CColorSetDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {………………// TODO: Return a different brush if the default is not desiredint idFirst = IDC_COLOR1, idLast = IDC_COLOR3;for(idFirst; idFirst <= idLast; idFirst++)if(pWnd-> GetDlgCtrlID()==idFirst) { HBRUSH m_redBrush = CreateSolidBrush(RGB(255, 0, 0));return m_bkBrush;} ………………}或许对问题理解有所偏差,仅供参考,不可轻信~2023-06-25 15:33:582
MFC画图 画第二次的时候第一次的图就被覆盖了。怎么能保存之前的绘图结果呢?
定义一个CBitmap 变量 第一次画完存进该变量之后每次画之前先把该CBitmap 贴上去2023-06-25 15:34:063
mfc中static控件显示时间闪烁
重载run方法 在里面实现 不要用timer 重载run方法 在里面实现消息循环利用peekmessage在空闲时间刷你的屏幕这样就可以避免使用timer 然后在你的实现代码里使用双缓冲这样就不会闪烁了 这也是一些游戏的实现方法 例如 雷电2023-06-25 15:34:243
MFC运行中断
中断是什么意思?2023-06-25 15:34:311
在VC中加了坐标映射,为什么BitBlt()函数就画不出图了?
void CCyshetextView::OnDraw(CDC* pDC){ //创建一副关于屏幕DC的图画 CRect rect; GetClientRect(rect); //得到客户区大小 //以下为设置坐标映射 int mode = pDC->SetMapMode(MM_ANISOTROPIC); //X、Y单位长度都自定义的映射模式 pDC->SetWindowOrg(0,0); //设置窗口左上角的坐标为 pDC->SetWindowExt(50,50); //设置窗口度量 pDC->SetViewportOrg(0,0); pDC->SetViewportExt(rect.right,rect.bottom); //创建关于屏幕的内存DC CDC mDC; mDC.CreateCompatibleDC(pDC); CBitmap MemBitmap; MemBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom); //保留以前内存,并将这幅图选入到内存DC中 CBitmap *pOldBitmap=mDC.SelectObject(&MemBitmap); //以下为画直线//先画背景 mDC.FillSolidRect(0,0,50,50,GetSysColor(COLOR_WINDOW)); CPen PenWave(PS_SOLID,5,RGB(255,0,255));//创建紫色的画笔PenWave mDC.SelectObject(PenWave); mDC.MoveTo(0,0); mDC.LineTo(50,50); //下面将内存DC上所绘内容一次性拷贝到当前DC pDC->BitBlt(0,0,rect.right,rect.bottom,&mDC,0,0,SRCCOPY); //资源回收 mDC.SelectObject(pOldBitmap); pDC->SetMapMode(mode);}//这才是正确的。//compatible bitmap默认是黑白两色的,你没画过的地方就是黑的,用fillsolidrect或其他方法画即可。//应该为pDC改变映射模式。 你要画成什么样子至少的说出来噻2023-06-25 15:34:392
双缓冲技术绘图的过程
双缓冲实现过程如下:1、在内存中创建与画布一致的缓冲区2、在缓冲区画图3、将缓冲区位图拷贝到当前画布上4、释放内存缓冲区在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。因为窗体在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PAINT的响应很频繁的时候,这种反差也就越发明显。于是我们就看到了闪烁现象。我们会很自然的想到,避免背景色的填充是最直接的办法。但是那样的话,窗体上会变的一团糟。因为每次绘制图象的时候都没有将原来的图象清除,造 成了图象的残留,于是窗体重绘时,画面往往会变的乱七八糟。所以单纯的禁止背景重绘是不够的。我们还要进行重新绘图,但要求速度很快,于是我们想到了使用 BitBlt函数。它可以支持图形块的复制,速度很快。我们可以先在内存中作图,然后用此函数将做好的图复制到前台,同时禁止背景刷新,这样就消除了闪 烁。以上也就是双缓冲绘图的基本的思路。首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:CDC MemDC; //首先定义一个显示设备对象CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画 ^_^(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上)MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //将位图选入到内存显示设备中//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //先用背景色将位图清除干净,这里我用的是白色作为背景 你也可以用自己应该用的颜色MemDC.MoveTo(……); MemDC.LineTo(……); //绘图内容pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //将内存中的图拷贝到屏幕上进行显示MemDC.SelectObject(pOldBit); MemBitmap.DeleteObject(); MemDC.DeleteDC();//绘图完成后的清理//把前面的pOldBit选回来.在删除MemBitmap之前要先从设备中移除它双缓冲(two way soft-closing)2023-06-25 15:34:581
vc++6.0输出窗口背景颜色
---- 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下:---- ① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。---- ② 在CExampleDlgApp ::InitInstance()中添加如下代码:BOOL CExampleDlgApp: : InitInstance ( ){…CExampleDlgDlg dlg;m_pMainWnd = &dlg;//先于DoModal()调用,将对话框设置为蓝色背景、红色文本SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));int nResponse = dlg.DoModal();…}---- 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。---- 方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准):void CExampleDlgDlg::OnPaint(){if (IsIconic())…else{CRect rect;CPaintDC dc(this);GetClientRect(rect);dc.FillSolidRect(rect,RGB(0,255,0)); //设置为绿色背景CDialog::OnPaint();}---- 方法三:重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准):---- ①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量:class CExampleDlgDlg : public CDialog{...protected:CBrush m_brush;...};---- ②在OnInitDialog()函数中添加如下代码:BOOL CExampleDlgDlg::OnInitDialog(){...// TODO: Add extra initialization herem_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一绿色刷子...}---- ③利用ClassWizard重载OnCtlColor(…),即WM_CTLCOLOR消息:HBRUSH CExampleDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){/*** 这里不必编写任何代码!**下行代码要注释掉** HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);*/return m_brush; //返加绿色刷子}---- 方法四:还是重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准):---- 步骤①、②同上方法三中的步骤①、②。---- 步骤③利用ClassWizard重载OnCtlColor(…)(即WM_CTLCOLOR消息)时则有些不同:HBRUSH CExampleDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);//在这加一条是否为对话框的判断语句if(nCtlColor ==CTLCOLOR_DLG)return m_brush; //返加绿色刷子return hbr;}---- 编译并运行即可。---- 关于如何改变对话框背景颜色的问题,可能还有很多种不同方法可以实现,笔者在这仅举出四种常见的方法。其中方法三的编程似乎有点不太规范,方法四则要比方法三正统些,笔者这样的对比举例是为了拓宽VC编程爱好者特别是初学者的编程思路,读者可以根据实际情况选用其中的一种。如果再结合《软件报》2000年第5期中改变对话框上的控件颜色,相信会使您的MFC应用程序"增色"不少2023-06-25 15:35:111
我的c++在picture控件区域用了双缓冲之后,点击按钮无法弹出子对话框,而且主对话框也没有反应
去除所有断点F5运行程序等程序无响应的时候,点击调试的暂停,看程序停再那里,查看callstack,不知道是不是递归了或者别的什么情况2023-06-25 15:35:181
delphi 缓冲画图(内存画图)解决画图闪烁问题[2]
到了mfc里面 由于有了封装 所有的hdc被隐藏在对象中做为隐藏参数传递(就是DC类的this啦~~) 所以我们的关键话题就转变为了怎样得到想要的DC类而已 这个过程其实大同小异的 在消息响应的过程中 WM_PAINT被转变为OnDraw() OnPaint()一系列函数来响应 这些函数一般都有个参数CDC *pDC传入进来 因此在这些函数里面 我们就只需要直接画图就可以了 和以前sdk的方式一样 但是WM_PAINT消息响应的频度太高了 比如最小化最大化 移动窗体 覆盖等等都引起重绘 经常的这样画图 很是消耗性能 在有些场合 比如随机作图的场合 每一次就改变 还导致了程序的无法实现 怎么解决后一种问题呢 ms在msdn的例子里面交给我们document/view的经典解决办法 将图形的数据存储在document类里面 view类只是根据这些数据绘图 比如你要画个圆 只是将圆心和半径存在document里面 view类根据这个里面的数据在屏幕上面重新绘制 那么 我们只需要随机产生一次数据就可以了 这样还是存在性能的问题 于是我们开始考虑另外的解决方法 我们知道 将内存中的图片原样输出到屏幕是很快的 这也是我们在dos时代经常做的事情 能不能在windows也重新利用呢?答案就是内存缓冲绘图 我们今天的主题 我们还是回到DC上来 既然DC是绘图对象 我们也就可以自己来在内存里面造一个 让它等于我们想要的图 图(CBitmap)可以存储在document类里面 每一次刷新屏幕都只是将这个图输出到屏幕上面 每一次作图都是在内存里面绘制 保存在document的图里面 必要时还可以将图输出到外存保存 这样既保证了速度 也解决了随机的问题 在复杂作图的情况下对内存的开销也不大(总是一副图片的大小) 这是一个很好的解决办法 现在让我们来实现它们 我们在document类里面保存一个图片 CBitmap m_bmpBuf;//这里面保存了我们做的图 存在于内存中 在view类里面我们需要将这个图拷贝到屏幕上去 位于OnDraw(CDC *pDC)函数中 CDC dcMem;//以下是输出位图的标准操作 CBitmap *pOldBitmap = NULL; dcMem CreateCompatibleDC(NULL); pOldBitmap = dcMem SelectObject(&pDoc >m_bmpBuf); BITMAP bmpinfo; pDoc >m_bmpBuf GetBitmap(&bmpinfo); pDC >BitBlt( bmpinfo bmWidth bmpinfo bmHeight &dcMem SRCCOPY); dcMem SelectObject(pOldBitmap); dcMem DeleteDC(); 在我们需要画图的函数里面 我们完成绘图工作 CBmpDrawDoc *pDoc = GetDocument(); //得到document中的bitmap对象 CDC *pDC = GetDC(); CDC dcMem; dcMem CreateCompatibleDC(NULL);//这里我们就在内存中虚拟建造了DC pDoc >m_bmpBuf DeleteObject(); pDoc >m_bmpBuf CreateCompatibleBitmap(pDC );//依附DC创建bitmapCBitmap *pOldBitmap = dcMem SelectObject(&pDoc >m_bmpBuf);//我们调入了我们bitmap目标 dcMem FillSolidRect( RGB( ));//这些时绘图操作 随便你^_^ dcMem TextOut( Hello world! ); dcMem Rectangle( ); dcMem FillSolidRect( RGB( )); pDC >BitBlt( &dcMem SRCCOPY);//第一次拷贝到屏幕 dcMem SelectObject(pOldBitmap); dcMem DeleteDC(); 全部的过程就是这样 很简单吧 以此为例子还可以实现 个缓冲或者多个缓冲等等 视具体情况而定 当然在缓冲区还可以实现很多高级的图形操作 比如透明 合成等等 取决于具体的算法 需要对内存直接操作(其实就是当年dos怎么做 现在还怎么做) 再来解释一下前面说的为什么不能用全局变量保存DC问题 其实DC也是用句柄来标识的 所以也具有句柄的不确定性 就是只能随用随取 不同时间两次取得的是不同的(使用过文件句柄地话 应该很容易理解的) 那么我们用全局变量保存的DC就没什么意义了 下次使用只是什么也画不出来 (这一点的理解可以这样 DC需要占用一定的内存 那么在频繁的页面调度中 位置难免改变 于是用来标志指针的句柄也就不同了) lishixinzhi/Article/program/Delphi/201311/247982023-06-25 15:35:241
VC双缓存问题
替换不就行了,替换完在稍事修改2023-06-25 15:35:322
MFC双缓冲绘图时,无法显示颜色
可能的原因:1)MemDC.CreateCompatibleDC(NULL);//你这样创建的CDC有意义吗应该是MemDC.CreateCompatibleDC(pDC);2)MemDC.SelectObject(GetStockObject(NULL_BRUSH));//你这儿选了个空画刷3)MemDC.SetROP2(R2_NOT);//这一句我没用过,好像是反色输出,你把它去掉试试上面三种情况你试试改改看2023-06-25 15:35:391
VC++ MFC提供的绘图函数有哪些?这是一个简答题,就要函数有哪些
微软全都给你列的好好的了:http://msdn.microsoft.com/zh-cn/library/fxhhde73.aspx2023-06-25 15:36:083
为什么不能用DrawThemeTextEx
=::GetDC(hWnd);DTTOPTS dto={sizeof(DTTOPTS)};dto.dwFlags=DTT_COMPOSITED | DTT_GLOWSIZE;dto.dwSize=20;const UINT uFormat =DT_SINGLELINE | DT_CENTER | DT_NOPREFIX | DT_VCENTER;dc.FillSolidRect(&rcClient,02023-06-25 15:36:151
mfc中的onpaint函数中绘图以后不要求图片闪烁
不需要那么复杂,直接用InvalidateRect()或UpdateWindow()实时更新窗口就可以了。2023-06-25 15:36:232
【紧急求救】 VC++ 绘图 ,编译和运行没问题,就是不显示图片,请高手帮忙,不甚感激!
Graphics g(this->m_hWnd)this->m_hWnd这个是返回窗口的句柄,m_memDC.GetSafeHdc()这个虽然是句柄,是当前显示器兼容的内存设备的句柄两者虽然都是句柄,单指的不是一回事啊,编译只管类型,类型一致当然不报错了.GDI编程我是不会了,你可以看看这篇文章http://blog.csdn.net/duanhong19881021/article/details/5995919Graphics(HDC hdc, HANDLE hdevice); // 用于在指定设备上绘制图形你可以改成下面的语句试试看:Graphics g(pDC,m_memDC.GetSafeHdc()); 另外Graphics g(this->m_hWnd);可以直接用阿,为什么要改呢?这一句就是在当前窗口显示图形,比你用设备的句柄更直接.2023-06-25 15:36:301
求GetPixel函数类似函数。
可以把dc里的图bitblt到一个bitmap里,然后用getdibits得到bitmap的像素信息,这样所有点的颜色就都知道了。 双缓冲是避免连续显示大量图形时候卡,具体的百度一下。代码写在onpaint里CDC *pDC=GetDC(); CRect rect; GetClientRect(&rect); CDC MemDC; //首先定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(pDC); //这时还不能绘图,因为没有地方画 ^_^ //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上) MemBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); //将位图选入到内存显示设备中 //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是黑色作为背景 MemDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(0,0,0)); //绘图 for (int i=0;i<m_vDrawers.size();i++) { m_vDrawers[i]->Draw(&MemDC);//往memdc里画图 } //将内存中的图拷贝到屏幕上进行显示 pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY); //绘图完成后的清理 MemDC.SelectObject(pOldBit); MemBitmap.DeleteObject(); MemDC.DeleteDC(); -----------------------------------------m_vDrawers是我自己的类,你可以无视。 for (int i=0;i<m_vDrawers.size();i++) { m_vDrawers[i]->Draw(&MemDC);//往memdc里画图 }把这个循环替换成你的代码,用memdc画图2023-06-25 15:36:361
怎样设置背景颜色?就是cview代表的那个区域的颜色?
CRect rc; GetClientRect(&rc) pDC->FillSolidRect(rc, color);2023-06-25 15:36:443
关于clistctrl的OnPaint问题
DrawItem2023-06-25 15:37:021
MFC在静态文本上使用双缓冲画图
差不多就是楼上的这样了。用兼容DC来双缓存的,和静态文本没有多大关系。2023-06-25 15:37:203
VC ++对话框中清除图像和线条
你别在重绘里写 不就行了?2023-06-25 15:37:295
CClientDC dc(this);出现错误
你检查一下,OnDrawBegin()这个函数是不是调用的太早。太早的意思是,View还没有完全生成之前,就调用它。但步一跟就知道原因了。2023-06-25 15:37:441
VC++画图
你再定义一个penCPen pen2(PS_SOLID,1,RGB(0,0,255));// 蓝色MemDC1.SelectObject(&pen2); 。。。你画的代码。2023-06-25 15:37:501
急问vc++高手
用mschart吧.下载一个控件,不过mschart还要手动改注册表.加信息进去.要不你自己用双缓冲把图画上去.2023-06-25 15:38:115
VC MFC picture控件清除图像问题
CRect Rect;(this->GetDlgItem(IDC_STATIC_PICTURE))->GetClientRect(&Rect);GetDC()-> FillSolidRect(&Rect,RGB(240,240,240)); RGB(240,240,240)指的是对话框的颜色值,虽然有点掩饰问题的感觉但是有效果!2023-06-25 15:38:242
listctrl控件什么时候调用drawitem
在绘制listctrl时调用drawitem,可以绘制框的背景颜色,在框里写字,绘制checkbox,贴一段代码吧//要了解LPDRAWITEMSTRUCT 结构体成员的意义,这个直接百度就行void CSkinListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){ // TODO: 添加您的代码以绘制指定项// CRect rcItem=lpDrawItemStruct->rcItem;// CDC * pDC=CDC::FromHandle(lpDrawItemStruct->hDC); CDC dc; dc.Attach(lpDrawItemStruct->hDC); CRect rect; CHeaderCtrl* pHeaderCtrl = GetHeaderCtrl(); int colCount = pHeaderCtrl->GetItemCount();//获取列数量 int line=lpDrawItemStruct->itemID; dc.SetTextColor(RGB(255,62,62)); for(int col=0;col<colCount;col++) { if (!GetSubItemRect(lpDrawItemStruct->itemID,col,LVIR_LABEL,rect)) continue; // 框的背景颜色 rect.SetRect(rect.TopLeft().x+1, rect.TopLeft().y+1, rect.BottomRight().x-1, rect.BottomRight().y-1); if(line&1) dc.FillSolidRect(rect,m_pColor[1]); else dc.FillSolidRect(rect,m_pColor[2]); CString str=GetItemText(line,col);//获取项文本 int colWidth=GetColumnWidth(col);//获取列宽度 dc.SelectObject(&m_textfont); if(col==0 && (GetExtendedStyle()&LVS_EX_CHECKBOXES)) rect.SetRect(rect.left+m_col0Offset, rect.top, rect.right, rect.bottom); dc.DrawText(str,rect,DT_VCENTER|DT_CENTER|DT_SINGLELINE); rect.left+=colWidth; } if(GetExtendedStyle()&LVS_EX_CHECKBOXES) { CRect CheckRect(lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, 0, 0); CheckRect.right = CheckRect.left + m_Size, CheckRect.bottom = CheckRect.top + m_Size; CDC pBmpDc; CBitmap newBMP; BITMAP bitmap; CBitmap *pOldBMP; pBmpDc.CreateCompatibleDC(&dc); newBMP.LoadBitmap(m_vCheckBox[line+m_MaxLineInPage*m_iPage]); // newBMP.LoadBitmap(IDB_BMP_CHECKED); newBMP.GetBitmap(&bitmap); pOldBMP = pBmpDc.SelectObject(&newBMP); dc.BitBlt( CheckRect.left, CheckRect.top, CheckRect.right-CheckRect.left, CheckRect.bottom-CheckRect.top, &pBmpDc,0,0,SRCCOPY); pBmpDc.SelectObject(pOldBMP); pBmpDc.DeleteDC(); /*dc.DrawFrameControl(CheckRect, DFC_BUTTON, (lpDrawItemStruct->itemState & ODS_CHECKED)? DFCS_BUTTONCHECK | DFCS_CHECKED : DFCS_BUTTONCHECK);*/ } dc.Detach(); dc.DeleteDC();}2023-06-25 15:38:311
VC++ MFC CListCtrl 插入大量数据 使用 虚拟 CListCtrl的问题。
要自己写的扩展类主要部分的代码,我给你一个清单/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /添加背景色无效CXXSortListCtrl :: OnCustomDraw(NMHDR * pNMHDR,LRESULT * pResult) { LPNMLVCUSTOMDRAW lplvcd =(LPNMLVCUSTOMDRAW)的pNMHDR; 开关(lplvcd - > nmcd.dwDrawStage) {情况下CDDS_PREPAINT: * pResult = CDRF_NOTIFYSUBITEMDRAW / /问子项通知。 突破; 情况下CDDS_ITEMPREPAINT:/ /子项通知要求。 * pResult = CDRF_NOTIFYSUBITEMDRAW; (GetExtendedStyle()LVS_EX_CHECKBOXES)/ /如果我们有一个复选框风格, {/ /忘记子项目通知。 * pResult = CDRF_DODEFAULT 诠释iRow = lplvcd - > nmcd.dwItemSpec; ((iRow 1))的/ / &&(ICOL 1))/ /单线 { lplvcd:> clrTextBk = m_clrLine / / RGB(255,0,0); lplvcd->的clrText m_clrText / / RGB(255,255,0); BR /> * pResult = CDRF_NEWFONT; } 在else / /双列 { lplvcd - > clrTextBk = m_clrTwoLine; / / RGB(255,0,0); lplvcd - > clrText = m_clrText; / / RGB(255,255,0); * pResult = CDRF_NEWFONT; } / /注意... ...... :) / /这里是你想改变的地方... (GetCheck(iRow)),/ /高光检查行 { / / lplvcd - > clrTextBk m_clrChkText; / / RGB(255,0,0); lplvcd - > clrText = m_clrChkText; / / RGB(255,255,0); * pResult = CDRF_NEWFONT; } } 突破; 情况下CDDS_ITEMPREPAINT:| CDDS_SUBITEM:/ / RECD时CDRF_NOTIFYSUBITEMDRAW中返回 {/ /响应CDDS_ITEMPREPAINT。 * pResult = CDRF_DODEFAULT 诠释ICOL的= lplvcd - > iSubItem; 诠释iRow = lplvcd - > nmcd.dwItemSpec; ((iRow 1))的/ / && (ICOL 1))/ /单线路 { lplvcd clrTextBk:= m_clrLine / / RGB(255,0,0); lplvcd> clrText = m_clrText; / / RGB (255,255,0); * pResult = CDRF_NEWFONT; } 其他/ /双列 { lplvcd clrTextBk = m_clrTwoLine / / RGB (255,0,0); lplvcd - > clrText = m_clrText; / / RGB(255,255,0); * pResult = CDRF_NEWFONT; } (GetItemState(iRow,LVIS_SELECTED)) { lplvcd> clrTextBk = m_clrSelected / / RGB(255,0,0); lplvcd - > clrText = m_clrSelText / / RGB( 255,255,0); * pResult = CDRF_NEWFONT; } 突破; } 默认:/ /这不是一个通知这是有趣的。 * pResult = CDRF_DODEFAULT;} }2023-06-25 15:38:382
图片移动的时候有痕迹。MFC
是闪烁么?2023-06-25 15:38:573
什么是成员函数
成员函数 CDC类中,常用的一些成员函数。 CDC CObject └CDC CDC类定义的是设备上下文对象的类。 CDC对象提供处理显示器或打印机等设备上下文的成员函数,以及处理与窗口客户区对应的显示上下文的成员。 通过CDC对象的成员函数进行所有的绘图。 类对设备上下文操作提供了成员函数,处理绘图工具。安全型图形设备接口(GDI)对象收集,以及处理颜色和调色板。 它还为获取和设置绘图属性、映射,处理视点、窗口扩展、转换坐标,处理区域、剪贴、绘制直线及绘制简单椭圆和多边形等形状提供了成员函数。 另外还为绘制文本、处理字体,使用打印机跳转,滚动和播放元文件提供成员函数。 使用CDC对象时要构造它,然后调用与它平等的、使用设备上下文的Windows函数的成员函数。 注意: Windows 95下所有屏幕坐标限制在16位以内。因此向CDC成员函数传递的int必须在-32768至32767之间。 为了特定用途,Microsoft基本类库提供了几个CDC派生类。 CPaintDC 包括BeginPaint和EndPaint调用。 CClientDC 管理窗口用户区对应的显示上下文。 CWindowDC 管理与整个窗口对应的显示上下文,包括它的结构和控件。 CMetaFileDC 与带元文件的设备上下文对应。 CDC包含m_hDC和m_hAttribDC两个设备上下文,它们在CDC对象创建时参考同一个设备。 CDC指导所有对m_hDC的输出GDI调用以及对m_hAttribDC的大部分属性GDI调用(GetTextColor是属性调用的例子,而SetTextColor是一个输出调用)。 例如框架使用这两个设备上下文实现CMetaFileDC对象,在从物理设备读取属性期间向元文件发送输出。 打印预览以相同风格在框架中实现。还可以以相似方法在特殊应用代码中使用这两个设备上下文。 可能多次需要来自m_hDC和m_hAttribDC设备上下文的文本度量信息。 以下几对函数提供了这项功能: 使用m_hAttribDC 使用m_hDC GetTextExtent GetOutputTextExtent GetTabbedTextExtent GetOutputTabbedTextExtent GetTextMetrics GetOutputTextMetrics GetCharWidth GetOutputCharWidth 有关CDC的更多信息,请参阅联机文档“Visual C++程序员指南”中的“设备上下文”。 #include <afxwin.h> 请参阅:CPaintDC, CClientDC, CWindowDC, CMetaFileDC CDC类成员 数据成员 m_hDC CDC对象使用的输出设备上下文 m_hAttribDC CDC对象使用的输出属性上下文 构造函数 CDC 构造一个CDC对象 初始化 CreateDC 为指定设备创建设备上下文 CreateIC 为指定设备创建信息上下文。这提供了一种不创建设备上下文即获取有关设备信息的快速方式 CreateCompatibleDC 创建内存设备上下文,与另一个设备上下文匹配。可以用它在内存中准备图像 DeleteDC 删除CDC对象对应的Windows设备上下文 FromHandle 给定设备上下文句柄时,返回指向CDC对象的指针。如果CDC对象未附加到句柄,则创建并附加一个临时CDC对象 DeleteTempMap 由CWinApp空闲时间句柄调用,删除FromHandle创建的临时CDC对象。同时分离设备上下文 Attach 把Windows设备上下文附加到这个CDC对象 Detach 从CDC对象分离Windows设备上下文. SetAttribDC 设置属性设备上下文m_hAttribDC SetOutputDC 设置输出设备上下文m_hDC ReleaseAttribDC 释放属性设备上下文m_hAttribDC ReleaseOutputDC 释放输出设备上下文m_hDC GetCurrentBitmap 返回指向当前选择的CBitmap对象的指针 GetCurrentBrush 返回指向当前选择的CBrush对象的指针 GetCurrentFont 返回指向当前选择的CFont对象的指针 GetCurrentPalette 返回指向当前选择的CPalette对象的指针 GetCurrentPen 返回指向当前选择的CPen对象的指针 GetWindow 返回显示设备上下文对应的窗口 设备上下文函数 GetSafeHdc 返回输出设备上下文m_hDC SaveDC 保存设备上下文当前状态 RestoreDC 恢复SaveDC保存的设备上下文以前状态 ResetDC 更新m_hAttribDC设备上下文 GetDeviceCaps 获取有关给定显示设备功能的指定类型指定设备信息 IsPrinting 确定正在使用的设备上下文是否用于打印 安全型选择帮助器 GetBrushOrg 获取当前画刷的起点 SetBrushOrg 指定选入设备上下文的下一个画刷的起点 EnumObjects 枚举设备上下文中有效的笔和画刷 颜色和颜色调色板函数 SelectObject 选择笔等GDI绘图对象 SelectStockObject 选择Windows提供的预定义的一个笔、画刷或字体 绘图工具函数 GetNearestColor 获取与给定设备能显示的指定逻辑颜色最接近的逻辑色 SelectPalette 选择逻辑调色板 RealizePalette 把当前逻辑调色板中的调色板入口映射到系统调色板 UpdateColors 通过客户区当前颜色在像素基础上与系统调色板的匹配,更新设备上下文的客户区 GetHalftoneBrush 获取半色调画刷 绘图属性函数 GetBkColor 获取当前背景色 SetBkColor 设置当前背景色 GetBkMode 获取背景模式 SetBkMode 设置背景模式 GetPolyFillMode 获取当前多边形填充模式 SetPolyFillMode 设置多边形填充模式 GetROP2 获取当前绘图模式 SetROP2 设置当前绘图模式 GetStretchBltMode 获取当前位图拉伸模式 SetStretchBltMode 设置位图拉伸模式 GetTextColor 获取当前文本颜色 SetTextColor 设置文本颜色 GetColorAdjustment 获取用于设备上下文的颜色调整值 SetColorAdjustment 使用指定值设置设备上下文的颜色调整值 映射函数 GetMapMode 获取当前映射模式 SetMapMode 设置当前映射模式 GetViewportOrg 获取视区起点的X和Y坐标 SetViewportOrg 设置视区起点 OffsetViewportOrg 相对于当前视区起点坐标修改视区起点 GetViewportExt 获取视区X和Y范围 SetViewportExt 设置视区X和Y范围 ScaleViewportExt 相对于当前值修改视区范围 GetWindowOrg 获取参应窗口起点的X和Y坐标 SetWindowOrg 设置设备上下文的窗口起点 OffsetWindowOrg 相对于当前窗口起点的坐标修改窗口起点 GetWindowExt 获取对应窗口的X和Y坐标 SetWindowExt 设置对应窗口的X和Y坐标 ScaleWindowExt 相对于当前值修改窗口范围 坐标函数 DPtoHIMETRIC 设备单位转换为HIMETRIC单位 LPtoHIMETRIC 逻辑单位转换为HIMETRIC单位 DPtoLP 设备单位转换为逻辑单位 LPtoDP 逻辑单位转换为设备单位 HIMETRICtoDPHIMETRIC 单位转换为设备单位 HIMETRICtoLPHIMETRIC 单位转换为逻辑单位 区域函数 FillRgn 用指定画刷填充指定区域 FrameRgn 用画刷在指定区域周围绘制边线 InvertRgn 反转区域中的颜色 PaintRgn 用选取的画刷填充区域 剪切函数 SetBoundsRect 控制指定设备上下文绑定的矩形信息的累计 GetBoundsRect 返回到设备上下文当前累计的绑定矩形 GetClipBox 获取当前剪切边界周围最紧绑定矩形的维数 SelectClipRgn 使用指定模式合并给定区域和当前剪切区域 ExcludeClipRect 创建包含现有剪切区域减掉指定矩形的一个新剪切区域 ExcludeUpdateRgn 通过从剪切区域排除窗口中的更新区域,防止在窗口的无效区域中绘图 IntersectClipRect 通过构成当前区域和矩形的交集创建一个新的剪切区域 OffsetClipRgn 移动给定设备的剪切区域 PtVisible 确定给定点是否在剪切区域内 RectVisible 确定给定矩形的任何部分是否在剪切区域内 线输出函数 GetCurrentPosition 获取笔的当前位置(以逻辑坐标表示) MoveTo 移动当前位置 LineTo 从当前位置到一点画直线,但不包括那个点 Arc 画一段椭圆弧 ArcTo 画一段椭圆弧。除了更新当前位置以外,这个函数与Arc类似 AngleArc 画一条线段和圆弧,把当前位置移到圆弧终点 GetArcDirection 对设备上下文返回当前圆弧方向 SetArcDirection 设备圆弧和矩形函数要用到的绘图方向 PolyDraw 画一组线段和Bezier样条。这个函数更新当前位置Polyline画一组与指定点连接的线段 PolyPolyline 画多组相连线段。这个函数不使用也不更新当前位置 PolylineTo 画一条或多条直线,并把当前位置移到最后一条直线的终点 PolyBezier 画一条或多条Bezier样条。不使用也不更新当前位置 PolyBezierTo 画一条或多条Bezier样条,并把当前位置移到最后一条Bezier样条的终点 简单绘图函数 FillRect 用指定画刷填充给定矩形 FrameRect 在矩形周围绘制边界 InvertRect 反转矩形内容 DrawIcon 绘制图标 DrawDragRect 拖拽矩形时擦除并重绘它 FillSolidRect 用实颜色填充矩形 Draw3Drect 绘制三维矩形 DrawEdge 绘制矩形边 DrawFrameControl 绘制帧控件 DrawState 显示图像并应用可视化效果来表示一个状态 椭圆和多边形函数 Chord 绘制椭圆弧(椭圆和一条线段相交围成的闭合图形) DrawFocusRect 绘制用于表示焦点的风格的矩形 Ellipse 绘制椭圆 Pie 绘制饼形图 Polygon 绘制多边形,包含由线段连接的一个或多个点(顶点) PolyPolygon 创建使用当前多边形填充模式的两个或多个多边形,多边形可以相互分开或叠加 Polyline 绘制多边形,包含连接指定点的一组线段 Rectangle 使用当前笔绘制矩形,用当前画刷填充 RoundRect 使用当前笔绘制圆角矩形,用当前画刷填充 位图函数 PatBlt 创建位特征 BitBlt 从指定设备上下文拷贝位图 StretchBlt 把位图由源矩形和设备移动到目标矩形,必要时拉伸或压缩位图以适合目标矩形的维数 GetPixel 获取指定点像素的RGB颜色值 SetPixel 设置指定点像素为最接近指定色的近似值 SetPixelV 设置指定点坐标为最接近指定色的近似值。SetPixelV比SetPixel快,原因是它不用返回实际绘制点的颜色值 FloodFill 用当前画刷填充区域 ExtFloodFill 用当前画刷填充区域。比FloodFill成员函数提供更多灵活性 MaskBlt 使用给定屏蔽和光栅操作对源和目标位图合并颜色数据 PlgBlt 从源设备上下文的指定矩形到给定设备上下文中指定平行多边形,执行颜色数据位的位块传递 文本函数 TextOut 用当前选取字体在指定位置写字符串 ExtTextOut 用当前选取字体在矩形区域写字符串 TabbedTextOut 在指定位置写字符串,制表符扩展为制表符停止位置数组中指定值 DrawText 在指定矩形内绘制格式化文本 GetTextExtent 使用当前字体在属性设备上下文上计算文本行的宽度和高度,确定维数 GetOutputTextExtent 使用当前字体在输出设备上下文上计算文本行的宽度和高度,确定维数 GetTabbedTextExtent 使用当前字体在属性设备上下文上计算字符串的宽度和高度 GetOutputTabbedTextExtent 使用当前字体在输出设备上下文上计算字符串的宽度和高度 GrayString 在给定位置绘制暗(灰色)文本 GetTextAlign 获取文本对齐标记 SetTextAlign 设置文本对齐标记 GetTextFace 以空终止字符串形式把当前字体字样名拷贝到缓冲区 GetTextMetrics 从属性设备上下文为当前字体获取度量 GetOutputTextMetrics 从输出设备上下文为当前字体获取度量 SetTextJustification 把空格添加到字符串的中断字符 GetTextCharacterExtra 对字符间空格数量获取当前设置 SetTextCharacterExtra 设置字符间空格数量 字体函数 GetFontData 从比例字体文件获取字体度量信息。获取的信息通过指定字体文件与返回信息长度的偏移量标识 GetKerningPairs 获取指定设备上下文中当前选取的字体字符实对 GetOutlineTextMetrics 获取用于TrueType字体的字体度量信息 GetGlyphOutline 获取用于当前字体中外线字符串的外线曲线或位图 GetCharABCWidths 从当前字体获取给定范围相继字符以逻辑单位计数的宽度 GetCharWidth 从当前字体获取给定范围相继字符的分数宽度 GetOutputCharWidth 从使用输出设备上下文的当前字体获取相继字符组中各个字符的宽度 SetMapperFlags 改变字体映射表在从逻辑字体到物理字符映射时使用的算法 GetAspectRatioFilter 获取当前长宽比过滤器的设置 打印机跳离函数 QueryAbort 对打印应用调用AbortPro回滚函数,询问打印是否应终止 Escape 允许应用访问不能通过GDI直接使用的特殊设备的功能。同时允许访问Windows跳离函数。应用调用的Escape调用经翻译传送到设备驱动程序 DrawEscape 访问通过图形设备接口(GDI)不能直接使用的视频显示器的绘图功能 StartDoc 通告设备驱动程序开始一项新打印作业 StartPage 通告设备驱动程序开始新页 EndPage 通告设备驱动程序页结束 SetAbortProc 如果打印作业必须终止,设置Windows调用的由程序员提供的回滚函数 AbortDoc 终止当前打印任务,擦除自上次调用StartDoc成员函数以来应用写入设备的任何内容 EndDoc 结束由StartDoc成员函数启动的打印作业 滚动函数 ScrollDC 水平和垂直滚动位矩形 元文件函数 PlayMetaFile 在给定设备上播放指定元文件类型。增强版本的PlayMetaFile显示以增强格式元文件保存的图片。元文件可以播放任意次数 AddMetaFileComment 从缓冲区把注释拷贝到指定增强格式元文件 路径函数 AbortPath 关闭并拒绝设备上下文中任何路径 BeginPath 打开设备上下文中一个路径括号 CloseFigure 关闭路径中一个打开的图表 EndPath 关闭一个路径括号,并把括号定义的路径选择到设备上下文 FillPath 关闭当前路径中任何打开的图表,并用当前画刷和多边形填充模式填充路径内部 FlattenPath 变形选取到当前设备上下文路径中的任何曲线,把曲线变成一系列直线 GetMiterLimit 返回用于设备上下文的限制 GetPath 获取定义直线端点和从选择到设备上下文路径中找到的曲线控制点的坐标 SelectClipPath 对设备上下文选择当前路径作为剪切区域,通过使用指定模式合并新区域和任何现有剪切区域 SetMiterLimit 设备用于设备上下文的连接长度限制 StrokeAndFillPath 关闭路径中任何打开的图表,使用当前笔点路径外线,使用当前画刷填充它内部 StrokePath 使用当前笔描绘指定路径 WidenPath 如果路径使用过了当前选取到设备上下文中的笔点,重新定义当前路径为要画的区域2023-06-25 15:39:053
MFC中有没有绘垂直文字的函数?
你好.你可以定义一个CString类型变量str然后响应OnChar事件str.Format(nChar," ");2023-06-25 15:39:192
双缓冲的8Graphics创建方式
a、在内存上创建一块和显示控件相同大小的画布,在这块画布上创建Graphics对象。接着所有的图元都在这块画布上绘制,绘制完成以后再使用该画布覆盖显示控件的背景,从而达到“显示一次仅刷新一次”的效果!实现代码(在OnPaint方法中):Rectangle rect = e.ClipRectangle;Bitmap bufferimage = new Bitmap(this.Width, this.Height);Graphics g = Graphics.FromImage(bufferimage);g.Clear(this.BackColor);g.SmoothingMode = SmoothingMode.HighQuality; //高质量g.PixelOffsetMode = PixelOffsetMode.HighQuality; //高像素偏移质量foreach (IShape drawobject in doc.drawObjectList){if (rect.IntersectsWith(drawobject.Rect)){drawobject.Draw(g);if (drawobject.TrackerState == config.Module.Core.TrackerState.Selected&& this.CurrentOperator == Enum.Operator.Transfrom)//仅当编辑节点操作时显示图元热点{drawobject.DrawTracker(g);}}}using (Graphics tg = e.Graphics){tg.DrawImage(bufferimage, 0, 0); //把画布贴到画面上}b、直接在内存上创建Graphics对象:Rectangle rect = e.ClipRectangle;BufferedGraphicsContext currentContext = BufferedGraphicsManager.Current;BufferedGraphics myBuffer = currentContext.Allocate(e.Graphics, e.ClipRectangle);Graphics g = myBuffer.Graphics;g.SmoothingMode = SmoothingMode.HighQuality;g.PixelOffsetMode = PixelOffsetMode.HighSpeed;g.Clear(this.BackColor);foreach (IShape drawobject in doc.drawObjectList){if (rect.IntersectsWith(drawobject.Rect)){drawobject.Draw(g);if (drawobject.TrackerState == config.Module.Core.TrackerState.Selected&& this.CurrentOperator == Enum.Operator.Transfrom)//仅当编辑节点操作时显示图元热点{drawobject.DrawTracker(g);}}}myBuffer.Render(e.Graphics);g.Dispose();myBuffer.Dispose();//释放资源至此,双缓冲问题解决,两种方式的实现效果都一样,但最后一种方式的占有的内存很少,不会出现内存泄露!接下来是对acdsee拖动图片效果的实现。开始不懂双缓冲,以为双缓冲可以解决这个问题,结果发现使用了双缓冲没啥效果,请教了高人,然后修改了些代码,完成这个效果。图片是在pictureBox1里。Bitmap currentMap;bool first = true;private void pictureBox1_MouseDown(object sender, MouseEventArgs e){if (zoom == 0){if (e.Button == MouseButtons.Left) //draggingmousedrag = e.Location;Image myImage = myMap.GetMap();currentMap = new Bitmap(myImage);first = false;}}private void pictureBox1_MouseMove(object sender, MouseEventArgs e){if (zoom == 0&&!first){Image img = new Bitmap(Size.Width, Size.Height);Graphics g = Graphics.FromImage(img);g.Clear(Color.Transparent);//图片移动后显示的底色g.SmoothingMode = SmoothingMode.HighQuality; //高质量g.PixelOffsetMode = PixelOffsetMode.HighQuality; //高像素偏移质量g.DrawImageUnscaled(currentMap, new System.Drawing.Point(e.Location.X - mousedrag.X, e.Location.Y - mousedrag.Y));//在g中移动图片,原图在(0,0)画的,所以直接用new System.Drawing.Point(e.Location.X - mousedrag.X, e.Location.Y - mousedrag.Y)就好。g.Dispose();pictureBox1.Image = img;//img是在鼠标这个位置时生成被移动后的暂时的图片}}private void pictureBox1_MouseUp(object sender, MouseEventArgs e){if (zoom == 0){System.Drawing.Point pnt = new System.Drawing.Point(Width / 2 + (mousedrag.X - e.Location.X),Height / 2 + (mousedrag.Y - e.Location.Y));myMap.Center = myMap.ImageToWorld(pnt);pictureBox1.Image = myMap.GetMap();first = true;}}说说思路,在鼠标点下时创建一个bitmap,currentMap,用它来存放当前图像。鼠标移动时,根据鼠标位置画图,最后,鼠标up时,重新画图。在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。因为窗体在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PAINT的响应很频繁的时候,这种反差也就越发明显。于是我们就看到了闪烁现象。我们会很自然的想到,避免背景色的填充是最直接的办法。但是那样的话,窗体上会变的一团糟。因为每次绘制图象的时候都没有将原来的图象清除,造 成了图象的残留,于是窗体重绘时,画面往往会变的乱七八糟。所以单纯的禁止背景重绘是不够的。我们还要进行重新绘图,但要求速度很快,于是我们想到了使用 BitBlt函数。它可以支持图形块的复制,速度很快。我们可以先在内存中作图,然后用此函数将做好的图复制到前台,同时禁止背景刷新,这样就消除了闪 烁。以上也就是双缓冲绘图的基本的思路。首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:CDC MemDC; //首先定义一个显示设备对象CBitmap MemBitmap;//定义一个位图对象//随后建立与屏幕显示兼容的内存显示设备MemDC.CreateCompatibleDC(NULL);//这时还不能绘图,因为没有地方画 ^_^//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上)MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);//将位图选入到内存显示设备中//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);//先用背景色将位图清除干净,这里我用的是白色作为背景//你也可以用自己应该用的颜色MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));//绘图MemDC.MoveTo(……);MemDC.LineTo(……);//将内存中的图拷贝到屏幕上进行显示pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);//绘图完成后的清理//把前面的pOldBit选回来.在删除MemBitmap之前要先从设备中移除它MemDC.SelectObject(pOldBit);MemBitmap.DeleteObject();MemDC.DeleteDC();双缓冲(two way soft-closing)2023-06-25 15:39:271
写了一个打开位图的代码,可是一运行就崩溃啊。哪位大哥能给解?(我没分,不要介意)
m_pMemDC->DeleteDC();2023-06-25 15:39:422
离散点外包凸多边形生成算法(C#或者C++),要有详细代码和说明,最好有可运行的样例程序好的另外加分,急
百度浙大ACM模板,或者吉林大学ACM模板,里面应该有求凸包的算法代码。复杂度有nlogn的和n^2的。 或者直接百度凸包算法2023-06-25 15:39:493
VC的MFC编程时窗口显示多张bmp位图的问题
双缓冲 或者内存画图 建议后者 去网上找一个CMemDC的类 就可以2023-06-25 15:39:573
在vc++里用opencv处理bmp图片,求大侠帮忙!
buzhidao2023-06-25 15:40:043
怎么用内存DC绘图?这方面了解较少,希望高手们指点
很简单的,你可以参考下下面的void CCustomDraw::OnPaint() { CPaintDC dc(this); //取需要重绘的区域 CRect clipBox; dc.GetClipBox(&clipBox); //建立绘图缓冲的DC CDC BufferDC; BufferDC.CreateCompatibleDC(&dc); //也可以象下面这样写 //BufferDC.CreateCompatibleDC(NULL); //给缓冲区建立绘图用的兼容位图 CBitmap BufferBitmap; BufferBitmap.CreateCompatibleBitmap(&dc, clipBox.Width(), clipBox.Height()); //●注意啊,要创建与dc兼容的位图,不是与BufferDC兼容的位图 //●千万不能象下面这样写啊,我犯过的错误大家不要再犯了 //BufferBitmap.CreateCompatibleBitmap(&BufferDC, clipBox.Width(), clipBox.Height()); //使用位图 CBitmap *pOldBit = BufferDC.SelectObject(&BufferBitmap); //绘图 BufferDC.FillSolidRect(0, 0, clipBox.Width(), clipBox.Height(), RGB(255,0,255)); BufferDC.MoveTo(0, 0); BufferDC.LineTo(50, 50); //将缓冲区中的图复制到屏幕上进行显示 dc.BitBlt(clipBox.left, clipBox.top, clipBox.Width(), clipBox.Height(), &BufferDC, 0, 0, SRCCOPY); //绘图完成后的清理 BufferBitmap.DeleteObject(); BufferDC.DeleteDC();}2023-06-25 15:40:123
VC/MFC 请问如何把窗体刷回原来的颜色?
CteclolDlg::RedrawWindow();2023-06-25 15:40:315
如何解决vc++绘图出现屏幕闪烁的问题
相信很多人在做图形界面开发时,常常会遇到屏幕闪烁的情况,当然我也不例外。前段时间用vc++做了一个小游戏——五子棋,前期阶段主要做的是逻辑层面的编码,没有太注意屏幕闪烁的情况,到了后来实现悔棋功能时需要擦除已下过的棋子进行重绘,屏幕闪烁厉害,急需解决——有哪个玩家愿意玩屏幕老闪烁的游戏? 通常来说程序根据需要调用Invalidate(FALSE)使窗口客户区无效引起重绘,然后在窗口OnPaint函数(基于文档视图的程序则是OnDraw)中进行稳定绘图就行了。但是,我们在OnPaint中进行多重绘制(画背景、棋盘、棋子等),前后绘制的反差造成了闪烁现象。以前知道Java中解决屏幕闪烁问题是用双缓冲的方法,现在发现在vc++中也是可以这么做的。简单来说,双缓冲就是先把需要绘制的东西全部一口气画在内存中,最后把内存中的数据搬到屏幕上显示。下面是双缓冲的代码实现例子:点击(此处)折叠或打开void C****Dlg::OnPaint() { if (IsIconic()) { //...... } else { //CDialog::OnPaint(); //不要调用这个 CPaintDC dc(this);//对话框的dc//通常CPaintDC用来响应WM_PAINT消息。 //CPaintDC是从CDC派生出来的:在构造时自动调用CWnd::BeginPaint,析构时调用CWnd::EndPaint。RECT rect;// 客户区矩形 GetClientRect(&rect);// 使用双缓冲避免屏幕刷新时闪烁 CDC dcMem;// 内存dc CBitmap bmpMem; // 位图 dcMem.CreateCompatibleDC(NULL);// 创建兼容dc bmpMem.CreateCompatibleBitmap(&dc, rect.right-rect.left, rect.bottom-rect.top);//创建跟客户区域大小一样的(空)位图 // 把位图选到设备上下文环境中 CBitmap *pOld = dcMem.SelectObject(&bmpMem); // dcMem.FillSolidRect(&rect, RGB(255,255,255)); // 在此处将绘制内容全画到dcMem内存中,(即把之前使用CPaintDC绘制的dc换成dcMem即可)DrawTable(dcMem);//画棋盘 DrawChesses(dcMem); // 画棋子 //...... // 至此,内存中绘图完毕// 从内存拷贝到设备dc dc.BitBlt(0, 0, rect.right - rect.left, rect.bottom - rect.top, &dcMem, 0, 0, SRCCOPY);dc.SelectObject(pOld); // 释放资源 bmpMem.DeleteObject(); dcMem.DeleteDC(); } }PS:屏幕闪烁问题虽然得到解决了,但是窗口上的按钮却还会闪(可能是因为使用图片按钮的缘故才那么明显),当然这个我也是无法容忍的。默认情况窗口风格没有设置了WS_CLIPCHILDREN属性,所以父窗口刷新时子窗口也跟着刷新,于是产生按钮闪烁现象,于是我在游戏开始时给窗口加上WS_CLIPCHILDREN属性:ModifyStyle(0, WS_CLIPCHILDREN); 这样Invalidate 时按钮就不会闪烁了。如果窗口加上了WS_CLIPCHILDREN属性,当需要切换背景图片时,按钮因为没有刷新所以会被盖住,直到(鼠标移到按钮上)重绘时才会显示出来。解决方法:1)添加BOOL类型的成员变量bgroundChanged,初始化为FALSE;2)在切换背景图片前调用ModifyStyle(WS_CLIPCHILDREN, 0)去掉WS_CLIPCHILDREN属性,并把bgroundChanged设置为TRUE;3)在OnPaint中最后增加 if (TRUE == bgroundChanged) { bgroundChg = FALSE; ModifyStyle(0, WS_CLIPCHILDREN); }2023-06-25 15:40:461
如何解决在虚拟CListCtrl中选中多页数据的时速度慢的问题?
1.使用SetRedraw禁止窗口重绘,操作完成后,再恢复窗口重绘x0dx0am_ctlList.SetRedraw(FALSE); x0dx0a//以下为更新数据操作x0dx0a//??x0dx0a//恢复窗口重绘x0dx0am_ctlList.SetRedraw(TRUE);x0dx0a2.使用LockWindowUpdate禁止窗口重绘,操作完成后,用UnlockWindowUpdate恢复窗口重绘x0dx0am_ctlList.LockWindowUpdate(); x0dx0a//以下为更新数据操作x0dx0a//??x0dx0a//恢复窗口重绘x0dx0am_ctlList.UnlockWindowUpdate(); x0dx0a3.使用ListCtrl的内部双缓冲x0dx0am_ctlLisit.SetExtendedStyle(m_ctlLisit.GetExtendedStyle()|LVS_EX_DOUBLEBUFFER);x0dx0aVC6未定义LVS_EX_DOUBLEBUFFER宏,使用者可以自定义,如下:x0dx0a#define LVS_EX_DOUBLEBUFFER 0x00010000x0dx0a4.Virtual Listx0dx0a首先要设置ListCtrl风格为LVS_REPORT | LVS_OWNERDATA或在ListCtrl属里中的More Styles页面中选中Owner data复选框。x0dx0a其次要向应LVN_GETDISPINFO消息;x0dx0avoid OnGetdispinfoList(NMHDR* pNMHDR, LRESULT* pResult)x0dx0a{x0dx0a LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; x0dx0a LV_ITEM *pItem = &(pDispInfo)->item;x0dx0a char szText[128] = {0};x0dx0a if (pItem->mask & LVIF_TEXT)x0dx0a {x0dx0a//使缓冲区数据与表格子项对应x0dx0a//m_ArrayBuff为二维数组x0dx0a//定义如下 int m_ArrayBuff[2048][4];x0dx0a _stprintf(szText,_T("%d"),m_ArrayBuff[pItem->iItem][pItem->iSubItem]); x0dx0a pItem->pszText = szText; x0dx0a } x0dx0a *pResult = 0;x0dx0a}x0dx0a最后便是生成缓冲区数据x0dx0avoid Insertdata()x0dx0a{x0dx0a //删除之前的数据x0dx0a m_ctlList.SetItemCountEx(0);x0dx0a m_ctlList.Invalidate();x0dx0a m_ctlList.UpdateWindow();x0dx0a srand( (unsigned)time( NULL ));x0dx0a x0dx0a //生成新的数据缓冲区x0dx0a int nItemCount = 2048;x0dx0a for (int i = 0;i < nItemCount; i ++)x0dx0a {x0dx0a for (int k = 0;k < 4;k ++)x0dx0a {x0dx0a m_ArrayBuff[i][k] = rand()%2048 + 1;x0dx0a }x0dx0a }x0dx0a if (nItemCount < 2) x0dx0a m_ctlList.SetItemCountEx(1); x0dx0a elsex0dx0a m_ctlList.SetItemCountEx(nItemCount);x0dx0a m_ctlList.Invalidate();x0dx0a} x0dx0a若要修改数据,只要修改缓冲区m_ArrayBuff的数据即可以x0dx0a5.Custom Redrawx0dx0a既然是自绘,首先当然是重载CListCtrl类,并接管WM_ERASEBKGND消息,去掉默认的处理,改为不处理x0dx0aBOOL CListCtrlEx::OnEraseBkgnd(CDC* pDC)x0dx0a{x0dx0a//响应WM_ERASEBKGND消息 x0dx0a return false;x0dx0a //屏蔽默认处理x0dx0a //return CListCtrl::OnEraseBkgnd(pDC);x0dx0a}x0dx0avoid CListCtrlEx::OnPaint()x0dx0a{x0dx0a //响应WM_PAINT消息x0dx0a CPaintDC dc(this); // device context for paintingx0dx0a CRect rect;x0dx0a CRect headerRect;x0dx0a CDC MenDC;//内存ID表 x0dx0a CBitmap MemMap;x0dx0a GetClientRect(&rect); x0dx0a GetDlgItem(0)->GetWindowRect(&headerRect); x0dx0a MenDC.CreateCompatibleDC(&dc); x0dx0a MemMap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());x0dx0a MenDC.SelectObject(&MemMap);x0dx0a MenDC.FillSolidRect(&rect,RGB(228,236,243)); x0dx0a //这一句是调用默认的OnPaint(),把图形画在内存DC表上 x0dx0a DefWindowProc(WM_PAINT,(WPARAM)MenDC.m_hDC,(LPARAM)0); x0dx0a //输出 x0dx0a dc.BitBlt(0,headerRect.Height(),rect.Width(), rect.Height(),&MenDC,0, headerRect.Height(),SRCCOPY); x0dx0a MenDC.DeleteDC();x0dx0a MemMap.DeleteObject();x0dx0a}2023-06-25 15:40:531
MFC 大概有1000*512 的数据,实时绘制二维图。怎么能提高绘图速度,目前的方法感觉好慢?
直接访问内存地址, 下面是个简单的例子 CImage img; img.Create(300, 300, 32); HDC dc = img.GetDC(); CDC* pdc = CDC::FromHandle(dc);// pdc->FillSolidRect(0, 0, 300, 300, RGB(255, 255, 255)); byte* pdata; pdata = (byte*)img.GetBits(); //图片像素首地址 int pit = img.GetPitch(); //行长度 int bytesPerPixel = img.GetBPP() / 8; //每点长度 for (int x = 0; x < 300; x++) { for (int y = 0; y < 300; y++) { *(pdata + y*pit + x*bytesPerPixel+2) = 255; //像素点R分量设为255 // *(pdata + y*pit + x*bytesPerPixel+1) = 255; //G分量 // *(pdata + y*pit + x*bytesPerPixel+0) = 255; //B分量 } } img.Draw(GetDC()->m_hDC, 0, 0, 300, 300); ReleaseDC(pdc);//如果要使图片变暗, 每个分量均乘以0.72023-06-25 15:41:001
VC/MFC 请问如何把窗体刷回原来的颜色?
你用的是对话框应用程序吧,按你上面的方法会把对话框上的控件也用填充色覆盖掉。用下面的方法就不会了:1、定义一个成员变量 m_clrBK,用来保存当前对话框的背景颜色; 2、在OnInitDialog函数中添加如下的代码,初始化对话框的颜色为系统默认的颜色: m_clrBK = GetSysColor(COLOR_3DFACE); 3、在OnPaint函数的else分支中添加如下的代码,设置对话框的背景颜色: CRect rect; CPaintDC dc(this); GetClientRect(&rect); dc.FillSolidRect(&rect, m_clrBK); 4、在两个按钮的消息函数中分别这样写就行了: void CteclolDlg::OnBnClickedButton1() // 刷成绿色 { m_clrBK = RGB(0,255,0); Invalidate(); } void CteclolDlg::OnBnClickedButton2() // 还原颜色 { m_clrBK = GetSysColor(COLOR_3DFACE); Invalidate(); }2023-06-25 15:41:061
你好,我用的是VS2005,请问我要在静态文本框上画图怎么办?是要在对话框上的一个BUTTON按下之后显示出来
在按钮响应函数中:CDC *pDC = GetDC();//获取DC绘图指针CRect rt ;GetDlgItem(静态文本框ID)->GetWindowRect(rt);//获取绘图范围pDC->FillSolidRect(rt,RGB(255,255,255));//画底色//然后就是用pDC画了2023-06-25 15:41:131
vc++中如何清除GroupBox中所绘制的图
设置一个空白画刷,得到GroupBox的客户区,然后FillSolidRect很好奇怎么会有在GroupBox里绘图的想法...2023-06-25 15:41:201
如何更改MFC中单文档背景颜色
单文档会生产一个View类,在CXXXView类的OnDraw函数里面修改一下就好了我生成的View类是CTTTView,代码如下:void CTTTView::OnDraw(CDC* pDC){ CTTTDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CRect rect; GetClientRect(rect);//先得到客户区 pDC->FillSolidRect(rect, RGB(100, 255, 100));//然后填充这个区域,RGB里面就写你要的背景颜色}2023-06-25 15:41:401