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

[ تمت الإجابة ]استدعاء Dialog اخرى

بدأه aderfiad في 30 أكتوبر 2009 · 6 رد · 645 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

سؤال بسيط فقط كيف يمكن استدعاء اخرى عن الضغط show

.386
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc


includelib kernel32.lib
includelib user32.lib




DlgProc		   PROTO :DWORD,:DWORD,:DWORD,:DWORD 

.const

show   equ  1002


.data?

hInstance HINSTANCE ?

.data


.code
start:

	   invoke GetModuleHandle,NULL
	   mov hInstance,eax

	   invoke DialogBoxParam,hInstance,1001,NULL,addr DlgProc,NULL 
	   invoke ExitProcess,eax 


DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM 

		   .if uMsg == WM_COMMAND
		   mov eax,wParam
		   .if eax == show

		   .endif

		  .elseif uMsg == WM_CLOSE
		  invoke EndDialog,hWnd,0
		  .endif
		 xor eax,eax
 ret
DlgProc endp




end start

جربت الدالة CreateDialogParam في proc واستدعاء proc عند الضغط show ولم تنجح

ممكن شباب تعديل الكود لاضهار Dialog اخرى اكون قد اضفتها باستعمال Winasm

تم تعديل هذه المشاركة بواسطة aderfiad في 30 أكتوبر 2009 في 15:51

#2

هكذا

 

[color= #0000ff;].[color= #7f7f7f;]386

[color= #7f00ff;].model [color= #aa007f;]flat[color= #0000ff;], [color= #aa007f;]stdcall

[color= #7f00ff;]option [color= #aa007f;]casemap [color= #0000ff;]:[color= #aa007f;]none

 

[color= #7f00ff;]include windows[color= #0000ff;].[color= #ff007f;]inc

[color= #7f00ff;]include kernel32[color= #0000ff;].[color= #ff007f;]inc

[color= #7f00ff;]include user32[color= #0000ff;].[color= #ff007f;]inc

 

[color= #7f00ff;]includelib kernel32[color= #0000ff;].lib

[color= #7f00ff;]includelib user32[color= #0000ff;].lib

 

DlgProc			[color= #7f00ff;]PROTO	[color= #0000ff;]:HWND[color= #0000ff;],:UINT[color= #0000ff;],:WPARAM[color= #0000ff;],:LPARAM

AboutDlg		[color= #7f00ff;]PROTO	[color= #0000ff;]:HWND[color= #0000ff;],:UINT[color= #0000ff;],:WPARAM[color= #0000ff;],:LPARAM

 

[color= #0000ff;].[color= #7f00ff;]const

 

IDD_DIALOG1			equ [color= #7f7f7f;]101

IDD_DLG1			equ	[color= #7f7f7f;]1000

IDD_BTN1			equ	[color= #7f7f7f;]1001

 

[color= #0000ff;].[color= #7f00ff;]data?

 

hInstance			[color= #7f00ff;]dd ?

 

[color= #0000ff;].[color= #7f00ff;]code

 

start[color= #0000ff;]:

 

	[color= #0000ff; font-weight: bold;]invoke GetModuleHandle[color= #0000ff;],NULL

	[color= #ff007f;]mov		hInstance[color= #0000ff;],[color= #7f7f40;]eax

 

	[color= #0000ff; font-weight: bold;]invoke DialogBoxParam[color= #0000ff;],hInstance[color= #0000ff;],IDD_DIALOG1[color= #0000ff;],NULL[color= #0000ff;],[color= #aa007f;]addr DlgProc[color= #0000ff;],NULL

	[color= #0000ff; font-weight: bold;]invoke ExitProcess[color= #0000ff;],[color= #7f7f7f;]0

 

DlgProc [color= #7f00ff;]proc hWin[color= #0000ff;]:HWND[color= #0000ff;],uMsg[color= #0000ff;]:UINT[color= #0000ff;],wParam[color= #0000ff;]:WPARAM[color= #0000ff;],lParam[color= #0000ff;]:LPARAM

 

	[color= #ff007f;]mov		[color= #7f7f40;]eax[color= #0000ff;],uMsg

	[color= #0000ff; font-weight: bold;].if [color= #7f7f40;]eax==WM_INITDIALOG

 

	[color= #0000ff; font-weight: bold;].elseif [color= #7f7f40;]eax==WM_COMMAND

		[color= #0000ff; font-weight: bold;].if [color= #0000a0; font-weight: bold;](wParam == IDD_BTN1[color= #0000a0; font-weight: bold;])	[color= #007f00; font-style: italic;]; .if(wParam == 1001)

			[color= #0000ff; font-weight: bold;]invoke	DialogBoxParam[color= #0000ff;],hInstance[color= #0000ff;],IDD_DLG1[color= #0000ff;],hWin[color= #0000ff;],[color= #aa007f;]addr AboutDlg[color= #0000ff;],NULL

		[color= #0000ff; font-weight: bold;].endif

	[color= #0000ff; font-weight: bold;].elseif [color= #7f7f40;]eax==WM_CLOSE

		[color= #0000ff; font-weight: bold;]invoke EndDialog[color= #0000ff;],hWin[color= #0000ff;],[color= #7f7f7f;]0

	[color= #0000ff; font-weight: bold;].else

		[color= #ff007f;]mov		[color= #7f7f40;]eax[color= #0000ff;],FALSE

		[color= #ff007f;]ret

	[color= #0000ff; font-weight: bold;].endif

	[color= #ff007f;]mov		[color= #7f7f40;]eax[color= #0000ff;],TRUE

	[color= #ff007f;]ret

 

DlgProc [color= #7f00ff;]endp

 

AboutDlg [color= #7f00ff;]proc hWin[color= #0000ff;]:HWND[color= #0000ff;],uMsg[color= #0000ff;]:UINT[color= #0000ff;],wParam[color= #0000ff;]:WPARAM[color= #0000ff;],lParam[color= #0000ff;]:LPARAM

 

	[color= #ff007f;]mov		[color= #7f7f40;]eax[color= #0000ff;],uMsg

	[color= #0000ff; font-weight: bold;].if [color= #7f7f40;]eax==WM_INITDIALOG

 

	[color= #0000ff; font-weight: bold;].elseif [color= #7f7f40;]eax==WM_CLOSE

		[color= #0000ff; font-weight: bold;]invoke EndDialog[color= #0000ff;],hWin[color= #0000ff;],[color= #7f7f7f;]0

	[color= #0000ff; font-weight: bold;].else

		[color= #ff007f;]mov	[color= #7f7f40;]eax[color= #0000ff;],FALSE

		[color= #ff007f;]ret

	[color= #0000ff; font-weight: bold;].endif

	[color= #ff007f;]mov	[color= #7f7f40;]eax[color= #0000ff;],TRUE

	[color= #ff007f;]ret

 

AboutDlg [color= #7f00ff;]endp

 

[color= #7f00ff;]end start

ولا تنسى إضافة dialog جديد باسم IDD_DLG1 ويحمل قيمة ID=1000 وزر في النافذة الرئيسية باسم IDD_BTN1 ويحمل قيمة ID=1001

* حتى يعمل المثال بشكل صحيح فقط.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

شكرا لك تم بنجاح

تم تعديل هذه المشاركة بواسطة aderfiad في 30 أكتوبر 2009 في 19:18

#4

فقط سؤال اخي Xacker

كيف احصل على handle هده dialog الجديدة لارسل لها المعلومات

فقد جربت هدا الكود في PROC الخاصة بها ولم ينجح

.if eax == WM_INITDIALOG

		   invoke GetDlgItemText,hWnd,edit1,addr buffdlg2,100
		   invoke SetDlgItemText,hWnd,Editdlg2,addr buffdlg2

جلبت ما هو مكتوب في Edit الموجودة على النافدة الام ووضعته في متغير buffdlg2

تم اردت ان ارسله ليضهر في Edit موجودة في Dialog الجديدة

اضن انه يلزمني handle هده dialog لاضعه مكان hWnd

تم تعديل هذه المشاركة بواسطة aderfiad في 30 أكتوبر 2009 في 20:36

#5

ارجو الاجابة

فقد توقفت عند هده النقطة :(

تم تعديل هذه المشاركة بواسطة aderfiad في 31 أكتوبر 2009 في 01:52

#6

الذي فهمته أن النص سيكون في النافذة الأم (أو الأب محدش يزعل :lol: ) parent window

وأنت تريد إظهاره في textbox في النافذة الابن child window

ولو لاحظت فأنت تقوم بإنشاء Modal Window من خلال استدعاء DialogBoxParam، هذه النوافذ توقف -إن جاز التعبير- من سير باقي البرنامج حتى يتم التعامل معها وإنهاءها، أي أن التنفيذ في النافذة الرئيسية يتوقف إلى أن يتم إغلاق النافذة الابن، بناء عليه، لن يكون بإمكانك إرسال نص لها من النافذة الأب (الأم) من داخل النافذة الأب (الأم) لأن التحكم أساساً لن يصل إلى هذا الجزء قبل إغلاق النافذة الابن وبالتالي تخسرها.

لحل هذه المشكلة تستطيع مثلاً أن تقوم بجلب النص من داخل النافذة الابن وتسنده إلى الـ textbox، هنا أيضاً سيلزمك مقبض النافذة الأب والذي تستطيع تمريره بسهولة من خلال البارامتر الأخير في DialogBoxParam، لاحظ معي..

INT_PTR DialogBoxParam(

HINSTANCE hInstance,

LPCTSTR lpTemplateName,

HWND hWndParent,

DLGPROC lpDialogFunc,

LPARAM dwInitParam

);

لو راجعت الكود الذي كتبته لك سابقاً لوجدت أني وضعت فيه القيمة NULL.. الآن ولأنني أحتاجه سأقوم باستخدامه بالشكل التالي:

invoke	DialogBoxParam[color= #339933;],hInstance[color= #339933;],IDD_DLG1[color= #339933;],hWin[color= #339933;],addr AboutDlg[color= #339933;],hWin

هنا أمرر مقبض النافذة الرئيسية إلى lParam النافذة الابن وسأستعيده من داخل النافذة الابن بالشكل التالي وأستفيد منه في جلب النص وإظهاره

AboutDlg [color= #7f00ff;]proc hWin[color= #0000ff;]:HWND[color= #0000ff;],uMsg[color= #0000ff;]:UINT[color= #0000ff;],wParam[color= #0000ff;]:WPARAM[color= #0000ff;],lParam[color= #0000ff;]:LPARAM

 

	[color= #ff007f;]mov		[color= #7f7f40;]eax[color= #0000ff;],uMsg

	[color= #0000ff; font-weight: bold;].if [color= #7f7f40;]eax==WM_INITDIALOG

 		[color= #0000ff; font-weight: bold;]invoke	GetDlgItemText[color= #0000ff;],lParam[color= #0000ff;],IDC_EDT1[color= #0000ff;],[color= #aa007f;]addr buffer[color= #0000ff;],[color= #7f7f7f;]255   [color= #007f00; font-style: italic;]; هنا قيمة lParam تحمل مقبض النافذة 
الأب ;)

 		[color= #0000ff; font-weight: bold;]invoke	SetDlgItemText[color= #0000ff;],hWin[color= #0000ff;],IDC_EDT2[color= #0000ff;],[color= #aa007f;]addr buffer

	[color= #0000ff; font-weight: bold;].elseif [color= #7f7f40;]eax==WM_CLOSE

		[color= #0000ff; font-weight: bold;]invoke EndDialog[color= #0000ff;],hWin[color= #0000ff;],[color= #7f7f7f;]0

	[color= #0000ff; font-weight: bold;].else

		[color= #ff007f;]mov	[color= #7f7f40;]eax[color= #0000ff;],FALSE

		[color= #ff007f;]ret

	[color= #0000ff; font-weight: bold;].endif

	[color= #ff007f;]mov	[color= #7f7f40;]eax[color= #0000ff;],TRUE

	[color= #ff007f;]ret

 

AboutDlg [color= #7f00ff;]endp

وبهذا تكون حققت ما تريد.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#7

ماشاء الله اخي شرح واضح وفكرة جيدة لارسال الHandle عبر lParam لم تكن ببالي :lol:

تم بنجاح :clapping:

بارك الله فيك

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