MFC单文档多线程画图时,怎么得到CDC 和 HDC画图的句柄。 cdc*pdc = this->getdc错了,我该怎么用

MFC单文档多线程画图时,怎么得到CDC 和 HDC画图的句柄。 cdc*pdc = this->getdc错了,我该怎么用,第1张

这个做法不好,GDI并不是线程安全的,正确的做法是你不断更新内存中的一张位图,然后在正常的OnPaint里面,把内存中的位图复制到DC中。复制的时候你还要注意保证复制的同时,你的线程没有正好在更新这张位图。

位图的句柄等可以通过线程函数的参数(你这里是PARAM)来传递。

CreateThread或者AfxBeginThread均有一个参数,可以直接传递到你的线程函数的PARAM中。

方法如下:

//先获得原先的实例的句柄

HINSTANCE exe_hInstance = ::GetModuleHandle(NULL);

//获得要新dll的句柄

HINSTANCE dll_hInstance = ::GetModuleHandle(_T("PSDLibdll"));

//使用新句柄替换当前

AfxSetResourceHandle(dll_hInstance);

//处理完之后恢复

AfxSetResourceHandle(exe_hInstance);

所谓句柄实际上是一个数据,是一个Long (整长型)的数据。

句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。

从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。

如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的 *** 作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢

为了解决这个问题,Windows *** 作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。

句柄地址(稳定)→记载着对象在内存中的地址————→对象在内存中的地址(不稳定)→实际对象

本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行 *** 作。

但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入**院看**看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次**院售给我们的门票总是不同的一个座位是一样的道理。

一般有很多种方法在一个窗口中显示位图。最常用的几种如下:

将位图作为一个元素包含在窗口中,然后显示这个窗口。在保证上下文的相对位置不变,和始终是这个位图的情况下,这是最常用的一种办法。 将位图作为一个独立的资源,在程序的控制下,在规定的时间和位置将加载到窗口中。这种方式常常用于那些根据实际情况必须更换不同,以及制作慢速动画的场合。 使用Palm OS的作图功能,在必要的情况下,直接将像素写到屏幕上。这种方式适用于那些需要动态生成位图的场合。 直接 *** 作Video存储器。在需要制作高速,流畅的动画是,您将不得不使用这种方式。而且,这种方式能够实现诸如淡入淡出、融合之类的特效。但是必须注意到,要正确实现这种方式,难度比较大。尤其是当前的Palm显示技术变化得很快。像目前的Palm色彩位深度的升级换代几乎是每6个月一次。有可能到了明天,直接 *** 作Video存储器的技术会被Screen Resolution或是其它什么技术代替。

boolen DrawBitmap (int iResourceID){ VoidHand hResource;

 if ((hResource = DmGet1Resource(bitmapRsc, iResouceID)) != 0) {BitmapPtr pzBitmap = (BitmapPtr) MemHandleLock(hResource);

WinDrawBitmap(pzBitmap,x,y);

MenPtrUnlock(pzBitmap);

DmReleaseResource(hResource);

return(true); } else {file://找不到位图文件的错误陷阱

return(false); }}对于程序的说明:

首先调用DMGet1Resource()函数来获得一个资源的句柄。

然后调用MemHandleock()函数锁定位图资源的存储数据空间,返回指向该数据空间的位置指针。

然后调用WinDrawBitmap()函数来绘制位图,这里需要一个指向位图的指针。

然后用MemPtrUnlock()函数释放那个被指针锁定的位图的存储空间。 

以上就是关于MFC单文档多线程画图时,怎么得到CDC 和 HDC画图的句柄。 cdc*pdc = this->getdc错了,我该怎么用全部的内容,包括:MFC单文档多线程画图时,怎么得到CDC 和 HDC画图的句柄。 cdc*pdc = this->getdc错了,我该怎么用、Windows API编程怎么在dll中获取动态链接库的句柄、句柄怎么拿等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9863547.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存