VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

如何控制螢幕切換解析度??

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
kechange



註冊時間: 2004-12-16
文章: 81


第 1 樓

發表發表於: 星期二 十二月 28, 2004 9:14 am    文章主題: 如何控制螢幕切換解析度?? 引言回覆

我最近開發一個專案,客戶提出一個很機車的要求,他說我要進入我們的mis系統時,畫面自動切換為800*600..等他退出系統時,要自動切換回他原本設定的解析度例如1024*768等等.

我要如何取得.他原本的解析度??

以及我要如何切換到800*600的解析度?

以及程式結束後.我要如何切換回他原本的解析度?

我用搜尋找過了.好像沒有人POST這種文章?麻煩各位先進幫我一下!!感激不盡..
Very Happy
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
elleryq



註冊時間: 2007-06-21
文章: 768


第 2 樓

發表發表於: 星期二 十二月 28, 2004 9:55 am    文章主題: 引言回覆

跟他說.....做不到吧~~
=_=
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
朱育興



註冊時間: 2003-08-25
文章: 661
來自: 台中市大里區

第 3 樓

發表發表於: 星期二 十二月 28, 2004 11:12 am    文章主題: 引言回覆

那麼是不是你的客戶有用過什麼樣的應用軟體有這樣的功能,很好奇呢!
_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 4 樓

發表發表於: 星期二 十二月 28, 2004 12:19 pm    文章主題: 引言回覆

用GOOGLE找到的VB範例, 請參考看看.

http://66.102.7.104/search?q=cache:vq0GMhIrSSUJ:www2.ccw.com.cn/tips/2k03/030204_11.asp+800+600+1024+768+integer+msdn&hl=zh-TW
在VB中設置常用的外部設備
空軍導彈學院
劉建都
---- 本文首先說明了在VB中設置常用外圍設備的方法。然後給出了一個實際例子。

---- 1. 在VB中啟動控制面板來設置外部設備

---- 在VB中對外部設備進行設置的最簡單的方法是直接啟動Windows的控制面板,讓使用者直接使用控制面板來進行設置,不僅輕鬆,也不易出錯。雖然控制面板不是一個.exe文件,但通過VB提供的Shell語句可調出控制面板,具體的語句如下:

Shell 「rundll32.exe shell32.dll,
Control_RunDLL」,vbNormalFocus

---- 以上語句的作用就好像是按下「開始」菜單的「設置->控制面板」一樣,如果希望直接調出控制面板中的子功能設置窗口,則是要對上述的語句中加適當的修改,直接調出常用外部設備設置窗口的語句如下:
Shell 「rundll32.exe shell32.dll,Control_RunDLL
desk.cpl」,vbNormalFocus 『調出顯示器的設置窗口
Shell 「rundll32.exe shell32.dll,Control_RunDLL main.cpl」,
vbNormalFocus 『調出鼠標的設置窗口
Shell 「rundll32.exe shell32.dll,Control_RunDLL main.cpl @1」,
vbNormalFocus 『調出鍵盤的設置窗口
Shell 「rundll32.exe shell32.dll,Control_RunDLL main.cpl @2」,
vbNormalFocus 『調出打印機的設置窗口

---- 大家可能已經注意到,調出子功能設置窗口的命令是在調出控制面板主屏幕的命令中加了以.cpl為擴展名的文件及其參數,要使上述命令順利的執行,在機器的Windows\System的目錄下必須有desk.cpl和main.cpl這兩個文件;實際上,如果我們在資源管理器中雙擊這一類以為.cpl擴展名的文件,結果也可以執行該文件而顯示出控制面板的某一個子功能。
---- 如果您想知道您的機器中的某些.cpl文件是何用途,最簡單的方法就是執行它們。由於「鍵盤」和「打印機」等子功能都沒有對應的.cpl文件,它們均包含在main.cpl之中,若要調出它們須加入相應的參數,例如:調出鍵盤的設置窗口加入「@1」, 調出打印機的設置窗口加入「@2」等。當我們在VB中打開了控制面板主窗口或控制面板中子功能設置的窗口後,就可很方便對常用的外部設備進行設置,設置完成後,關閉打開的設置窗口,又會回到VB運行環境下,就可以進行其它的工作了。

---- 2. 直接利用程序來設置外部設備

