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

[ تمت الإجابة ]مساعدة في الرسالة Bm_click

مغلق
بدأه 852147 في 27 أغسطس 2008 · 13 رد · 2,333 مشاهدة · في أرشيف قسم Windows APIs
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

قمت بانشائ نافذة تحتوي على button

وأريد أن أتحكم به بواسطو WM_COMMAND

ممكن حلقة تساعدوني في ذلك

وهذالكود

switch(LangMsg)
	{
	case WM_CLOSE:
		DestroyWindow( Lang );
		break;

	case WM_CREATE:
		{

			 Exit = CreateWindow ("BUTTON","Exit" 
				,WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON
				, 250 , 100 , 110 , 50 , Lang , NULL , (HINSTANCE)GetWindowLong(Lang , GWL_HINSTANCE) , NULL);



		}		
		break;



	case WM_COMMAND:
		{
		ماذا أكتب هنا			
		}
		break;

تم تعديل هذه المشاركة بواسطة 852147 في 27 أغسطس 2008 في 15:01

#2

استخدم switch على :

LOWORD(wParam)

حيث يساوي الـControl ID .

او استخدم switch على lParam حيث تساوي مقبض النافذة او الـControl .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

شكرا

يعني اكتب التالي

switch(LOWORD(HWND ))
			{
			case BM_CLICK:
				MessageBox ( NULL , "g" , "hh" , MB_OK);
				break;

}

تم تعديل هذه المشاركة بواسطة 852147 في 27 أغسطس 2008 في 21:42

#4

لم افهم من الكود السابق شئ .. فلنفترض انك انشأت زر مقبضه هو hButton فسيكون الكود كالتالي :

LRESULT CALLBACK WindowProc[color= #000000;](HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam[color= #000000;])

[color= #000000;]{

    [color= #0000ff;]switch [color= #000000;](uMsg[color= #000000;])

    [color= #000000;]{

        [color= #0000ff;]case WM_COMMAND[color= #000000;]:

        [color= #000000;]{

            [color= #0000ff;]switch [color= #000000;]([color= #000000;](HWND[color= #000000;])lParam[color= #000000;])

            [color= #000000;]{

            [color= #0000ff;]case hButton[color= #000000;]:

                [color= #007f00;]// button has been clicked ...

            [color= #000000;]};

        [color= #000000;]};

    [color= #000000;]};

[color= #000000;]};

لو افترضنا ان الـID للزر هو ID_BUTTON فسيكون الكود كالتالي :

LRESULT CALLBACK DialogProc[color= #000000;](HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam[color= #000000;])

[color= #000000;]{

    [color= #0000ff;]switch [color= #000000;](uMsg[color= #000000;])

    [color= #000000;]{

        [color= #0000ff;]case WM_COMMAND[color= #000000;]:

        [color= #000000;]{

            [color= #0000ff;]switch [color= #000000;](LOWORD[color= #000000;](wParam[color= #000000;])[color= #000000;])

            [color= #000000;]{

            [color= #0000ff;]case ID_BUTTON[color= #000000;]:

                [color= #007f00;]// button has been clicked ...

            [color= #000000;]};

        [color= #000000;]};

    [color= #000000;]};

[color= #000000;]};

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#5
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
		case WM_COMMAND:
		{
			switch ((HWND)lParam)
			{
			case hButton:
				// button has been clicked ...
			};
		};
	};
};

لم يعمل وظهر الخطأ التالي

error C2450: switch expression of type 'HWND' is illegal \

فما الحل

تم تعديل هذه المشاركة بواسطة 852147 في 28 أغسطس 2008 في 10:32

#6

الكود كله خطأ ,, أسف كتبته على عجالة وفي الـnotepad ولم انتبه ان hButton متغير وليس ثابت وبالتالي لا يمكن اجراء switch عليها :wacko:

استخدم جمل الشرط if-else if بدلا من الـswitch ,, هذا عند استخدام المقابض فقط اما عند استخدام الـID فالكود الخاص بهم صحيح .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#7

ممكن الكود باستخدام الشرط

أو على الأقل الشرح

#8
LRESULT CALLBACK WindowProc[color= #000000;](HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam[color= #000000;])

[color= #000000;]{

    [color= #0000ff;]switch [color= #000000;](uMsg[color= #000000;])

    [color= #000000;]{

        [color= #0000ff;]case WM_COMMAND[color= #000000;]:

        [color= #000000;]{

            [color= #0000ff;]if [color= #000000;](hBtn_Ok [color= #000000;]== [color= #000000;](HWND[color= #000000;])lParam[color= #000000;])

            [color= #000000;]{

                [color= #007f00;]// OK button clicked ..

            [color= #000000;]}

            [color= #0000ff;]else [color= #0000ff;]if [color= #000000;](hBtn_About [color= #000000;]== [color= #000000;](HWND[color= #000000;])lParam[color= #000000;])

            [color= #000000;]{

                [color= #007f00;]// About button clicked ..

            [color= #000000;]}

            [color= #0000ff;]else [color= #0000ff;]if [color= #000000;](hBtn_Exit [color= #000000;]== [color= #000000;](HWND[color= #000000;])lParam[color= #000000;])

            [color= #000000;]{

                [color= #007f00;]// Exit button clicked ..

            [color= #000000;]};

        [color= #000000;]};

    [color= #000000;]};

[color= #000000;]};

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#9

لافائدة اخي

جربت كما قلت لي

ولكن يقوم بتنفيذ أول أمر من حلقة الشرط في كل الحالات يعني أضغط أي زر يقوم بعمل نفس النتيجة للسطر الأول من

الشرط

#10

أرفق الكود كاملاً .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#11

انه كود انشاء نافذة + زر ؟؟ :

#include "windows.h"

HWND Start ; 



LRESULT CALLBACK LangProc ( HWND Lang , UINT LangMsg , WPARAM LangwParam , LPARAM LanglParam)
{
	switch(LangMsg)
	{
	case WM_CLOSE:
		DestroyWindow( Lang );
		break;

	case WM_CREATE:
		{
			 Start = CreateWindow ("BUTTON","Start The Game" 
				,WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_TEXT  
				, 10 , 100 , 110 , 50 , Lang , NULL , (HINSTANCE)GetWindowLong(Lang , GWL_HINSTANCE) , NULL);


		}		
		break;

	case WM_COMMAND:
		{
			if ( Start = (HWND)LanglParam)
			{
				MessageBox ( NULL , "Start The Game " , "Start" , MB_OK);
			}
			)

		}

		break;

	case WM_ACTIVATE:
		{


		}
		break;



	}
	return DefWindowProc ( Lang , LangMsg , LangwParam , LanglParam );
}


INT WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nShowCmd)


WNDCLASSEX b ;
	HWND hwnd ; 
	MSG Msg ; 



	b.cbClsExtra = 0 ; 
	b.cbSize = sizeof(WNDCLASSEX);
	b.cbWndExtra = 0 ; 
	b.hbrBackground = (HBRUSH)(COLOR_WINDOW+13);
	b.hIcon = LoadIcon( NULL , IDI_APPLICATION);
	b.hIconSm = b.hIcon ; 
	b.hInstance = hInstance ; 
	b.lpfnWndProc = WndProc ;
	b.lpszClassName = " Fire " ; 
	b.lpszMenuName = NULL ; 
	b.style = 0 ;
	b.hCursor = LoadCursor ( NULL , IDC_ARROW);


		::RegisterClassEx ( &b) ;

	hwnd = ::CreateWindowEx ( 0 , "  Fire " , "P.O.I.A.F" , WS_POPUP , 
		                      CW_USEDEFAULT , CW_USEDEFAULT , 400 , 200 , NULL , NULL , hInstance , NULL );





		::ShowWindow ( hwnd , SW_SHOW );
		::UpdateWindow ( hwnd );

		ZeroMemory ( &Msg , sizeof(Msg));	
		while ( Msg.message != WM_QUIT )
		{
			if ( PeekMessage(&Msg , NULL , 0 , 0 , PM_REMOVE ))
			{

			::TranslateMessage ( &Msg);
			::DispatchMessage (&Msg);
			}
			else
			{
				MessageBox ( NULL,"h" , "h" , MB_OK );
			}
		}

	}

	::UnregisterClass ( " Peace Of Iron And Fire " , b.hInstance );
	return 0 ; 
}

تم تعديل هذه المشاركة بواسطة 852147 في 28 أغسطس 2008 في 17:09

#12

صحصح شوية :

[color= #0000ff;]if [color= #000000;]( Start [color= #000000;]== [color= #000000;](HWND[color= #000000;])LanglParam[color= #000000;])

وليس :

[color= #0000ff;]if [color= #000000;]( Start [color= #000000;]= [color= #000000;](HWND[color= #000000;])LanglParam[color= #000000;])

==

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#13

شكرا يأخي :ty: :ty:

لقد نجحت :clapping: :lol: :lol: :rolleyes: :cry: :cry:

متأسف على التعب :blush: :blush:

#14

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

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…