ParsX.com
پذیرش پروژه از دانشجویی ... تا سازمانی 09376225339
 
   ProfileProfile   Log in to check your private messagesLog in to check your private messages  |  FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups Log inLog in   RegisterRegister 

تغییر Resolution صفحه نمایش

 
Post new topic   Reply to topic    ParsX.com Forum Index -> ويژوال بيسيك .NET
View previous topic :: View next topic  
Author Message
arash
مدير بخش سي
مدير بخش سي


Joined: 27 Nov 2004
Posts: 1232
Location: www.parsx.com

PostPosted: Sun Aug 20, 2006 2:05 am    Post subject: تغییر Resolution صفحه نمایش Reply with quote

من می خوام وقتی کسی پروژه من رو اجرا می کنه Resolution صفحه نمایش به حالت 600*800 در بیاد و وقتی برنامه بسته می شه Resolution صفحه دوباره به حالت اولیه برگرده

تنها چیزی هم که پیدا کردم این بود

برای پیدا کردن Resolution فعلی از این کد استفاده می شه:

 ResWidth = Screen.Width \ Screen.TwipsPerPixelX
ResHeight = Screen.Height \ Screen.TwipsPerPixelY
ScreenRes = ResWidth & "x" & ResHeight
MsgBox (ScreenRes)

حالا می خوام کاری کنم که بشه Resolution صفحه رو تغییر داد

برای این کار هم فقط همین رو گیر اوردم

Quote:

برنامه های دایرکت ایکس در دو حالت اجرا میشند:

1- حالت تمام صفحه (Full Screen Mode)

2- حالت پنجره ای (Windowed Mode)



برنامه ای که امروز میخوایم بنویسیم در حالت تمام صفحه اجرا می شه.



خوب دست به کار بشید. ویژوال بیسیک 6.0 رو اجرا کنید و یه پروژه جدید از نوع استاندارد ایجاد کنید.

برای این که بتونیم از توابع اشیای دایرکت ایکس استفاده کنیم باید کتابخانه (Type Library) اون رو به پروژه مون اضافه کنیم.

برای اینکار بر روی منوی Project کلیک کنید و گزینه References رو انتخاب کنید. تو دیالوگ باز شده و در لیست موجود دنبال DirectX 7.0 for Visual Basic Library Type بگردید و کنار اون یه تیک بذارید و بعدش روی OK کلیک کنید.



حالا برای اینکه ما بتونیم از دایرکت ایکس استفاده کنیم باید یک شیئ از نوع DirectX7 تعریف کنیم. پس در قسمت General فرمتون یک شیئ از این نوع تعریف کنید. اینجوری:



Dim DX As New DirectX7

اشیاء دیگری که تعریف خواهیم کرد اینها هستند:



1- یک شیئ از نوع DirectDraw7 :



این همون شیئی که به ما کمک میکنه که سطوح رو ایجاد کنیم:

Dim DD As DirectDraw7

2- 2 شیئ از نوع DirectDrawSurface7:

این اشیاء سطوحی هستند که ما شکل ها، متون و ... رو بر روی اونها نگارش می کنیم(تخته سیاه J)



Dim Primary As DirectDrawSurface7 ‘سطح اصلی

Dim Backbuffer As DirectDrawSurface7 ‘ پشت صحنه!



البته اگه نمیدونید که این اشیاء چی هستند، زیاد نگران نباشید چون بعدا حل میشه. یه متغیر عمومی از نوع Boolean هم تعریف می کنیم. این متغیر مشخص می کنه که تا چه زمانی برنامه باید اجرا بشه:

Dim EndPro As Boolean



حالا ادامه میدیم.

طریقه کار به این صورته که اول ما شیئ DD رو مقداردهی میکنیم. یعنی در حقیقت به DirectX7 میگیم که شیئ DD رو برای ما ایجاد کنه. پس در ادامه (همون Form_Load) بنویسید:

Set DD = DX.DirectDrawCreate ("")

حالا باید به شیئ DD که از نوع دایرکت دراو 7 هست بگیم که ما میخوایم از کدوم فرم برنامه مون استفاده کنیم. مثلا من فرض کردم که فرم اصلی برنامه ام Form1 هست. (البته شما میتونید از شیئ Me نیز استفاده کنید). همچنین باید به کامپیوتر بفهمونیم که میخوایم برنامه مون تمام صفحه باشه یا نه. برای اینکار از متد SetCooperativeLevel شیئ DD استفاده می کنیم:



DD.SetCooperativeLevel Form1.hWnd, DDSCL_FULLSCREEN Or DDSCL_EXCLUSIVE



حالا باید رزولوشن صفحه نمایش رو تغییر بدیم. فرض کنیم که سیستم شما از حالت 480×640 پشتیبانی می کنه. برای اینکار از متد SetDisplayMode شیئ DD استفاده می کنیم:

DD.SetDisplayMode 640, 480, 16, 0, DDSDM_DEFAULT

آرگومان اول عرض، آرگومان دوم Height و آرگومان سوم عمق بیت حالت رو نشون میده. (اون یکی ها هم ref و Mode هستند.)



حالا میخوایم سطوحمون رو مقداردهی کنیم. کدهای زیر رو به پروژه خود بیفزایید:



Dim ddsd As DDSURFACEDESC2

ddsd.lFlags = DDSD_BACKBUFFERCOUNT Or DDSD_CAPS

ddsd.lBackBufferCount = 1

ddsd.ddscaps.lCaps = DDSCAPS_COMPLEX Or DDSCAPS_FLIP Or DDSCAPS_PRIMARYSURFACE Or DDSCAPS_VIDEOMEMORY



حالا برای اینکه این درس زیاد طولانی نباشه و من هم یه کمی مطلب رو جمع و جورش کنم(برای بعد) توضیح این کدها رو میذارم برای بعد، همین قدر بدونید که برای اینکه بتونید یه سطح رو ایجاد کنید باید یه شیئ از نوع DDSURFACEDESC2 رو بهش وابسته کنیم.

حالا سطح اصلی (Primary) خودمون رو ایجاد کنیم. این سطح همون سطحی یه که جلوی چشم کاربر هستش و کاربر اونو میبینه. (اینکه چه جوری کامپایلر میفهمه که این همون سطح هست برمیگرده به خصوصیات شیئ ddsd از نوع DDSURFACEDESC که بالا مقداردهی کردیم و این شیئ مشخص میکنه که Primary تخته سیاه باشه). با استفاده از متد CreateSurface شیئ DD این سطح رو ایجاد می کنیم. آرگومان این تابع همون شیئ بالاییه) داریم:

Set Primary = DD.CreateSurface(ddsd)

حالا باید سطح BackBuffer رو مقداردهی کنیم. ولی شاید بپرسید ما که Primary رو داریم دیگه این BackBuffer برای چیه؟ باید بگم برای اینکه از پرپر زدن صفحه نمایش جلوگیری کنیم، ما بجای اینکه همه چیز رو مستقیما روی سطح Primary رسم کنیم، میایم و اول روی سطح (BackBuffer) که متصل به Primary هستش رسم می کنیم و صحنه آماده رو منتقل می کنیم به Primary (در حقیقت میتونیم بگیم که BackBuffer چرک نویس ما هست).

پس حالا ما سطح BackBuffer رو متصل به سطح Primary ایجاد می کنیم. داریم:

Dim ddscaps As DDSCAPS2

ddscaps.lCaps = DDSCAPS_BACKBUFFER Or DDSCAPS_VIDEOMEMORY

Set Backbuffer = Primary.GetAttachedSurface(ddscaps)



حالا تقریبا همه چی آماده ست.

در ضمن فکر میکنم همه با نوع داده RECT آشنایی داشته باشند (اگه کسی آشنایی نداره در قسمت نظرات بگه تا من اونو هم توضیح بدم). در دایرکت ایکس برای اینکه بخوایم یه قسمتی از صفحه رو مشخص کنیم از این نوع داده استفاده می کنیم. یه متغیر هم از این نوع تعریف می کنیم تا کل صفحه رو مشخص کنیم. (برای رنگ آمیزی کل سطح و ...) توجه داشته باشید که این نوع داده در کتابخانه DirectX موجود هست و شما نیازی ندارید که مثل برنامه های دیگه این نوع رو تعریف کنید :

Dim rec As RECT

rec.Bottom = 480

rec.Left = 0

rec.Right = 640

rec.Top = 0