---- 有時候我們不想調出控制面板,而想直接利用程序來設置常用的外部設備,此時最常用的方法是調用Windows API函數來完成常用外部設備的設置。

---- 2.1 調用SystemParametersInfo API函數來設置鍵盤、鼠標和顯示器

---- SystemParametersInfo API函數可用來設置系統的參數,讓我們首先看看這個函數的定義語句及參數的含義:

Declare Function SystemParametersInfo Lib "user32"
Alias "SystemParametersInfoA" (ByVal uAction As Long,
ByVal uParam As Long, ByVal lpvParam As Any, ByVal
fuWinIni As Long) As Long
其中:uAction—決定函數用途的參數,此參數的設置值有90種,
完整的設置值及每一種設置值的意義請查閱MSDN/CD
(以SystemParametersInfo為關鍵值進行查詢)。
uParam—此參數的用途取決於uAction參數
lpvParam—此參數的用途取決於uAction參數
fuWinIni—此參數一般設置為:SPIF_UPDATEINIFILE(值為1)
Or SPIF_SENDWININICHANGE(值為2),其意義為立即更新Win.ini
(或登錄數據庫)並且對其它窗口廣播(也就是通知所有執行中
的窗口,系統狀態已經有所改變)。
下面就分別說明用該函數來設置常用外部設備的方法。

---- 2.1.1 設置健盤的延時時間及重複速度
---- 要設置健盤的延時時間,參數uAction的值為:SPI_SETKEYBOARDDELAY(值為23);參數uParam的值的範圍從0(延時時間約250毫秒)到3(延時時間約1秒),並且與硬件有一定的關係,下例中設置該參數的值為0;參數lpvParam的值為:vbNullString ;參數fuWinIni的值如前所述;然後在VB中用下面的語句就可使健盤的延時時間變為約250毫秒。

SystemParametersInfo SPI_SETKEYBOARDDELAY, 0,
vbNullString,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
要設置健盤的重複速度,參數uAction的值為:

---- SPI_SETKEYBOARDSPEED(值為11);參數uParam的值的範圍從0(每秒重複約2.5次)到31(每秒重複約30次),下例中設置該參數的值為31;參數lpvParam的值為:vbNullString ;參數fuWinIni的值如前所述;然後在VB中用下面的語句就可使健盤的重複速度變為每秒重複約30次。
SystemParametersInfo SPI_SETKEYBOARDSPEED, 31,
vbNullString,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

---- 2.1.2 設置鼠標的雙擊時間及按鈕配置
---- 要設置鼠標的雙擊時間,參數uAction的值為:SPI_SETDOUBLECLICKTIME(值為23);參數uParam的值的範圍從100毫秒900毫秒,下例中設置該參數的值為900毫秒;參數lpvParam的值為:vbNullString ;參數fuWinIni的值如前所述;然後在VB中用下面的語句就可使鼠標的雙擊時間變為約900毫秒。

SystemParametersInfo SPI_SETDOUBLECLICKTIME, 900,
vbNullString,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

---- 要設置鼠標的按鈕配置,參數uAction的值為:SPI_SETMOUSEBUTTONSWAP(值為11);參數uParam的值的可為True(習慣用右手)或False(習慣用右手),下例中設置該參數的值為True(習慣用右手);參數lpvParam的值為:vbNullString ;參數fuWinIni的值如前所述;然後在VB中用下面的語句就可使鼠標的按鈕配置設置為習慣用右手。
SystemParametersInfo SPI_SETMOUSEBUTTONSWAP,
True,vbNullString,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

---- 2.1.3 設置屏幕保護程序的啟用狀態及等待時間
---- 要設置屏幕保護程序的啟用狀態,參數uAction的值為:SPI_SETSCREENSAVEACTIVE(值為23);參數uParam的值的可為True(啟用屏幕保護程序)或False(不啟用屏幕保護程序),下例中設置該參數的值為True(啟用屏幕保護程序);參數lpvParam的值為:0& ;參數fuWinIni的值如前所述;然後在VB中用下面的語句就可使屏幕保護程序的為啟用狀態。

SystemParametersInfo SPI_SETSCREENSAVEACTIVE,True,
0&, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

