الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Win32

مغلقرائج
بدأه خليل أونيس في 12 أبريل 2005 · 59 رد · 6,690 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أردت أن نناقش مبادىء Win32 من جميع النواحي و لنبدأ :

أولا هذا أبسط مثال لل Win32 :

#include <windows.h>

LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam );

char szProgName[] = "Hello Win32"; /* إسم البرنامج */
                                        
int WINAPI WinMain(HINSTANCE  hInst,
       HINSTANCE  hPreInst, 
       LPSTR 	 lpszCmdLine, 
       int    nCmdShow )
{
     HWND hWnd;
     MSG lpMsg;
     WNDCLASS wc;

     if( !hPreInst )
     {
          wc.lpszClassName = szProgName;
          wc.hInstance = hInst;
          wc.lpfnWndProc = WndProc;
          wc.hCursor = LoadCursor( NULL, IDC_ARROW );
          wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
          wc.lpszMenuName = NULL;
          wc.hbrBackground = (HBRUSH)
               GetStockObject( WHITE_BRUSH );
          wc.style = 0;
          wc.cbClsExtra = 0;
          wc.cbWndExtra = 0;
          if( !RegisterClass( &wc ) )
               return FALSE;
     }
hWnd = CreateWindow(/* إنشاء النافذة */
          szProgName,
          "Simple Win32",
          WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT,
          CW_USEDEFAULT,
          CW_USEDEFAULT,
          CW_USEDEFAULT,
          (HWND)NULL,
          (HMENU)NULL,
          (HINSTANCE)hInst,
          (LPSTR)NULL
     );

     ShowWindow(hWnd, nCmdShow );
     UpdateWindow( hWnd );
     
     /* بداية حلقة الراسأل */
     while( GetMessage( &lpMsg, NULL, 0, 0 ) )
     {
          TranslateMessage( &lpMsg );
          DispatchMessage( &lpMsg );
     }
     return( lpMsg.wParam);
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT messg,WPARAM wParam, LPARAM lParam )
{
     switch(messg)
     {
  case WM_DESTROY:
   PostQuitMessage( 0 );
   break;
  
  default:
   return( DefWindowProc( hWnd, messg, wParam, lParam ) );
     }
     return( 0L );
}

نبدأ بي

wc.hCursor = LoadCursor( NULL, IDC_ARROW );

مع جميع إحتمالاتها و هي :

IDC_ARROW = مأشر عادي
IDC_APPSTARTING = مأشر عادي مع مأشر الوقت الزجاجي أي hour glass
IDC_CROSS = مأشر على شكل علامة زائد كبيرة
IDC_IBEAM = مأشر النص
IDC_NO = مأشر دائري
IDC_SIZEALL = مأشر التحريك و هو عبارة عن أربع أسهم كل منه في إتجاه
IDC_SIZENESW = مأشر ذو سهمين متجهين من الشمال الشرقي إلى الجنوب الغربي و هو لتحكم في حجم النافذة
IDC_SIZENWSE = و هو أيظا مأشف ذو سهمين فقط هو عكس IDC_SIZENESW في الإتجاه
IDC_SIZENS = مأشر ذو سهمين متجهين من الأعلى إلى الأسفل ...
IDCSIZEWE = وهو عكس IDC_SIZENS 
IDC_UPARROW = مأشر من سهم واحد متجه إلى الأعلى
IDC_WAIT = مأشر الإنتظار

ثانيا :

wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );

و هي :

IDI_APPLICATION = وهي الإيقونية الإفتراضية
IDI_ASTERISK = إيقونة النجمة
IDI_EXCLAMATION = إيقونة التعجب
IDI_HAND = إيقونة اليد
IDI_QUESTION = إيقونة الأسألة
IDI_WINLOGO = هي كما IDI_APPLICATION

ثالثا :

wc.hbrBackground = (HBRUSH)
               GetStockObject( WHITE_BRUSH );

به الكثير من الأمثلة حيث يمكن إستعمالها بقريقة أخرى و هي الأفظل :

wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+0);

حيث يمكنك التغير في القيمة صفر إلى أقصى حد وهو 25 و كل رقم و لونه الخاص به

و هذه في حالة إستعملنها المثال الأول :

BLACK_BRUSH = لون أسود
WHITE_BRUSH = لون أبيض
GRAY_BRUSH = لون رمادي
LTGRAY_BRUSH =  رمادي مضيء صلب
DKGRAY_BRUSH = رمادي مضلم صلب
NULL_BRUSH = لا لون 
...

رابعا :

wc.style = 0;

و هي :

CS_HREDRAW = إعاد سحب النافذة الكاملة إذا حركة أوالتعديل في حجم عرض النافذة
CS_VREDRAW = إعاد سحب النافذة الكاملة إذا حركة أوالتعديل في حجم طول النافذة
CS_OWNDC = يجعل النافذة أكثر نسبا
CS_DBLCLKS = النقر المزدوج
CS_NOCLOSE = لا يستطيع المستخدم الخروج بإستخدام Alt+F4
...

