1. 程式人生 > >VC實現多屏顯示

VC實現多屏顯示

直接貼原始碼吧,vc2008除錯通過。只貼多屏顯示相關操作類。

h檔案如下:

/**********************************************

 Copyright(c) 歐博科技軟體部

 檔名稱:SquallMultiScreen.h  檔案描述:多屏顯示操作類  當前版本:1.0 v  作    者:Squall (朱一)  完成日期:2012-12-4

 說明:  1、此類只適用於單卡雙屏的控制(目前絕大多數A卡、N卡都是雙屏顯示卡);  2、雙屏顯示卡包括一個主屏,一個副屏;可配置不同解析度,可配置不同的位置關係;  3、該類通過推算虛擬屏與主屏的位置關係,查找出副屏的座標;

***********************************************/

#pragma once

class CSquallMultiScreen { private: CRect m_MainScreen;//主屏 CRect m_VirtualScreen;//虛擬屏(主屏和副屏的外接矩形)

public: CSquallMultiScreen(void); ~CSquallMultiScreen(void);

longGetScreenCount();//獲取螢幕數量

 CRect GetVirtualScreenRect(void);  //返回虛擬屏尺寸 CRectGetMainScreenRect

(void);//返回主屏尺寸 CRectGetSecondaryScreenRect(void);//返回副屏尺寸

 //顯示窗體(將窗體移動至主屏或副屏的某個位置) voidDisplayWindow( HWND hWnd,int x,int y, BOOL IsMainScreen= TRUE ); };

cpp檔案如下: 

#include"StdAfx.h" #include"SquallMultiScreen.h"

CSquallMultiScreen::CSquallMultiScreen(void) {  m_MainScreen.left =0;  m_MainScreen.top =0;  m_MainScreen

.right =::GetSystemMetrics(SM_CXSCREEN);  m_MainScreen.bottom =::GetSystemMetrics(SM_CYSCREEN);

 m_VirtualScreen.left =::GetSystemMetrics(SM_XVIRTUALSCREEN);  m_VirtualScreen.top =::GetSystemMetrics(SM_YVIRTUALSCREEN);  m_VirtualScreen.right = m_VirtualScreen.left +::GetSystemMetrics(SM_CXVIRTUALSCREEN);  m_VirtualScreen.bottom = m_VirtualScreen.top +::GetSystemMetrics(SM_CYVIRTUALSCREEN); }

CSquallMultiScreen::~CSquallMultiScreen() { }

longCSquallMultiScreen::GetScreenCount() { return::GetSystemMetrics(SM_CMONITORS); }

CRectCSquallMultiScreen::GetVirtualScreenRect(void) { return m_VirtualScreen; }

CRectCSquallMultiScreen::GetMainScreenRect(void) { return m_MainScreen; }

CRectCSquallMultiScreen::GetSecondaryScreenRect(void) { if(GetScreenCount()>1) { //用MainScreen和VirtualScreen的矩形中心點座標來比較。判斷8個方位的關係。

  CPoint mc = m_MainScreen.CenterPoint();  //MainCenter CPoint vc = m_VirtualScreen.CenterPoint();//VirtualCenter CPointTestPoint;

  ASSERT(!(vc.x == mc.x && vc.y == mc.y));

if( vc.x == mc.x && vc.y < mc.y )//正上 { TestPoint.SetPoint( vc.x, m_VirtualScreen.top ); }

if( vc.x > mc.x && vc.y < mc.y )//右上 { TestPoint.SetPoint( m_VirtualScreen.right, m_VirtualScreen.top ); }

if( vc.x > mc.x && vc.y == mc.y )//正右 { TestPoint.SetPoint( m_VirtualScreen.right, vc.y ); }

if( vc.x > mc.x && vc.y > mc.y )//右下 { TestPoint.SetPoint( m_VirtualScreen.right, m_VirtualScreen.bottom ); }

if( vc.x == mc.x && vc.y > mc.y )//正下 { TestPoint.SetPoint( vc.x, m_VirtualScreen.bottom ); }

if( vc.x < mc.x && vc.y > mc.y )//左下 { TestPoint.SetPoint( m_VirtualScreen.left, m_VirtualScreen.bottom ); }

if( vc.x < mc.x && vc.y == mc.y )//正左 { TestPoint.SetPoint( m_VirtualScreen.left, vc.y ); }

if( vc.x < mc.x && vc.y < mc.y )//左上 { TestPoint.SetPoint( m_VirtualScreen.left, m_VirtualScreen.top ); }   MONITORINFO mi;   memset(&mi,0,sizeof(MONITORINFO));   mi.cbSize =sizeof(MONITORINFO);

  HMONITOR hScreen =MonitorFromPoint(TestPoint, MONITOR_DEFAULTTONEAREST ); GetMonitorInfo( hScreen,&mi );   ASSERT( mi.dwFlags ==0);

returnCRect( mi.rcMonitor ); } else { returnCRect(0,0,0,0); } }

voidCSquallMultiScreen::DisplayWindow( HWND hWnd,int x,int y, BOOL IsMainScreen) {  ASSERT( hWnd );

long nLeft =0,nTop =0;

if(IsMainScreen) {   nLeft = x;   nTop = y; } else { if(GetScreenCount()>1) { CRectSecRect=GetSecondaryScreenRect();

   nLeft =SecRect.left + x;    nTop =SecRect.top + y; } else {    nLeft = x;    nTop = y; } }

::SetWindowPos( hWnd, NULL, nLeft, nTop, NULL, NULL, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOZORDER ); }

