在Windows环境下如何单独设置多显示器的分辨率和刷新频率
在Windows环境下如何单独设置多显示器
的分辨率和刷新频率
义通知消息NM_NOTIFYICON的处理.代码如下:
//托盘数据的初始化
nid.cbSize=sizeof(NOTIFYICONDATA)
nid.hWnd=m_hWnd;
nid.uFlags=NIF』v1ESSAGEINIF/CONINIFJfP
nid.uCallbackMessage=NMOTIFYICON;//自定义消息
CStringstrTip;
strTip=J(浮动窗口):
_
tcscpy(nid.szTip.strTip):
nid.uID=IDRMAINFRAME:
HICONhlcon:
hlcon=AfxGetApp()一>Loadlcon(IDR_MAINFRAME):
//载入图标
nid.hlcon;hlcon;
//添加托盘图标
::Shell_Notifylcon(NIMDD,&nid):
在程序退出的时候还有删除托盘图标.
//退出,删除托盘图标
::Shell_NotifyIcon(NIM—DELETE,&nid):
CDialog::OnOK():
NM_
NOTIFYICON消息的处理函数为:
caseNMNOTIFYICON:
//托盘的左键双击
if(IParam==WM_LBUTTONDBLCLK)
{
//显示或隐藏主窗口
OnShow():
)
//托盘的右键
elseif(IParam==WMRBUTTONUP)
{
//弹出右键菜单
CMenum_Right,
m_Right.LoadMenu(IDR_MENU1)
CMenupSub=mRight.GetSubMenu(0):
CPointptCursor;
GetCursorPos(&ptCursor):
pSub一>TrackPopupMenu(TPMLEFTALIGN,ptCur—
sor.X,ptCursor.Y,
this,NULL):
}
break;
窗LI的隐藏显示,对话框问的通信,滑块控件的使用,非
模态对话的创建等基本的MFC知识就不再在这里重复r,本
程序在WindowsXPSP2和VisualC++6.0Debug下调试成功.
(作者:武冬生)
在Wid.环境下如何单独设置多显示器的分辨率和
刷新频率
.在一些大型的监控应用系统I}1,经常需要在一台主机
上接有多个屏幕显示器,以便能够显示更多的信息,在Win—
dows2000系列操作系统中,一一个单机系统町以支持接人多个
显示器,每个显示器可以设置不同的分辨率和刷新频率,可以
显示小同的窗口内容.扩大了系统一次性提交给用户的信息内
容.操作系统的这个新特性是很吸引人的,而且满足了许多高
端应用领域的
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
,如控制领域的双屏用户界面.从而在很多
方面得到了应用.下面谈谈如何在程序I}】动态地更改显示器的
分辨率和刷新频率.
首先,获得当前操作系统实际所接人的显示器设备的个数
和其他相关信息.使用操作系统提供的Win32系统函数
EnumDisplayDevices,可以获得当前系统中所接的所有显示设备
的信息.该函数的声明原型如下:
BOOLEnumDisplayDevices(
PVOIDUnused,/没有使用,必须是NULL/
/指定一个显示设备的索引序号,操作系统使用一个索引值
来表示一个显示设备/
DWORDiDevNum,
/指向一结构的指针,系统使用该结构来存放先是设备的
信息/
PDISPLAY—pEVICEIpDispIayDevice,
DWORDdwFlags//没有使用,为零.
):
其中参数DISPLAY_I)EVICE结构的定义如下:
typedefstructISPLAY_DEVICE{
DWORDcb;/结构的大小,必须在函数调用之前初始化
/
WCHARDeviceNamel32】:/表示设备的名字,也是我们
以后需要的数据/
WCHARDeviceStringl128】:/设备描述/
DWORDStateFlags;/保留./
}DISPLAY_EVICE,PDISPLAY_EVICELPDIS
PLAY_
DEVlCE;
这里注意的是,尽管该函数在winuser.h的头文件【11有声
叫,但是小知何故,该函数在VC6的USER32的Lib库中却
没有引出,正常编译通过后,连接阶段将出现下面的连接错
洪:
Linking...
Res.obi:errorLNK2001:unresolvedexternalsymbol
_.jmp_EnumDisplayDevicesA@16
c:\debug\mscrn/Res.exe:fatalerrorLNK1120:1unre—
solvedexternals
Errorexecutinglink.exe.
_醣20
巧
08
与
~
摹
4
妒
‘9~
,一
,
…’……,,……………………………”
实用第一智慧密集
……,…………………
这样,我们只能从USER32DLL中动态加载获得该函数
的方法来调用该函数,实现的核心代码如下:
//定义函数类型
typedefBOOL(WINAPIENUMDISPLAYDEVICESA)
(PVOIDUnused,DWORDiDevNum,PDISPLAY_DEVICEA
IpDisp!ayDevice,DWORDdwFlags):
HMODULEhD?=LoadLibrary(User32DLL):
ENUMDISPLAYDEVICESApEnumDisplayDevicesA;
//获得函数的地址入口指针
pEnumDisplayDevicesA=(ENUMDISPLAYDEVICESA)GetP-
rocAddress(hDII.EnumDisplayDevicesA):
//要获得系统中所接的显示器的相关信息的代码.
unsignedintiCrtNum=O:
//系统的显示器索引值从0开始,
BOOLbFuncRet=TRUE:
DISPLAY_
DEVICECrtDevInfO:
While(bFuncRet){
CrtDevlnfo.cb=sizeof(DISPLAYEVICE):
/如果返回值为FALSE,表示系统中没有该索弓l值的显示设
备.也意味着系统所接的显示器个数为iCrtNum/
BFuncRet=pEnumDisplayDevicesA(NULL.iCrt—
Num,&CrtDevlnfo,0):
/$CrtDevInfo.DeviceName,就是我们以后使用的设
备名字/
…
//其他代码
iCrtNum++:
}:
然后,获得每个显示器可以支持的各种分辨率.使用
EnumDisplaySettings()Win32系统调用可以获得某个显示器所
能够支持的分辨率.该Win32函数的原型如下:
BOOLEnumDisplaySettings(
LPCTSTRIpszDeviceName,
/指定上面我们所获得的显示器的设备名字
DWORDiModeNumI,//指定图形模式
LPDEVMODEIpDevMode
//指向结构的指针,系统用该结构存
//放检索的信息
):
//要获得系统中所接每个显示器可以支持分辨率的相关信
//息的代码.
intiMode=0:
DEVMODEdm:
while(EnumDIspIaySett;ngs{szDevName,iMode,&dm))
{
/dm中含有我们所要的信息,其中
dm.dmBitsPerPel,//每像素的颜色的位数.表示可显示的
与
//颜色的种类
dmdmPeIsWidth,//屏幕的宽度,以像素为单位
dm.dmPelsHeight//屏幕的高度,以像素为单位
dmdmDIspIayFrequency//屏幕的刷新频率,可以在显
示设备硬件所能承受的范围内进行设置,要小心设置,以免
损坏显示设备.$/
++iMode;
}
最后,设置想要达到的同时显示器也能够达到的分辨率和
刷新频率.使用的函数原型如下:
LONGChangeDIspIaySettIngsEx(
LPCSTRIpszDeviceName,//显示设备的名字.
LPDEVMODEIpDevMode.
//结构指针,存放将要设置的显示器信息.
NDhwnd,//必须为NULL. HW
DWORDdwflags//设置的模式标志.
LPVOIDIParam//必须为NULL.
):
实现的核心代码如下:
DEVM0DEdm;
DEVMODEpdm=&dm;
ZeroMemory(pdm,sizeof(DEVMODE)):
pdm—xImSize;sizeof(DEVMODE):
pdm—xImBitsPerPel;BitsPerPixel;
//颜色的位数,16表示65535种颜色.
pdm—xImFieldsl=DM_BITSPERPEL;
pdm一>dmPelsWidth=Width;//屏幕的像素宽度.
pdm一>clmFieldsI_DM_PELSWIDTH;
pdm一>dmPelsHeight=Height;//屏幕的像素高度.
pdm一>clmFieldsI=DMPELSHEIGHT;
pdm一>dmDpIayFrequency=Frequency;
//屏幕的刷新频率.
pdm一>clmFieIdsI=DMISPLAYFREQUENCY;
LONGIChgDispRet;
ChangeDisplaySettingsEx(szDevName,pdmNULL,
CDSPDATEREGISTRY,NULL):
/$如果函数返回值==DISPHANGE_SUCCESSFUL,表
示设置成功;=DISP_CHANGE_RESTART表示设置需要重新
启动才能有效其他值意味着设置失败.设置显示设备属性
时,为了更安全的目的,可以事先先测试一下,测试所要求
的模式是否能够成功设置:/
ChangeDisplaySettings(szDevName,pdm.NULL,
CDSJEST,NULL):
这样就可以随时设置显示器的模式了.
(作者:仲光亮)