أتوقف هنا مأقتا و أنتظر باقي الأعضاء في الزيادة على الموضوع و النقاش فيه جدا

و في المرة القادمة سندخل في الألعاب و لكن فقط البداية و بعدها نتعمق أكثر

و شكرا

#2

تعجبني يا فنان..

اذا كنت فقط تريد النقاش حول API فمكان الموضوع منتدى السي .. اما اذا اردت ان تكمل في برمجة الالعاب فهذا مكانه.. ووقته .

ساضيف بعد يومين ان شاء الله.. بعد الاختبارات ')

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

مشكور أخي الشـمري على المشاركة و إن شاء الله بعد يوم أو يومين ندخل في برمجة الألعاب

الآن نكمل :

- نعود إلى :

wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );

:

IDI_ERROR = إيقونة في حالة الخطأ
IDI_INFORMATION =  أيقونة معلومات
IDI_WARNING = إيقونة التحذير
IDI_QUESTION =  أيقونة سؤال

و نعود أيظا إلى :

wc.hCursor = LoadCursor( NULL, IDC_ARROW );

:

IDC_HELP = سهم و علامة استفهام
...

و لآن نذهب إلى Window Styles :

WS_OVERLAPPEDWINDOW

:

WS_CHILDWINDOW = نافذة صغيرة
WS_HSCROLL = نافذة مع scroll bar
WS_OVERLAPPEDWINDOW = نافذة مع عناصر النافذة العادية
WS_POPUP = نافذة PopUp
WS_VISIBLE =  نافذة مبدئيا مرئي
WS_VSCROLL = نافذة مع  scroll bar عمودي

نذهب إلى :

CW_USEDEFAULT,
         CW_USEDEFAULT,
         CW_USEDEFAULT,
         CW_USEDEFAULT,

حيث السطرين الأوليان هما لتحكم في وضعية النافذة (X & Y) و السطرين الأخيرين هما لـ تحكم في حجم النافذة

--

ShowWindow(hWnd, nCmdShow );

في مكان nCmdShow :

SW_HIDE = إخفاء النافذة
SW_MINIMIZE = تصغير النافذة عند تشغيل البرنامج
SW_RESTORE = إرجاع النافذة
SW_SHOW = إظهار النافذة
SW_SHOWMAXIMIZED = تكبير النافذة عند تشغيل البرنامج
SW_SHOWMINIMIZED =  تصغير النافذة عند تشغيل البرنامج
SW_SHOWNA = ينشط النافذة
SW_SHOWNORMAL = إضهار النافذة

نتوقف هنا مأقتا

و نواصل بعد قليل

و شكرا

#4

نكمل

switch(messg)
    {
 case WM_DESTROY:
  PostQuitMessage( 0 );
  break;

 default:
  return( DefWindowProc( hWnd, messg, wParam, lParam ) );
    }

:

WM_ACTIVATE = في حالة تشغيل النافذة
WM_CLOSE = في حالة الخروج من النافذة
WM_CREATE = في حالة إنشاء النافذة
WM_DESTROY = في حالة التدمير
WM_MOVE = في حالة تحريك النافذة
WM_MOUSEMOVE = في حالة تحريك مأشر الفأرة في النافذة
WM_KEYUP = في حالة إن لم يتم الضغط على أي زر على لوحة المفاتيح
WM_KEYDOWN = في حال الضغط على أي زر من لوحة المفاتيح
WM_TIMER = في حالة الوقت
WM_USER = في حالة حدوث أشياء خاصة
WM_PAINT = في حالة الكتابة أو الرسم
WM_QUIT = في حالة الخروج
WM_SIZE = في حالة تغير حجم النافذة

إنتهى المثال الأول

و سنبدأ في المثال الثاني و هو الدخول في الألعاب

#5

المثال الثاني :

أول ما تحتاج إليه في برمجة الألعاب هو التعديل في النافذة كأي برنامج و التغير في دقة الشاشة

ألقي نظرة على هذا :

#include<windows.h>

#define WIDTH	800
#define HEIGHT	600
#define BITS	32

const char Class_Name[] = "Programmer";

bool fullscreen = 1;

void ReturnResolution()
{
	ChangeDisplaySettings(NULL,0);
	ShowCursor(TRUE);
}

int ChangeResolution(int width, int height,int bits)
{
	DEVMODE dmScreenSettings;
	memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
	dmScreenSettings.dmSize=sizeof(dmScreenSettings);
	dmScreenSettings.dmPelsWidth	= width;
	dmScreenSettings.dmPelsHeight	= height;
	dmScreenSettings.dmBitsPerPel	= bits;    	
	dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

	ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL;

	ShowCursor(1);

	return 1;
}

LRESULT CALLBACK WndProc(HWND  hWnd,
       UINT  Msg,
       WPARAM  wParam,
       LPARAM  lParam);

