如何将桌面放大,在显示器上只显示桌面的1/4 不是放大镜那样局部放大,而是整体放大,使显示器显示其中的一部分。有相关的文章或例子吗?谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个应该不太难吧,获得当前分辨率,按这个大小取桌面的DC1/4大小的区域HBITMAP,再创建个全屏的窗口,放个静态文本控件,其大小为分辨率的大小,最后把刚才那个HBITMAP放大到控件中显示就行了。楼主太懒^_^不过要是要求在放大状态下仍允许用户象普通桌面那样可以正常用鼠标、键盘操作的话倒是要费点脑筋。 花了一点时间,写了个工程,可以把桌面左上角1/4的区域放大到全屏显示。楼主感兴趣的话留下Email,我给你发过去。 1 先建个默认的对话框工程Zoom,在界面上添加一个按钮,在它的实现函数中加入如下代码:void CZoomDlg::OnZoom() { // TODO: Add your control notification handler code here CZoomWindow showDlg; showDlg.DoModal();}2 给工程新添加一个窗口,去掉它的两个按钮和窗口的“Title bar”风格,并把它的“Border”属性设为“None”,再在上面添加一个CStatic静态文本控件,随便给这个控件改个名,并为它绑定一个CStatic类型的变量:m_static。窗口和控件的大小无所谓,因为我们后面会用代码修改它们的大小。3 给刚才新建的窗口新建一个派生自CDialog的子类CZoomWindow(在界面中选中这个窗口后按下Ctrl+W键后系统就会提示你加的),并重载基类的虚函数OnInitDialog(),在函数中加入以下代码:BOOL CZoomWindow::OnInitDialog(){ CDialog::OnInitDialog(); //DWORD start=::GetTickCount(); //测一下我的电脑要花多久才能显示 //获得当前分辨率的大小 CRect rect(0,0,GetSystemMetrics(SM_CXFULLSCREEN),GetSystemMetrics(SM_CYFULLSCREEN)+GetSystemMetrics(SM_CYCAPTION)); HDC deskdc = ::GetDC(0); //获得桌面DC HDC hMemDC; //内存DC HBITMAP hBitmap,hOldBitmap; // 位图句柄 // 选定要放大的区域坐标,这里为左上角1/4大小 int nX=0, nY=0, nX2=rect.Width()/2, nY2=rect.Height()/2; //为指定DC创建兼容的内存DC hMemDC = CreateCompatibleDC(deskdc); // 创建一个与指定DC兼容的位图 hBitmap = CreateCompatibleBitmap(deskdc, rect.Width(), rect.Height()); // 把新位图选到内存DC中 hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把屏幕DC放大拷贝到内存DC中 StretchBlt(hMemDC,0,0,rect.Width(), rect.Height(),deskdc,nX,nY,nX2 - nX,nY2 - nY,SRCCOPY); //得到屏幕位图的句柄 hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); //清除并释放资源 DeleteDC(hMemDC); DeleteObject(hOldBitmap); ::ReleaseDC(0,deskdc); MoveWindow(rect); //把窗口全屏显示 m_static.MoveWindow(rect); //同时静态文本控件也全屏显示 m_static.ModifyStyle(0, SS_BITMAP); //改变静态文本控件的风格 m_static.SetBitmap(hBitmap); //显示屏幕位图 /* 下面这段是计算我的电脑(赛扬2G,256M的内存)的时间开销,结果比较慢,要用422~438ms,呵呵,你的呢? int time=::GetTickCount()-start; CString str; str.Format("%d",time); AfxMessageBox(str); */ return TRUE;}4 最后,别忘了在工程中ZoomDlg.cpp文件开头加上:#include "ZoomWindow.h" 鼠标移动的问题 MFC请教,关于GetMessage函数的返回值的问题。。 如何提高读入SEG-Y大数据文件的速度? 关于动态结构数组全局变量的问题 动态链接库的使用 子窗口中如何控制父窗口中的某个控件立即重绘? 如何把对话条中的按钮变成不可选的灰色状态?在等待!!! 还是ole的问题 能不能改变MessageBox的底色?? 各位大虾:谁有简单但完整的线程例子 谁有Xtreme早期代码? 帮忙分析_DllMainCRTStartup中的错误
不过要是要求在放大状态下仍允许用户象普通桌面那样可以正常用鼠标、键盘操作的话倒是要费点脑筋。
楼主感兴趣的话留下Email,我给你发过去。
{
// TODO: Add your control notification handler code here
CZoomWindow showDlg;
showDlg.DoModal();
}2 给工程新添加一个窗口,去掉它的两个按钮和窗口的“Title bar”风格,并把它的“Border”属性设为“None”,再在上面添加一个CStatic静态文本控件,随便给这个控件改个名,并为它绑定一个CStatic类型的变量:m_static。窗口和控件的大小无所谓,因为我们后面会用代码修改它们的大小。3 给刚才新建的窗口新建一个派生自CDialog的子类CZoomWindow(在界面中选中这个窗口后按下Ctrl+W键后系统就会提示你加的),并重载基类的虚函数OnInitDialog(),在函数中加入以下代码:BOOL CZoomWindow::OnInitDialog()
{
CDialog::OnInitDialog(); //DWORD start=::GetTickCount(); //测一下我的电脑要花多久才能显示 //获得当前分辨率的大小
CRect rect(0,0,GetSystemMetrics(SM_CXFULLSCREEN),GetSystemMetrics(SM_CYFULLSCREEN)+GetSystemMetrics(SM_CYCAPTION));
HDC deskdc = ::GetDC(0); //获得桌面DC
HDC hMemDC; //内存DC
HBITMAP hBitmap,hOldBitmap; // 位图句柄
// 选定要放大的区域坐标,这里为左上角1/4大小
int nX=0, nY=0, nX2=rect.Width()/2, nY2=rect.Height()/2;
//为指定DC创建兼容的内存DC
hMemDC = CreateCompatibleDC(deskdc);
// 创建一个与指定DC兼容的位图
hBitmap = CreateCompatibleBitmap(deskdc, rect.Width(), rect.Height());
// 把新位图选到内存DC中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕DC放大拷贝到内存DC中
StretchBlt(hMemDC,0,0,rect.Width(), rect.Height(),deskdc,nX,nY,nX2 - nX,nY2 - nY,SRCCOPY);
//得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
//清除并释放资源 DeleteDC(hMemDC);
DeleteObject(hOldBitmap);
::ReleaseDC(0,deskdc); MoveWindow(rect); //把窗口全屏显示
m_static.MoveWindow(rect); //同时静态文本控件也全屏显示
m_static.ModifyStyle(0, SS_BITMAP); //改变静态文本控件的风格
m_static.SetBitmap(hBitmap); //显示屏幕位图
/* 下面这段是计算我的电脑(赛扬2G,256M的内存)的时间开销,结果比较慢,要用422~438ms,呵呵,你的呢?
int time=::GetTickCount()-start;
CString str;
str.Format("%d",time);
AfxMessageBox(str);
*/
return TRUE;
}4 最后,别忘了在工程中ZoomDlg.cpp文件开头加上:#include "ZoomWindow.h"