---- 要設置屏幕保護程序的等待時間,參數uAction的值為:
SPI_SETSCREENSAVEACTIVEOUT(值為23);參數uParam的值為屏幕保護程序的等待時間,單位為秒,下例中設置等待時間為240秒(4分鐘);參數lpvParam的值為:0& ;參數fuWinIni的值如前所述;然後在VB中用下面的語句就可使屏幕保護程序的等待時間變為約240秒(4分鐘)。
SystemParametersInfo SPI_SETSCREENSAVEACTIVEOUT,240,0&,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

---- 2.1 調用其它 API函數來設置打印機和顯示器
---- 2.2.1 設置系統的默認打印機

---- 要設置系統的默認打印機,我們首先必需知道系統安裝了哪些打印機驅動程序,利用VB所提供的Printers集合對象可列舉出系統已安裝的打印機,方法如下:

Dim i As Integer
For i = 0 To Printers.Count - 1
print Printers(i).DeviceName & ","
&Printers(i).DriverName & "," & Printers(i).Port
Next

---- 要把已安裝的某個打印機設置為系統的默認打印機,須在Win.ini中的[windows]節區中寫入」Device」Value,然後用通知當前的應用程序,使剛才的設置起作用。
---- 具體方法如下:

Device=打印機名稱,驅動程序名稱,輸出端口
SendMessage HWND_BROADCAST, WM_WININICHANGE,
32767&, ByVal "windows"

---- 2.2.2 設置屏幕的顏色數及分辨率
---- 要改變屏幕的顏色數(例如:16、256、65535)及分辨率(例如:640×480、800×600、1024×768),所要調用的API函數是:

Declare Function ChangeDisplaySettings Lib
"user32" Alias "ChangeDisplaySettingsA"
(lpDevMode As Any, ByVal dwflags As Long) As Long

---- 其中:第一個參數是一個用戶自定義的類型,含有與屏幕顏色及分辨率有關的項,將要設置的顏色及分辨率填入該數據結構的變量中,然後使用此參數傳入。
---- 第二個參數一般填入CDS_UPDATEREGISTRY(值為1),表示除了改變目前屏幕的設置值外,也改變登數據庫中屏幕的設置值。

---- 該函數的返回值若為0時,則表示成功;該函數的返回值若為1時,則表示必須重新啟動才能生效;該函數返回值若為其它值,則表示失敗。

---- 下面通過一個具體的例子來說明來把屏幕設置為(800×600)256色的方法。創建一個標準的EXE工程,給其添加一個一般模塊,給窗體添加一個命令按鈕(名稱為command1),並輸入下面的代碼:

『一般模塊中輸入下面的代碼
'定義要用到的常數、用戶自定義類型、API函數及變量
Public Const CCHFORMNAME = 32
Public Const CCHDEVICENAME = 32
Public Const DM_BITSPERPEL = &H40000
『表示要更改屏幕的顏色數
Public Const DM_PELSWIDTH = &H80000
『表示要更改屏幕的寬度
Public Const DM_PELSHEIGHT = &H100000
『表示要更改屏幕的高度
Public Const CDS_UPDATEREGISTRY = 1
『表示要更改屏幕的高度並修改登錄數據庫
Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
『填入自定義類型的大小
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
『2^ dmBitsPerPel =顏色數
dmPelsWidth As Long
『分辨率的寬
dmPelsHeight As Long
『分辨率的高
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
Declare Function ChangeDisplaySettings Lib
"user32" Alias "ChangeDisplaySettingsA"
(lpDevMode As Any, ByVal dwflags As Long) As Long

『窗體代碼項中的代碼:
Dim ret As Integer, devM As DEVMODE
Private Sub Command1_Click()
devM(List1.ListIndex).dmFields =
DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL
devM.dmSize = Len(devM) 『填入自定義類型的大小
devM. DmBitsPerPel=8 『2^ 8=256色
devM. dmPelsWidth =800 『屏幕的寬度為800
devM. dmPelsHeight =600 『屏幕的高度為600
『devM的其它項可以不填
Ret= ChangeDisplaySettings(devM, CDS_UPDATEREGISTRY)
If ret = 0 Then
MsgBox "設置成功,登錄數據庫也跟著更改了!"
Elseif ret=1 then
MsgBox "重開機方能生效!"
Else
MsgBox "設置失效!"
End If
End Sub