int WINAPI WinMain(HINSTANCE  hInstance,
       HINSTANCE  hPrevInstance,
       LPSTR  	lpCmdLine,
       int    nShowCmd)
{
	WNDCLASS	wc;
	MSG  	msg;
	HWND  hWnd;

	ChangeResolution(WIDTH,HEIGHT,BITS);

	if(!hPrevInstance)
	{
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
  wc.hInstance = hInstance;
  wc.lpfnWndProc = WndProc;
  wc.lpszClassName = Class_Name;
  wc.lpszMenuName	= NULL;
  wc.style = 0;
  if(!RegisterClass(&wc))
  	return 0;
	}

	hWnd = CreateWindow(Class_Name, "Programmer", WS_EX_TOPMOST | WS_POPUP | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT, 800, 600,(HWND)NULL,(HMENU)NULL,hInstance,(LPSTR)NULL);

	ShowWindow(hWnd, SW_SHOWNORMAL);
	UpdateWindow(hWnd);

	while(GetMessage(&msg, NULL,0,0) > 0)
	{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
	}

	ReturnResolution();

	return (msg.wParam);
}

LRESULT CALLBACK WndProc(HWND  hWnd,
       UINT  Msg,
       WPARAM  wParam,
       LPARAM  lParam)
{
	switch(Msg)
	{
	case WM_DESTROY:
  PostQuitMessage(0);
  break;

	default:
  return DefWindowProc(hWnd, Msg, wParam,lParam);

	}

	return 0;
}

أضن أن كل شىء واضح

و ضعنا دالة ReturnResolution() في حالة الخروج من البرنامج و العودة إلى دقة الشاشة السابقة

و الدالة ChangeResolution() و هي تغير دقة الشاشة عند تشغيل البرنامج

أعرف إخواني الكرام أني أسرع كثير و شرح قليل فقط أقول أن هذه الأشياء للذين فهموا لغة السي و السي++ و إن كنت مبتدىء فلا مشكلة إذهب إلى الموقع

http://www.winprog.org/tutorial/

و إذا بحثت فيه جيدا فستجد البحوث الموجود بالموقع موضوعة على شكل PDF باللغة الإنجيليزية و العربية

و متأسف مرة أخرة

نكمل المثال في المرة القادمة

تم تعديل هذه المشاركة بواسطة GameDev4Arab في 12 أبريل 2005 في 21:03

#6

نعود

مثال تصادم كرة

هذا المثال تابع للمثال السابق و هو الأخير لأسبوعنا هذا

و كل ما أضفناه في هذا المثال هو :

LRESULT CALLBACK WndProc(HWND  hWnd,
       UINT  Msg,
       WPARAM  wParam,
       LPARAM  lParam)
{
     static int dX = 5, dY = 5;
     static int x = 0, y = 0, oldX = 0, oldY = 0;
     HDC hDC;
     HBRUSH brush;

     switch(Msg)
     {
  case WM_CREATE:
   // إنشاء الوقت )0.02ثانية)
   SetTimer(hWnd, 1, 20, NULL);
   break;
  
  case WM_TIMER: // عند بدأ الوقت
   hDC = GetDC(hWnd);
   //إستعمال اللون الأبيض لـخلفية الكرة
   brush = (HBRUSH)SelectObject(hDC,GetStockObject(WHITE_BRUSH));
   
   RECT temp;
   temp.left = oldX;
   temp.top = oldY;
   temp.right = oldX + 30;
   temp.bottom = oldY + 30;
   
   FillRect(hDC, &temp, brush);
   //أخذ اللون الرمادي للكرة
   
   brush = (HBRUSH)SelectObject(hDC,GetStockObject(GRAY_BRUSH));
   //ثم سحبها
   Ellipse(hDC, x, y, 30 + x, 30 + y);
   //تحديث القيم
   oldX = x;
   oldY = y;

   x += dX;
   y += dY;
   
   //أخذ حجم النافذة و تخزينه في Rect
   
   RECT rect;
   GetClientRect(hWnd, &rect);
   
   if(x + 30 > rect.right || x < 0)
   {
    dX = -dX;
   }
   
   if(y + 30 > rect.bottom || y < 0)
   {
    dY = -dY;
   }
   //إعادة اللون القديم
   SelectObject(hDC, brush);
   //إطلاق ال dc
   ReleaseDC(hWnd, hDC);
   break;
  
  case WM_DESTROY:
   //تدمير الوقت
   KillTimer(hWnd, 1);
   
   PostQuitMessage(0);
   break;
  
  default:
   return(DefWindowProc(hWnd, Msg, wParam, lParam));
     }
     return 0;
}

و هاهو المثال كاملا:

#include<windows.h>

#define WIDTH	800
#define HEIGHT	600
#define BITS	32

const char Class_Name[] = "Programmer";

bool fullscreen = 1;

void ReturnResolution()
{
	ChangeDisplaySettings(NULL,0);
	ShowCursor(TRUE);
}

int ChangeResolution(int width, int height,int bits)
{
	DEVMODE dmScreenSettings;
	memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
	dmScreenSettings.dmSize=sizeof(dmScreenSettings);
	dmScreenSettings.dmPelsWidth	= width;
	dmScreenSettings.dmPelsHeight	= height;
	dmScreenSettings.dmBitsPerPel	= bits;    	
	dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

	ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL;

	ShowCursor(1);

	return 1;
}