اینو به یاد داشته باشید که ما در برنامه هایی که با دارکت ایکس می نویسیم. کل عملیات رو در قالب یه حلقه (معمولا حلقه Do) انجام میدیم. به این صورت که پشت سر هم به طور مداوم صحنه های خودمون رو بر روی سطح ترسیم می کنیم و به Primary منتقل می کنیم. پس در پروژه خویشتن ( و در همان Form_Load، یعنی ادامه کدهای قبلی) بنویسید:

Do While EndPro=False

Backbuffer.BltColorFill rec, 0 ‘پاک کردن صفحه

Backbuffer.SetForeColor RGB(256, 0, 0) ‘ تنظیم رنگ ترسیم

Backbuffer.DrawText 300, 250, “Hello World”, False ‘درج متن

DoEvents ‘توضیح در پایین

Primary.Flip Nothing, DDFLIP_WAIT ‘Jانتقال از چرک نویس به پاک نویس

Loop

حالا ببینیم که چیکار کردیم. تا زمانی که مقدار متغیر EndPro نادرست است این عملیات رو انجام میدیم:



· برای پاک کردن صفحه هر بار صفحه رو با رنگ سیاه پر میکنیم. متد BltColorFill سطح رو به روش بلیت پر میکنه. یعنی این که در حافظه مقادیر هر پیکسل رو برابر رنگی که بهش میدیم قرار میده(در اینجا این رنگ رو برابر 0 که همون سیاه هست قرار دادیم).

· با استفاده از متد SetForeColor رنگ تمام ترسیماتی که انجام میدیم رو عوض می کنیم.(به اصطلاح ForeColor سطح رو تغییر میدیم.)

· با استفاده از متد DrawText متن مورد نظرمون رو بر روی صفحه حک می کنیم. دو آرگومان اول مختصات x و y محل درج متن رو مشخص می کنند.

· مـــــــهـــــــم: وقتی ما پشت سر هم و بدون وقفه یه کاری رو انجام میدیم، برنامه دیگه چیز دیگه ای رو پردازش نمی کنه. بنابراین ما با این عبارت(DoEvents) به کامپایلر میگیم در هر بار انجام دستورات حلقه، دستورات دیگه ای مانند فشرده شدن کلید، کلیک ماوس و ... رو هم پردازش کنیم. اگه خیلی کنجکاو هستید، بعد از این که پروژه تون رو Save کردید یه بار برنامه رو بدون DoEvents اجرا کنید

· حالا صحنه ما آماده است پس اونو میذاریمش جلوی چشم کاربر. این کار با استفاده از متد Flip سطح Primary انجام میشه. (درمورد فلیپ بعدا اگه عمری باقی باشه توضیح میدم.)



هنگامی که متغیر EndPro مقدار Trueبگیره(هنگامی که کاربر قصد خروج دارد)، حلقه شکسته میشه و ما باید برنامه رو به پایان ببریم. پس حافظه ای که به سطوح و اشیاء دیگر اختصاص داده ایم رو آزاد میکنیم:

Set DD = Nothing

Set Primary = Nothing

Set Backbuffer = Nothing

Set DX = Nothing

End

در اینجا Form_Load به پایان میرسه. حالا فقط یه کار مونده. اون هم اینه کا وقتی کاربر کلید Esc رو فشار میده باید برنامه به پایان برسه، یعنی مقدار متغیر EndPro برابر True بشه. پس این خطوط کد رو به پروژه تون اضافه کنید:

Private Sub Form_KeyPress(KeyAscii As Integer)

If KeyAscii = 27 Then EndPro=True

End Sub

========================
منبع : http://vbgaming.blogfa.com/
خواهشمندم در صورتيكه مطلبي را از جايي مي آوريد حتما ذكر منبع بفرماييد - تشكر، وحيد .
Back to top
vahid
بي تو هرگز


Joined: 26 Nov 2004
Posts: 3067
Location: Tehran

PostPosted: Sun Aug 20, 2006 9:30 am    Post subject: Reply with quote


Option Explicit

Const EWX_FORCE = 4
Const CCDEVICENAME = 32
Const CCFORMNAME = 32
Const DM_BITSPERPEL = &H40000
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
Const CDS_UPDATEREGISTRY = &H1
Const CDS_TEST = &H2
Const CDS_FULLSCREEN = &H4
Const DISP_CHANGE_SUCCESSFUL = 0
Const DISP_CHANGE_RESTART = 1