---- 運行該工程後,當用戶單擊命令按鈕上時,若你的顯示器支持(800×600)256色的設置,則會將顯示器設置為(800×600)256色,否則顯示提示信息。上述例子筆者用VB6在Windows 95下運行通過,讀者可不加修改的運行;另外要說明的是,除了上述例子外,文中所述的其它設置方法,筆者均用VB6在Windows 95下運行通過,由於篇幅有限,未給出全部代碼。

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
Mibh



註冊時間: 2004-02-21
文章: 19


第 5 樓

發表發表於: 星期三 十二月 29, 2004 1:22 am    文章主題: 引言回覆

1.偵測原本的解析度的方法
nScreenWidth = SysMetric(1)
nScreenHeight = SysMetric(2)

2.變更解析度的方法
Function ChangeRes
Lparameters tnWidth, tnHeight
Local lcDevMode
lnModeNum = 0
lcDevMode = REPLICATE(CHR(0), 156)
Declare INTEGER EnumDisplaySettings IN Win32API STRING lpszDeviceName,;
INTEGER iModeNum, STRING @lpDevMode
Declare INTEGER ChangeDisplaySettings IN Win32API STRING @lpDevMode ,;
INTEGER dwFlags
EnumDisplaySettings(NULL,-1, @lcDevMode)
lcDevMode = STUFF(lcDevMode, 109, 4, LongToStr(tnWidth))
lcDevMode = STUFF(lcDevMode, 113, 4, LongToStr(tnHeight))
ChangeDisplaySettings(@lcDevMode, 0)
Endfunc


Function LongToStr
Lparameters lnLongVal
Local lnCnt, lcRetStr
lcRetStr = ''
For lnCnt = 24 TO 0 STEP -8
lcRetStr = CHR(INT(lnLongVal/(2^lnCnt))) + lcRetStr
lnLongVal = MOD(lnLongVal, (2^lnCnt))
Next
Return lcRetStr
Endfunc

3.使用方法
3.1.先偵測原本的解析度,存入nScreenWidth 及nScreenHeight
3.2.假設解析度變更為1024*768→ChangeRes(1024,768)
3.3.解析度變更回來ChangeRes(nScreenWidth,nScreenHeight )

4.補充說明
4.1.此解析度變更非永久性變更,關機重開後會變回原設定
4.2.資料參考自:http://www.programacion.com/foros/33/msg/60492


Mibh 在 星期一 一月 10, 2005 7:15 pm 作了第 1 次修改
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 6 樓

發表發表於: 星期三 十二月 29, 2004 10:13 am    文章主題: 引言回覆

Mibh, 贊贊贊
_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
bigear



註冊時間: 2004-12-19
文章: 162
來自: 網路的另一端

第 7 樓

發表發表於: 星期五 十二月 31, 2004 2:49 pm    文章主題: 引言回覆

果然臥虎藏龍
我研究此功能已多月
卻一直無下文
非常感激

_________________
以上淺見,歡迎批評指教
________________________________________________
山不轉路轉,路不轉人轉,人不轉頭轉,頭不轉眼睛轉,眼睛不轉眼珠轉
眼珠再不轉就去睡覺,睡起來繼續轉
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站
ftcbds
訪客






第 8 樓

發表發表於: 星期六 一月 01, 2005 6:15 pm    文章主題: 引言回覆

好文,收藏。3Q
回頂端
小賴



註冊時間: 2004-12-27
文章: 470


第 9 樓

發表發表於: 星期一 一月 03, 2005 2:09 pm    文章主題: 引言回覆

Mibh, 測試結果真的 "不錯用", 謝了
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
kechange



註冊時間: 2004-12-16
文章: 81


第 10 樓

發表發表於: 星期二 一月 04, 2005 10:39 am    文章主題: 引言回覆

MIBH很感謝您....

小弟還有一個小小問題...
因為我原本的頻率設定為75...我用您的程式自動切換為800*600時.頻率都固定為60..會造成我的畫面會有偏差..

1.我要如何記憶系統原有的頻率..例如設定為75Mhz
2.我在切換為800*600時,如何將頻率設定為 75

不好意思.小弟問題有點多..有點煩...

承蒙您的回答.受用不盡.感激萬分..
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作