LRESULT CALLBACK WndProc(HWND  hWnd,
       UINT  Msg,
       WPARAM  wParam,
       LPARAM  lParam);

int WINAPI WinMain(HINSTANCE  hInstance,
       HINSTANCE  hPrevInstance,
       LPSTR  	lpCmdLine,
       int    nShowCmd)
{
	WNDCLASS	wc;
	MSG  	msg;
	HWND  hWnd;

	ChangeResolution(WIDTH,HEIGHT,BITS);

	if(!hPrevInstance)
	{
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
  wc.hInstance = hInstance;
  wc.lpfnWndProc = WndProc;
  wc.lpszClassName = Class_Name;
  wc.lpszMenuName	= NULL;
  wc.style = 0;
  if(!RegisterClass(&wc))
  	return 0;
	}

	hWnd = CreateWindow(Class_Name, "Programmer", WS_EX_TOPMOST | WS_POPUP | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT, 800, 600,(HWND)NULL,(HMENU)NULL,hInstance,(LPSTR)NULL);

	ShowWindow(hWnd, SW_SHOWNORMAL);
	UpdateWindow(hWnd);

	while(GetMessage(&msg, NULL,0,0) > 0)
	{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
	}

	ReturnResolution();

	return (msg.wParam);
}

LRESULT CALLBACK WndProc(HWND  hWnd,
       UINT  Msg,
       WPARAM  wParam,
       LPARAM  lParam)
{
     static int dX = 5, dY = 5;
     static int x = 0, y = 0, oldX = 0, oldY = 0;
     HDC hDC;
     HBRUSH brush;

     switch(Msg)
     {
  case WM_CREATE:
   // إنشاء الوقت )0.02ثانية)
   SetTimer(hWnd, 1, 20, NULL);
   break;
  
  case WM_TIMER: // عند بدأ الوقت
   hDC = GetDC(hWnd);
   //إستعمال اللون الأبيض لـخلفية الكرة
   brush = (HBRUSH)SelectObject(hDC,GetStockObject(WHITE_BRUSH));
   
   RECT temp;
   temp.left = oldX;
   temp.top = oldY;
   temp.right = oldX + 30;
   temp.bottom = oldY + 30;
   
   FillRect(hDC, &temp, brush);
   //أخذ اللون الرمادي للكرة
   
   brush = (HBRUSH)SelectObject(hDC,GetStockObject(GRAY_BRUSH));
   //ثم سحبها
   Ellipse(hDC, x, y, 30 + x, 30 + y);
   //تحديث القيم
   oldX = x;
   oldY = y;

   x += dX;
   y += dY;
   
   //أخذ حجم النافذة و تخزينه في Rect
   
   RECT rect;
   GetClientRect(hWnd, &rect);
   
   if(x + 30 > rect.right || x < 0)
   {
    dX = -dX;
   }
   
   if(y + 30 > rect.bottom || y < 0)
   {
    dY = -dY;
   }
   //إعادة اللون القديم
   SelectObject(hDC, brush);
   //إطلاق ال dc
   ReleaseDC(hWnd, hDC);
   break;
  
  case WM_DESTROY:
   //تدمير الوقت
   KillTimer(hWnd, 1);
   
   PostQuitMessage(0);
   break;
  
  default:
   return(DefWindowProc(hWnd, Msg, wParam, lParam));
     }
     return 0;
}

و هنا ننتهي

و لم تبقى إلى المناقشة و التعمق في هذه الأمثلة أكثر و بطرقة أخرى

أنتظر باقي الأعضاء

و شكرا

تم تعديل هذه المشاركة بواسطة GameDev4Arab في 12 أبريل 2005 في 19:45

#7
GameDev4Arab كتب:
المثال الثاني :

أول ما تحتاج إليه في برمجة الألعاب هو التعديل في النافذة كأي برنامج و التغير في دقة الشاشة

ألقي نضرة على هذا :

#include<windows.h>

#define WIDTH	800
#define HEIGHT	600
#define BITS	32

const char Class_Name[] = "Programmer";

bool fullscreen = 1;

void ReturnResolution()
{
	ChangeDisplaySettings(NULL,0);
	ShowCursor(TRUE);
}

int ChangeResolution(int width, int height,int bits)
{
	DEVMODE dmScreenSettings;
	memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
	dmScreenSettings.dmSize=sizeof(dmScreenSettings);
	dmScreenSettings.dmPelsWidth	= width;
	dmScreenSettings.dmPelsHeight	= height;
	dmScreenSettings.dmBitsPerPel	= bits;    	
	dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

	ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL;

	ShowCursor(1);

	return 1;
}

LRESULT CALLBACK WndProc(HWND  hWnd,
       UINT  Msg,
       WPARAM  wParam,
       LPARAM  lParam);

