آموزش استفاده از Scintilla در ویندوز به زبان ساده

در مقاله قبل با عنوان “ Scintilla چیست و چه کاربرد هایی دارد .” در بخش مقدمه اعلام کردم که میخواهم کتابی آموزشی برای Scintilla بنویسم اما به دلیل مشغله زیاد از آن منصرف شدم ولی پس از کمی تامل در نبود منابع فارسی Scintilla و مشاهده بازخورد خوب مقاله بر آن شدم تا بخش اسناد Scintilla رو ترجمه و منتشر کنم تا قدم کوچکی در گسترش دانش برداشته باشم. چگونه از Scintilla در ویندوز استفاده کنیم ؟ در زیر بصورت قدم به قدم نحوه استفاده از Scintilla آورده شده است . اول از همه باید فایل DLL بارگزاری شود .

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
hmod = LoadLibrary(“DLL”);

if (hmod==NULL)

{

MessageBox(hwndParent,

“The Scintilla DLL could not be loaded.”,

“Error loading Scintilla”,

MB_OK | MB_ICONERROR);

}

اگر DLL با موفقیت Load شود . یک کلاس جدید ثبت میشود . این کلاس جدید “Scintilla” نام دارد .حالا شما میتوانید همانند دیگر کنترل های ویندوز از این کنترل استفاده کنید :

hwndScintilla = CreateWindowEx(0,”Scintilla”,””, WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPCHILDREN,10,10,500,400,hwndParent,(HMENU)GuiID, hInstance,NULL);

توجه داشته باشید که نام کلاس جدید “Scintilla” است . چگونه Scintilla را کنترل کنیم ؟ شما میتوانید دستوراتی را برای Scintilla ارسال کنید . برای این کار دو روش وجود دارد که در زیر آمده است .

راه ساده کنترل Scintilla : این را ه دقیقا همانند استفاده از دیگر کنترل ها در ویندوز می باشد . در این راه شما دستورات خود را به Scintilla ارسال می کنید و Scintilla Edit Control اطلاعات مورد نظر شما را بر می گرداند .

ساختار ارسال دستورات :

SendMessage(hwndScintilla,sci_command,wparam,lparam);


مثال :

SendMessage(hwndScintilla,SCI_CREATEDOCUMENT, 0, 0);


بعضی از دستورات مقادیری را برمیگردانند و از پارامترها استفاده نمیکنند برای همین پارامتر ها باید NULL باشد.

راه سریع کنترل Scintilla : راه سریع استفاده از Scintilla استفاده از یک تابع دست نویس است . شما میتوانید با استفاده از یک پوینتر (اشاره گر) به طور مستقیم از فرمان ها استفاده کنید . این روش بسیار سریع تر از SendMessage() عادی میباشد . اول از همه شما باید از دستورات SCI__GETDIRECTFUNCTION و SCI__GETDIRECTPOINTER استفاده کنید و همچنین یک پوینتر برای بازگشت مقادیر به تابع و یک اشاره گر باید پارامتر اول را برای تابع بازیابی کند . که این کارباید توسط روش SendMessage انجام شود .

مثال :

int (*fn)(void*,int,int,int);

void * ptr;

int canundo;

fn = (int (__cdecl *)(void *,int,int,int))SendMessage(

hwndScintilla,SCI_GETDIRECTFUNCTION,0,0);

ptr = (void *)SendMessage(hwndScintilla,SCI_GETDIRECTPOINTER,0,0);

canundo = fn(ptr,SCI_CANUNDO,0,0);

چگونگی دریافت اطلاعیه ها ؟ هرگاه رویدادی رخ میدهد Scintilla آن را توسط WM__NOTIFY به پنجره والد میفرستد . پس شما برای خواندن طالاعیه از پنجره والد از کدی مثل کد زیر استفاده میکنید .

NMHDR *lpnmhdr;

[…]

case WM_NOTIFY:

lpnmhdr = (LPNMHDR) lParam;

if(lpnmhdr->hwndFrom==hwndScintilla)

{

switch(lpnmhdr->code)

{

case SCN_CHARADDED:

/* Hey, Scintilla just told me that a new */

/* character was added to the Edit Control.*/

/* Now i do something cool with that char. */

break;

}

}

break;

نظرات