  以上是實現類。具體的使用非常簡單,如果顯示模態對話方塊,在對話方塊初始化函式中進行位置調整;如果顯示非模態對話方塊,在Create函式後調整位置。
2016-8-15 **********
  發現這篇日誌點選量非常大,考慮了一下,為了讓大家少走彎路,還是把最新的多屏顯示類發給大家。新版使用vs2013編譯通過。可適應任意多顯示卡、任意多螢幕。
h檔案如下:

/********************************************** Copyright(c) 歐博科技軟體部 檔名稱:SquallMultiScreen.h 檔案描述:多屏顯示操作類 當前版本:2.0 v 作 者:Squall (朱一) 完成日期:2014-6-4 說明: 1、此類只適用於任意多螢幕的控制,無論你有幾塊顯示卡,接了幾個螢幕。 2、每個螢幕可配置不同解析度,可配置不同的位置關係; ***********************************************/ #pragma once #include<vector> classCSquallMultiScreen { private: int m_ScreenCount;//螢幕數量 CRect m_MainScreen;//主屏 CRect m_VirtualScreen;//虛擬屏(所有螢幕的外接矩形) std::vector<CRect> m_vecSecondaryScreen;//副屏(可以有多個) static BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData); public: CSquallMultiScreen(void); ~CSquallMultiScreen(void); voidEnumMonitor(void);//列舉顯示螢幕 intGetScreenCount(void);//獲取螢幕數量 CRectGetVirtualScreenRect(void);//返回虛擬屏尺寸 CRectGetMainScreenRect(void);//返回主屏尺寸 //獲取螢幕位置。索引:主屏0,第一副屏1,第二副屏2 ... CRectGetScreenRect(int nScreenIndex); //顯示窗體在相應螢幕上。索引:主屏0,第一副屏1,第二副屏2 ... voidDisplayWindow(HWND hWnd,int nScreenIndex,int x,int y); };

cpp檔案如下:

#include"StdAfx.h" #include"SquallMultiScreen.h" #include<algorithm> CSquallMultiScreen::CSquallMultiScreen(void) { EnumMonitor(); } CSquallMultiScreen::~CSquallMultiScreen() { } voidCSquallMultiScreen::EnumMonitor(void) { m_MainScreen.left =0; m_MainScreen.top =0; m_MainScreen.right =::GetSystemMetrics(SM_CXSCREEN); m_MainScreen.bottom =::GetSystemMetrics(SM_CYSCREEN); m_VirtualScreen.left =::GetSystemMetrics(SM_XVIRTUALSCREEN); m_VirtualScreen.top =::GetSystemMetrics(SM_YVIRTUALSCREEN); m_VirtualScreen.right = m_VirtualScreen.left +::GetSystemMetrics(SM_CXVIRTUALSCREEN); m_VirtualScreen.bottom = m_VirtualScreen.top +::GetSystemMetrics(SM_CYVIRTUALSCREEN); m_ScreenCount =::GetSystemMetrics(SM_CMONITORS); m_vecSecondaryScreen.empty(); HDC hdc =::GetDC(NULL); EnumDisplayMonitors(hdc, NULL,CSquallMultiScreen::MonitorEnumProc,(LPARAM)this); ::ReleaseDC(NULL, hdc); //對多個副屏位置做排序 std::sort(m_vecSecondaryScreen.begin(), m_vecSecondaryScreen.end(),[](constCRect&rect1,constCRect&rect2){ if(rect1.left < rect2.left)returntrue; if(rect1.left == rect2.left && rect1.top <= rect2.top)returntrue; returnfalse; }); } BOOL CSquallMultiScreen::MonitorEnumProc( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ) { CSquallMultiScreen*pThis =(CSquallMultiScreen*)dwData; //主要功能是檢出副屏,主屏則忽略 if(!(lprcMonitor->left ==0&& lprcMonitor->top ==0)) { pThis->m_vecSecondaryScreen.push_back(*lprcMonitor); } return TRUE; }; intCSquallMultiScreen::GetScreenCount() { return m_ScreenCount; } CRectCSquallMultiScreen::GetVirtualScreenRect(void) { return m_VirtualScreen; } CRectCSquallMultiScreen::GetMainScreenRect(void) { return m_MainScreen; } CRectCSquallMultiScreen::GetScreenRect(int nScreenIndex ) { //當索引有錯誤,返回主屏 if(nScreenIndex >= m_ScreenCount || nScreenIndex ==0) return m_MainScreen; return m_vecSecondaryScreen[nScreenIndex -1]; } voidCSquallMultiScreen::DisplayWindow( HWND hWnd,int nScreenIndex,int x,int y ) { ASSERT( hWnd ); long nLeft =0,nTop =0; CRectScreenRect=GetScreenRect(nScreenIndex); nLeft =ScreenRect.left + x; nTop =ScreenRect.top + y; ::SetWindowPos( hWnd, NULL, nLeft, nTop, NULL, NULL

相關推薦

VC實現顯示

直接貼原始碼吧,vc2008除錯通過。只貼多屏顯示相關操作類。 h檔案如下: /********************************************** Copyright(c) 歐博科技軟體部 檔名稱:SquallMultiScreen.h  檔案

請大俠指教uiviewcontroller中添加了scrollview來實現顯示的的問題

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {     self = [super initWithNibName:nibNameOrNil bundle

Linux-SmartHome-QML-6-主視窗實現顯示

理想的我的程式的執行方式了,是就是在系統啟動的後第一個程式啟動,不進入系統自己的圖形介面,打個比方,就是Windows下的explorer.exe程式,所以,我的程式必須的全屏顯示,這裡實現全屏的方式有

ubuntu如何實現顯示

在ubuntu系統下使用xrandr實現雙螢幕顯示: 一.首先直接執行xrandr命令,檢視裝置的相關資訊: 執行之後會顯示當前連線裝置的螢幕資訊,如下圖,LVDS和VGA-0,而HDMI螢幕為dis

vue 實現顯示和全按鈕svg圖

1,第一步安裝screenfull  npm install --save screenfull 2, 新建screenfull.vue元件, <template> <div> <svg

微控制器採用RLE演算法實現液晶顯示圖片

由於需要用到液晶屏(320*240)顯示圖片,而且圖片的數量比較多(好幾百張),並且圖片要求儲存到16M的SPI FLASH裡面,顯然如果不處理 16M的FLASH明顯是放不下去。後來同事說可以用壓縮演算法RLE,並且用C#給我做了個小的軟體,壓縮圖片得到RLE壓縮後的資料

Androd開發常用:繼承AppCompatActivity實現顯示

<style name="NotitleTheme" parent="Theme.AppCompat.NoActionBar"> <item name="android:windowNoTitle">true</item> <

《virtualbox完全學習手冊》之 虛擬機器也玩顯示

在virtualbox中,我們可以模擬在工作中常用的“多螢幕顯示”功能,virtualbox最多支援8臺虛擬顯示器。一般情況下,我們的工作環境都是一臺主機箱配合一臺顯示器工作,可是一些做股票經濟或者圖形設計的朋友同時關注的資訊會比較多,所以一般都會採用在一臺主機箱的主機板內插入兩塊顯示卡控制至多4塊顯示器

嵌入式裝置基於Linux實現顯示

By Toradex 秦海 1). 簡介 對於一些嵌入式領域應用如醫療,汽車等,多屏顯示應用是需要的,因此本文就基於NXP iMX6 嵌入式ARM平臺來實現雙屏顯示應用。 本文所採用的測試平臺為來自Toradex的ARM 計算機模組平臺Colibri iMX6DL搭配其

android 擴充套件螢幕 顯示

Android現在可以讓您的應用在輔助顯示器上顯示不同的內容程式,以有線或Wi-Fi將外接顯示輸出連線到使用者裝置上,顯示獨特的內容。要為輔助顯示屏建立獨特的內容,您需要擴充套件Presentation類,並實現onCreate()回撥方法。在onCreate()中,呼叫setContentView()來指

VC++實現Console程式顯示彩色文字

  用vc++寫console程式時,整天對著黑紙白字的螢幕,感覺很鬱悶吧?很多人想用CONIO.H/GRAPHICS.H中的一些函式來實現,卻發現VC++根本沒有這些標頭檔案。當然了CONIO.H/GRAPHICS.H是BORLAND TC/BC專有的標頭檔案,所以vc++

iOS學習筆記20-通過AirServer使用AirPlay映象並實現螢幕顯示控制

AirPlay是iOS中一個很酷的功能,通過Wi-Fi連線支援AirPlay的裝置,然後使用映象功能就能在其他裝置顯示內容,播放聲音。有很多大型的遊戲都支援AirPlay,這樣比如連線電視時,那麼iPhone就完全變成了遊戲手柄,而電視顯示遊戲畫面。由於大部分的iOS使用者

debian xfce4顯示,附擴充套件顯示

OS是debian jessie, 桌面是xfce4, 公司多配了一臺顯示器. 想要擴充套件顯示. 在選單->通用->display裡面只能設定成共用一個panel. 非常不方便. 因為我的是thinkpad, 按Fn+F7可以選擇擴充套件方式. 只有三種, 以

VC 隱藏工作列,實現對話方塊的全顯示

這裡我選用實現對話方塊的全屏的方案是: 1 隱藏工作列 2 將對話方塊最大化顯示並且去掉標題欄 一  單獨隱藏工作列,很容易實現 缺陷:隱藏後任務欄所佔據的空間還是沒有騰出來 程式碼如下:HWND hWnd;hWnd = FindWindow("Shell_TrayWnd"

51單片機實現SMC1602液晶顯示實例

del 遍歷 思路 unsigned 初始化 移動 display -1 當前 ———————————————————————————————————————————— LCD1602 - - - - - - - - - - - - - - - - - - - - -

移動端頁面實現行文本溢出顯示省略號...

一個 bsp 獵豹 oid col spa 移動 clas 搜狗 手機瀏覽器種類: UC瀏覽器,QQ瀏覽器,歐朋瀏覽器,百度手機瀏覽器,360安全瀏覽器,谷歌瀏覽器,搜狗手機瀏覽器,獵豹瀏覽器,其他雜牌瀏覽器 國內的UC和QQ,百度等手機瀏覽器都是根據Webkit修改過來的

【轉】ViewPager 一顯示個子頁面

大小 col 進行 如果 detail margin urn class cli 一、概述 項目中遇到一個需求:ViewPager 一屏顯示多個子頁面。因為之前沒有做過這樣的界面,所以經歷了些許小插曲,特以記之! 主要內容來自: http://blog.csdn.net/J

ubuntu常用(任務欄底部_顯示)

mpi otto 參數 launch osi tin das 打開終端 position 任務欄底部,進入Dash並打開終端,命令最後一個是參數可選 ( Left | Bottom ) gsettings set com.canonical.Unity.Launche

ASP.NET 實現頁面合並一頁顯示

ssi 設置 form sdn 過程 使用 方式 顯示 用戶控件 目前業務有一個需求: 就是把多個網頁合並到一個頁面顯示, 在實現過程中我一般使用兩種方法: 利用母版頁設置導航欄, 定位到每個網頁; 利用用戶控件( .acsx 後綴的文件), 但是有個問題就是傳參比較麻煩

利用photoView實現可點選放大到全顯示的控制元件,效果類似於微信朋友圈點開看大圖

此控制元件繼承自ImageView,實現效果與微信朋友圈點開看大圖相似,點選控制元件後進入沉浸模式全屏顯示大圖,全屏時雙擊或手指拉伸可放大圖片,單擊會退出全屏 老規矩,先上控制元件實現程式碼: /** * 可點選放大全屏顯示的imageView * Created by Administ