int WINAPI WinMain(HINSTANCE  hInstance,
       HINSTANCE  hPrevInstance,
       LPSTR  	lpCmdLine,
       int    nShowCmd)
{
	WNDCLASS	wc;
	MSG  	msg;
	HWND  hWnd;

	ChangeResolution(WIDTH,HEIGHT,BITS);

	if(!hPrevInstance)
	{
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
  wc.hInstance = hInstance;
  wc.lpfnWndProc = WndProc;
  wc.lpszClassName = Class_Name;
  wc.lpszMenuName	= NULL;
  wc.style = 0;
  if(!RegisterClass(&wc))
  	return 0;
	}

	hWnd = CreateWindow(Class_Name, "Programmer", WS_EX_TOPMOST | WS_POPUP | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT, 800, 600,(HWND)NULL,(HMENU)NULL,hInstance,(LPSTR)NULL);

	ShowWindow(hWnd, SW_SHOWNORMAL);
	UpdateWindow(hWnd);

	while(GetMessage(&msg, NULL,0,0) > 0)
	{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
	}

	ReturnResolution();

	return (msg.wParam);
}

LRESULT CALLBACK WndProc(HWND  hWnd,
       UINT  Msg,
       WPARAM  wParam,
       LPARAM  lParam)
{
	switch(Msg)
	{
	case WM_DESTROY:
  PostQuitMessage(0);
  break;

	default:
  return DefWindowProc(hWnd, Msg, wParam,lParam);

	}

	return 0;
}

أضن أن كل شىء واضح

و ضعنا دالة ReturnResolution() في حالة الخروج من البرنامج و العودة إلى دقة الشاشة السابقة

و الدالة ChangeResolution() و هي تغير دقة الشاشة عند تشغيل البرنامج

أعرف إخواني الكرام أني أسرع كثير و شرح قليل فقط أقول أن هذه الأشياء للذين فهموا لغة السي و السي++ و إن كنت مبتدىء فلا مشكلة إذهب إلى الموقع

http://www.winprog.org/tutorial/

و إذا بحثت فيه جيدا فستجد البحوث الموجود بالموقع موضوعة على شكل PDF باللغة الإنجيليزية و العربية

و متأسف مرة أخرة

نكمل المثال في المرة القادمة

اخي شكرا لك جزيل الشكر

والشرح مفهوم ورائع جدا حتى المثال الثاني وذلك لاني لم اقرا الى المثال الاول وانا متاكد بان الذي يليله سيكون اروع

ولكن لدي سؤال وهو:-

انت قلت

" أعرف إخواني الكرام أني أسرع كثير و شرح قليل فقط أقول أن هذه الأشياء للذين فهموا لغة السي و السي++ و إن كنت مبتدىء "

عن اي سرعه تكلمت ؟؟؟ .. هل عن المثال الاول ام الثاني ؟؟؟ ... اذا كان الاول فهو تمام .... اما الثاني فانت لم تشرح شيئا منه بل كتبت الكود فقط

لذا الرجو التوضيح

#8

لا شكر على واجب و بالنسبة للمثال الثاني سأشرح فقط :

void ReturnResolution()
{
ChangeDisplaySettings(NULL,0);
ShowCursor(TRUE);
}

int ChangeResolution(int width, int height,int bits)
{
DEVMODE dmScreenSettings;
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
dmScreenSettings.dmSize=sizeof(dmScreenSettings);
dmScreenSettings.dmPelsWidth = width;
dmScreenSettings.dmPelsHeight = height;
dmScreenSettings.dmBitsPerPel = bits;     
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL;

ShowCursor(1);

return 1;
}

لأن هذا كل ما أضفناه في هذا المثال

1- أولا قم بإنشاء دالة void ReturnResolution() حيث نضع هذه الدالة في مأخرت WinMain و عملها هو إرجاع دقة الشاشة كما كانت و إن كنت تريد الفرق قم حذفها و شغل البرنامج و قم بالخروج منه و قل لنا ماذا تلاحظ

ChangeDisplaySettings() هي دالة موجود في الملف windows.h و هي التي تقوم بالإرجاع الإفتراضي و أما

ShowCursor()

في حالة

0 أي false لن يظهر مأشر الفأرة عند الخروج من البرنامج

و في حالة

1 أي true يظهر مأشر الفأرة عند الخروج من البرنامج

2- و ثانية دالة ChangeResolution()

int ChangeResolution(int width, int height,int bits)
{
	DEVMODE dmScreenSettings;     // Device Mode
	memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // التأكد من مسح الذاكرة
	dmScreenSettings.dmSize=sizeof(dmScreenSettings); // حجم البنية Devmode
	dmScreenSettings.dmPelsWidth	= width; // عرض الشاشة
	dmScreenSettings.dmPelsHeight	= height; // طول الشاشة
	dmScreenSettings.dmBitsPerPel	= bits; // أجزاء البيكسل)Bits Per Pixel(
	dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

	// يقوم هنا بالتنشيط و عرض النتائج
	ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL;

	// في حالة إن كنت تريد إضهار مؤشر الفأرة ضع 0 في مكان 1
	ShowCursor(1);

	return 1;
}

و في WinMain نقوم بإستدعاء الدالة ChangeResolution() في بداية WinMain

و أما دالة ReturnResolution() نضعها في نهاية WinMain

هنا نتوقف

و أتنى أن يضيفوا باقي الأعضاء رأيهم و ما يعلمون لكي نستطيع الإستمرار

و شكرا

#9

كنت اعد بعض المواضيع عن احداث الماوس والكيبورد والستايل العام للنافذة وكيفية وضعها كملء الشاشة fullscreen

ولكن سبقتني ...:(

:)د

بصراحة لايوجد لدي المزيد لاضيفه ولكن ممكن اعرف ماهو الجزء القادم من الموضوع حتى اعرف ان كنت سافيد بشي

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#10

السلام عليكم

اولا وقبل كل شيء انا اشكر gamedev4arab وذلك على تعبه وعلى شرحه الواضح

اما ثانيا وبالنسبه لك اخي الشمري

الشـمري كتب:
بصراحة لايوجد لدي المزيد لاضيفه ولكن ممكن اعرف ماهو الجزء القادم من الموضوع حتى اعرف  ان كنت سافيد بشي

فارجو ان تقوم بالرجوع الى الامثل التي يضعها الاخ gamedev4arab وتشرحها مره اخرى وبوضوح اكثر

هذا لا يعني ان الاخ لا يوضح لا بل انه يوضح الكثير الكثير لدرجة انني فهمت كل ما شرحه تقريبا ( المثال الاول والثاني) ولكن يوجد بعض الاشياء التي لم يشرحها فلذلك ارجو الرجوع اليها

#11

السلام عليكم

اخي GameDev4Arab ارجو ان تضيفني لديك بالماسنجر وهذا هو ايميلي majnona_@hotmail.com

واذا لا تريد اضافتي ارجو اخباري بذلك كي لا انتظر اضافتك

وشكرا

#12

السلام عليكم

أخي الشـمري أشكرك على الدخول و لكن لمذا لا توجد إيضافات ... باليوجد الكثير لكي تظيفه مثلا

LRESULT CALLBACK WndProc(HWND  hWnd,
      UINT  Msg,
      WPARAM  wParam,
      LPARAM  lParam)
{
switch(Msg)
{
case WM_DESTROY:
 PostQuitMessage(0);
 break;

default:
 return DefWindowProc(hWnd, Msg, wParam,lParam);

}

return 0;
}

يمكنك مثلا الإضافة إليه :

WM_MOVE

و عند تحريك النافذة تأتيك رسالة تبلغك أن النافذة قد حركة :

LRESULT CALLBACK WndProc(HWND  hWnd,
      UINT  Msg,
      WPARAM  wParam,
      LPARAM  lParam)
{
switch(Msg)
{
case WM_DESTROY:
 PostQuitMessage(0);
 break;

case WM_MOVE:
MessageBox(NULL,"Move","Message",MB_OK|MB_ICONINFORMATION;
break;

default:
 return DefWindowProc(hWnd, Msg, wParam,lParam);

}

return 0;
}

و هاكذا بالنسبة للباقي

و يمكنك أيظا و ضع شرحا آخر لها(كما قالت الأخت الكريمة majnona_) بطريقتك الخاصة كي يستطيع الأعضاء الفهم أكثر

و بالنسبة لكي majnona_ فأنا متأسف جدا لأني لا أملك إيميل على الهوتميل و لا أملك الماسنجر

و شكرا

#13
GameDev4Arab كتب:
و يمكنك أيظا و ضع شرحا آخر لها(كما قالت الأخت الكريمة majnona_) بطريقتك الخاصة كي يستطيع الأعضاء الفهم أكثر

انا لست بنت بل ولد

#14

اذا كذا خير ان شاء الله..

اصبروا علي يوم او اثنين وساضيف ان شاء الله..

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#15

أعتذر أخي majnona_ و متأسف جدا ...

في إنتظارك أخي الشـمري

و لكن ألا يوجد أحد إلى الشـمري و majnona_ ?!?!

#16

السلام عليكم

اولا اخي ارجو منك شرح مثل هذه الاشياء وذلك لانها مهمه جدا وانت لم تشرحها

الشرح ياتي مثل كالتالي

1- وضيفة الداله( مثلا)

2- كم برامتر تاخذ ولماذا

وهكذا

GameDev4Arab كتب:
LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam );

char szProgName[] = "Hello Win32"; /* إسم البرنامج */

                                       

int WINAPI WinMain(HINSTANCE  hInst,

      HINSTANCE  hPreInst,

      LPSTR  lpszCmdLine,

      int    nCmdShow )

{

    HWND hWnd;

    MSG lpMsg;

    WNDCLASS wc;

    if( !hPreInst )

    {

          wc.lpszClassName = szProgName;

          wc.hInstance = hInst;

          wc.lpfnWndProc = WndProc;

          wc.hCursor = LoadCursor( NULL, IDC_ARROW );

          wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );

          wc.lpszMenuName = NULL;

          wc.hbrBackground = (HBRUSH)

              GetStockObject( WHITE_BRUSH );

          wc.style = 0;

          wc.cbClsExtra = 0;

          wc.cbWndExtra = 0;

          if( !RegisterClass( &wc ) )

              return FALSE;

    }

كما وارجو ان تشرح هذه الاشياء في المثال الاخير ( تصادم الكره ) وشكرا

كما وارجو ان تكمل الامثله لان هذا الموضوع ممتاز جدا جدا جدا

وشكرا...............................

تم تعديل هذه المشاركة بواسطة majnona_ في 14 أبريل 2005 في 21:09

#17

بسم الله الرحمن الرحيم

السلام عليكمو

اللــــــــــــــــــــــة عليك يا GAMEDEV4ARAB وشكرا على هذا المجهود حيث أنينى أريد تعليم البرمة بwin 32 api وبحثت ع النت ف كتب تدعم هذا ولم أجد

ممكن يكون تقصير منى ...!

ولكن أريد منك أن تفيض علينا بفيض من معلو ماتك الجميلة حتى نستفيد حيث عندى مشروع مطلوب منى بالسى وأأمل أن اعملة بال win32 api فأطمع بأن تعلمنى أكثر حتى أتم عمل المشروع حيث مدة المشروع أسبوع واحد فأرجو بأن ترد عليا و تكتب لنا بأستفاضة فى win32 api حتى اتم عمل المشروع و....!

جزاك الله كل خير

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#18

أرجو اضافة شرح توضيحي اكثر وينك يا الشمري انني انتظر الشرح وشكرا لشرح يا أخGAMEDEV4ARAB فعلا روعه...

والله يعطيكم العافيه...

#19

و عليكم السلام

أخي majnona_

LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam );

عرفنا هنا WndProc = Window procedure أي إجراءات النافذة

حيث :

hWnd = Handle window أي مقبض النافذة

و

Messg = unisgned int message

و

wParam = High Word Parameter

و

lParam = low word parameter

هذه لإجراءات النافذة

--------------------

char szProgName[] = "Hello Win32";

هي إسم الفئة أي الطبقة الخاصة بالنافذة التي سنستدعيها فيما بعد

int WINAPI WinMain(HINSTANCE  hInst,
      HINSTANCE  hPreInst, 
      LPSTR  lpszCmdLine, 
      int    nCmdShow )
{

HINSTANCE hInst = مرحلة مقبض البرنامج

LPSTR lpszCmdLine = Long Point to string

int nCmdShow = for WindowShow();

HWND hWnd;
    MSG lpMsg;
    WNDCLASS wc;

hWnd = Handle window

lpMsg = نحتاجها في حلقة الرسائل

WNDCLASS = window class

          wc.lpszClassName = szProgName;
          wc.hInstance = hInst;
          wc.lpfnWndProc = WndProc;
          wc.hCursor = LoadCursor( NULL, IDC_ARROW );
          wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
          wc.lpszMenuName = NULL;
          wc.hbrBackground = (HBRUSH)
              GetStockObject( WHITE_BRUSH );
          wc.style = 0;
          wc.cbClsExtra = 0;
          wc.cbWndExtra = 0;

wc.lpszClassName = szProgName; = إستدعينا هنا szProgName التيعرفناها من قبل و هي خاصة بإسم الفئة الخاصة بالنافذة

wc.hInstance = hInst; = window class . handle instance = hInst

wc.lpfnWndProc = WndProc; = window procedure = WndProc

wc.hCursor = LoadCursor( NULL, IDC_ARROW ); = لرفع مأشر الفأرة

wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); = لرفع الإيقونة

wc.lpszMenuName = NULL; = NULL لأننا لا نريد قائمة لبرنامجنا

wc.hbrBackground = (HBRUSH)
              GetStockObject( WHITE_BRUSH ); = لون خليفية البرنامج

wc.style = 0; = النافذة

          wc.cbClsExtra = 0;
          wc.cbWndExtra = 0;
البيانات المحجوزة في الطبقة

          if( !RegisterClass( &wc ) )
              return FALSE;
    }

في حالة عدم تحقق عنصر من عناصر WNDCLASS يقوم بالخروج من البرنامج

-----

أعرف أنا هذه الشرح سريع جدا و أنا متأسف لأني لا أريد الإطالة في هذه الأشياء و إن كنت تريد التعمق أكثر

http://winprog.org/tutorial/files/forgers-...rial-arabic.zip

و متأسف مرة أخرى

أهلا أخي eng_3llam

لا شكر على واجب

و لكن هل ممكن أن تقول لنا مشروعك لعلنا نستطيع المساعدة

و شكرا

#20

أهلا أخي rose2004 يبدو أن الأخ الشمري في الإمتحانات

الله يوفق إن شاء الله

#21

خلصت امتحانات :) ... ابشروا ... بكرا ان شاء الله ابدأ...

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#22

السلام عليكم

اخي gamedev4arab شكرا لك ولكني لم اقصد ان تشرح لي الاقتباس الذي وضعته( انا) ولكن كان قصدي ان في الامثله القادم ان شاء الله ان تقوم بشرح مثل هذه الاشياء ومثل شرح لماذا نضع هذا الرمز &( ارعف انه عنوان في الذاكره) ولكن قصدي لماذا واذا لم نضعه ماذا يجري وهكذا

الشـمري كتب:
خلصت امتحانات :) ... ابشروا ... بكرا ان شاء الله ابدأ...

ارجو منك التفاعل

#23

[السلام عليكم

شكرا لك اخي GameDev4Arab على هذا الشرح ولكن هذا الشرح سريع جدا وذلك لانه توجد دوال لم تشرحها انت مثل " hDC = GetDC(hWnd); "

وهذا مهم جدا

كما ويوجد بعض الاشياء مثل

if(x + 30 > rect.right || x < 0)

{

dX = -dX;

}

if(y + 30 > rect.bottom || y < 0)

{

dY = -dY;

}

لم تشرح لماذا نحتاج هذه الجمل الشرطيه ( انا اسف على اسئلتي ) ولكني مبتدء ولا اعرف معنى كل هذه الدوال او التعابير التاليه

GameDev4Arab كتب:
نعود

مثال تصادم كرة

هذا المثال تابع للمثال السابق و هو الأخير لأسبوعنا هذا

و كل ما أضفناه في هذا المثال هو :

LRESULT CALLBACK WndProc(HWND  hWnd,
       UINT  Msg,
       WPARAM  wParam,
       LPARAM  lParam)
{
     static int dX = 5, dY = 5;
     static int x = 0, y = 0, oldX = 0, oldY = 0;
     HDC hDC;
     HBRUSH brush;

     switch(Msg)
     {
  case WM_CREATE:
   // إنشاء الوقت )0.02ثانية)
   SetTimer(hWnd, 1, 20, NULL);
   break;
  
  case WM_TIMER: // عند بدأ الوقت
   hDC = GetDC(hWnd);
   //إستعمال اللون الأبيض لـخلفية الكرة
   brush = (HBRUSH)SelectObject(hDC,GetStockObject(WHITE_BRUSH));
   
   RECT temp;
   temp.left = oldX;
   temp.top = oldY;
   temp.right = oldX + 30;
   temp.bottom = oldY + 30;
   
   FillRect(hDC, &temp, brush);
   //أخذ اللون الرمادي للكرة
   
   brush = (HBRUSH)SelectObject(hDC,GetStockObject(GRAY_BRUSH));
   //ثم سحبها
   Ellipse(hDC, x, y, 30 + x, 30 + y);
   //تحديث القيم
   oldX = x;
   oldY = y;

   x += dX;
   y += dY;
   
   //أخذ حجم النافذة و تخزينه في Rect
   
   RECT rect;
   GetClientRect(hWnd, &rect);
   
   if(x + 30 > rect.right || x < 0)
   {
    dX = -dX;
   }
   
   if(y + 30 > rect.bottom || y < 0)
   {
    dY = -dY;
   }
   //إعادة اللون القديم
   SelectObject(hDC, brush);
   //إطلاق ال dc
   ReleaseDC(hWnd, hDC);
   break;
  
  case WM_DESTROY:
   //تدمير الوقت
   KillTimer(hWnd, 1);
   
   PostQuitMessage(0);
   break;
  
  default:
   return(DefWindowProc(hWnd, Msg, wParam, lParam));
     }
     return 0;
}

اخي لقد بدات من الصفر وبشرح جميل ورائع فارجو ان تعطينا 30 دقيقه من وقتك لشرح مثل هذه الاشياء

#24

و عليكم السلام

HDC hDC;

مقبض إلى سياق الأداة

HBRUSH brush;

إستعمال الفرشاة لرسم

hDC = GetDC(hWnd);

يأتي بـ DC للـ hWnd أي مقبض النافذة

RECT temp;
  temp.left = oldX;
  temp.top = oldY;
  temp.right = oldX + 30;
  temp.bottom = oldY + 30;

ملأ RECT بالقيمة حيث oldX & oldY هما :

static int x = 0, y = 0, oldX = 0, oldY = 0;

أما :
if(x + 30 > rect.right || x < 0)
  {
   dX = -dX;
  }
  
  if(y + 30 > rect.bottom || y < 0)
  {
   dY = -dY;
  }

قم بتغير الأرقام لكي تلاحظ التغيرات و ما عملها

هذا شرح و لكنه ليس كاملا و لن يكمل إلى بعد دخول باقي الأعضاء في المناقشة

و متأسف مرة أخرى على التسرع :)

#25

اخي gamedev4arab ارجو ان تستمر بالامثله

وكل من يريد النقاش فسوف ياتي فلا يجوز ان ننتظر حتى تاتي كميه من الاعضاء

اخي انت حتى الان لم تفهم ما هو قصدي

عندما اضع انا اقتباس انت تظن انا المشكله موجوده في الاقتباس

لا لا لا لا

انا اضع الاقتباس كمثال

انا اريد منك ان تشرح مثلا هذه الاشياء

"

RECT temp;

temp.left = oldX;

temp.top = oldY;

temp.right = oldX + 30;

temp.bottom = oldY + 30;

"

نحن مبتدئون ولسنا محترفون كي لا تشرح مثل هذه الاشياء

وبصراحه في المثال الاخير لم افهم شيئا ( تقريبا )

هذا الموضوع مغلق.

مواضيع مشابهة