为了实现设备无关性,应用程序的输出不直接面向显示器等物理设备,而是面向一个称之为设备环境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(); //获取控件DCHDC 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控件内移动,显示坐标等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)