Const HWND_BROADCAST = &HFFFF&
Const WM_DISPLAYCHANGE = &H7E&
Const SPI_SETNONCLIENTMETRICS = 42

Const DISPLAY_DEVICE_ATTACHED_TO_DESKTOP = &H1 'Device that is part of desktop
Const DISPLAY_PRIMARY_DEVICE = &H4 'Primary device

Private Type DISPLAY_DEVICE
    cb As Long
    DeviceName As String * CCDEVICENAME
    DeviceString As String * 128
    StateFlags As Integer
    DeviceID As String * 128
    DeviceKey As String * 128
End Type

Private Type SetResolution
    dmDeviceName As String * CCDEVICENAME
    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 * CCFORMNAME
    dmUnusedPadding As Integer
    dmBitsPerPel As Integer
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
    dmICMMethod As Long 'NT 4.0
    dmICMIntent As Long 'NT 4.0
    dmMediaType As Long 'NT 4.0
    dmDitherType As Long 'NT 4.0
    dmReserved1 As Long 'NT 4.0
    dmReserved2 As Long 'NT 4.0
    dmPanningWidth As Long 'Win2000
    dmPanningHeight As Long 'Win2000

End Type


Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean
Private Declare Function EnumDisplayDevices Lib "user32" Alias "EnumDisplayDevicesA" (ByVal Unused As Long, ByVal iDevNum As Long, lpDisplayDevice As DISPLAY_DEVICE, ByVal dwFlags As Long) As Long
Private Declare Function ChangeDisplaySettingsEx Lib "user32" Alias "ChangeDisplaySettingsExA" (ByVal lpszDeviceName As Any, lpDevMode As SetResolution, ByVal hwnd As Long, ByVal dwFlags As Long, ByVal lParam As Any) As Long

Private Sub ChRes(nWidth As Long, nHeight As Long)
    Dim scrResolution As SetResolution
    Dim DisplayDevice As DISPLAY_DEVICE
    Dim lResult As Long
    Dim nMonitor As Long
       
    lResult = 1
    Do While lResult <> 0
       DisplayDevice.cb = Len(DisplayDevice)
       scrResolution.dmSize = Len(scrResolution)
       lResult = EnumDisplayDevices(ByVal 0&, nMonitor, DisplayDevice, ByVal 0&)
       If DisplayDevice.StateFlags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP Or _
          DisplayDevice.StateFlags = DISPLAY_PRIMARY_DEVICE Or _
          DisplayDevice.StateFlags = (DISPLAY_DEVICE_ATTACHED_TO_DESKTOP Or DISPLAY_PRIMARY_DEVICE) Then 'is it part of the desktop device or is it primary adapter or both
          With scrResolution
             .dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT 'Or DM_BITSPERPEL
             'Here's the resolution
             .dmPelsWidth = nWidth
             .dmPelsHeight = nHeight
          End With
          If ChangeDisplaySettingsEx(ByVal DisplayDevice.DeviceName, scrResolution, ByVal 0&, CDS_FULLSCREEN, ByVal 0&) = -1 Then
             MsgBox "Mode not supported on " & DisplayDevice.DeviceString, vbSystemModal, "Error"
          End If
       End If
       nMonitor = nMonitor + 1
       
    Loop
End Sub


Private Sub Form_Load()
    ChRes 800, 600
End Sub

Private Sub Form_unLoad(cancel As Integer)
    ChRes 1024, 768
End Sub
Back to top
alpha_gr
مهمون يكي دو روزه


Joined: 11 Apr 2007
Posts: 12

PostPosted: Wed Apr 11, 2007 4:08 pm    Post subject: Using OCX Reply with quote

اين همه برنامه كه شما مينويسيد اضافيه فقط كافيه از يك OCX استفاده كنيد خودش همه كار هارو انجام ميده http://3d2f.com/tags/form/ocx/visual/basic/
Back to top
vahid
بي تو هرگز


Joined: 26 Nov 2004
Posts: 3067
Location: Tehran

PostPosted: Wed Apr 11, 2007 9:47 pm    Post subject: Reply with quote

سلام . مرصي . آزمايشش مي كنم .
Back to top
Display posts from previous:   
Post new topic   Reply to topic    ParsX.com Forum Index -> ويژوال بيسيك .NET All times are GMT + 3.5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum