CDC *pDC=GetDC();具体是什么意思

CDC *pDC=GetDC();具体是什么意思,第1张

为了实现设备无关性,应用程序的输出不直接面向显示器等物理设备,而是面向一个称之为设备环境DC(Device

Context)的虚拟逻辑设备。

设备环境也称设备描述表或设备上下文,它是由Windows管理的一个数据结构,它保存了绘图 *** 作中一些共同需要设置的信息,如当前的画笔、画刷、字体和位图等图形对象及其属性,以及颜色和背景等影响图形输出的绘图模式。

CDC定义的是设备上下文对象的类,

是微软封装出来的一个类,在MFC中属于非常重要的一个类。

CDC

pDC=GetDC();就是获取当前窗口的类对象指针,以便进行下一步的编程(如画图,贴画等)。

GetDC()的返回值是CDC 也就是说是一个指向CDC类的指针 CDC类的对象它是MFC内部为我们动态构建的, 储存的地方也就是指针指向的地方, 但是具体是在代码的哪个部分生成的, 这点我们不得而知 不过需要注意的一件事情是, 用GetDC()获取的CDC对象, 必须用ReleaseDC()将其释放 如:ReleaseDC(GetDC());

至于获得CDC指针的用处有什么, 那么在这里是不可能一言而尽了 所以GUI函数都在它里面 因此只能是用到哪里, 学到哪里, 不可能全部学会

GetCursorPos获取的是屏幕坐标,GetClientRect是窗口坐标,两个坐标系不匹配,PtInRect结果当然错误。

你这个程序的正确做法:

PtInRect判断应该放在函数首部,如果这个判断返值为FALSE,那么后面的坐标计算根本没有必要,效率提升不说,还避免了坐标系映射之类的可能产生的影响。

在OnMouseMove里面,GetCursorPos没用并且会降低效率。判断坐标应该使用函数参数来进行即可。

遇到坐标系不同的情况,可以使用ScreenToClient/ClientToScreen函数对,将坐标转换为相同的坐标系,再进行运算和判断。

jpg显示的步骤:

1。打开控件的绘图DC。

2。使用OleLoadPicture函数读取jpg图像到内存中。(导入olepro32dll)

3。向DC上绘制图像

示例如下:

CDC pDC = GetDlgItem(IDC_STATIC_IMG)->GetDC(); //获取控件DC

HDC hDC = (HDC)pDC;

HANDLE hFile=CreateFile(szImagePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);//从指定的路径szImagePath中读取文件句柄

DWORD dwFileSize=GetFileSize(hFile, NULL); //获得文件的大小,用来分配全局内存

HGLOBAL hImageMemory=GlobalAlloc(GMEM_MOVEABLE, dwFileSize); //给分配全局内存

void pImageMemory=GlobalLock(hImageMemory); //锁定内存

DWORD dwReadedSize; //保存实际读取的文件大小

ReadFile(hFile, pImageMemory, dwFileSize, &dwReadedSize, NULL); //读取到全局内存当中

GlobalUnlock(hImageMemory); //解锁内存

CloseHandle(hFile); //关闭文件句柄

IStream pIStream;//创建一个IStream接口指针,用来保存流

IPicture pIPicture;//创建一个IPicture接口指针,表示对象

CreateStreamOnHGlobal(hImageMemory, false, &pIStream); //用全局内存初使化IStream接口指针

OleLoadPicture(pIStream, 0, false, IID_IPicture, (LPVOID)&(pIPicture));//用OleLoadPicture获得IPicture接口指针

//得到IPicture COM接口对象后,你就可以进行获得信息、显示等 *** 作

OLE_XSIZE_HIMETRIC hmWidth;

OLE_YSIZE_HIMETRIC hmHeight;

pIPicture->get_Width(&hmWidth); //用接口方法获得的宽和高

pIPicture->get_Height(&hmHeight);

pIPicture->Render(hDC,0,0,100,100,0,hmHeight,hmWidth,-hmHeight,NULL); //在指定的DC上绘出

GlobalFree(hImageMemory); //释放全局内存

pIStream->Release(); //释放pIStream

pIPicture->Release(); //释放pIPicture

ReleaseDC(pDC);

VOID Draw( CWnd pWnd, TYPF typf )

{

CClientDC dc(pWnd);

switch( typfDrawType )

{

case //这里判断是画什么,我个人觉得你参数应该是个结构,其中包含需要绘制的类型,坐标和颜色等信息,利用CDC来绘图就可以了

}

}

先获取dc。然后用textout就可以了

//得到dc

m_show是你的控件变量

CDC pDC1 = m_showGetDC();

// pDC1->SelectObject(&Font1);

// pDC1->SetTextColor(RGB(255,255,255));

//pDC1->SetTextAlign(TA_CENTER);

//pDC1->SetBkColor(RGB(0,0,0));

pDC1->TextOut(0,0,"写字");

以上就是关于CDC *pDC=GetDC();具体是什么意思全部的内容,包括:CDC *pDC=GetDC();具体是什么意思、C++:CWnd下GetDC()函数,获取了什么存在哪里、MFC中,鼠标在picture control控件内移动,显示坐标等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9519430.html

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

发表评论

登录后才能评论

评论列表(0条)

保存