PDA

View Full Version : RegisterClass و CreateWindow



taze kar
دوشنبه 20 تیر 1384, 15:30 عصر
با سلام

دوستان میشه لطف کنن و یه توضیح کوتاه در مورد استفاده از این توابع بدن .

و همین طور HINSTANCE
ممنون .

sh_roohani
دوشنبه 20 تیر 1384, 17:12 عصر
تابع RegisterClass کلاس یه پنجره رو در ویندوز ثبت می کنه. در ویندوز هر پنجره یه کلاس داره که بر اساس اون کلاس ساخته می شه. اسم این کلاس یه رشته کاراکتری هست و خصوصیاتی داره که یه پنجره خاص بر اساس اون ساخته می شه. مثلا کلاس "Button" برای کنترل کلید و کلاس "ComboBox" برای کنترل کمبوباکس. شما می تونید برای پنجره هایی که خودتون می سازید یه اسم کلاس در نظر بگیرید، اونو با RegisterClass ثبت کنید و بعد به هر تعدادی که می خواین از اون پنجره بسازید.
اما CreateWindow همونطور که از اسمش بر میاد برای ساختن یه پنجره از یه کلاس خاص و با مشخصات خاصی از قبیل اندازه و مختصات و ID و عنوان و... استفاده می شه.
برای اطلاعات بیشتر درباره RegisterClassEx به <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windowclasses/windowclassreference/windowclassfunctions/registerclassex.asp" target="_blank">اینجا</a> رجوع کنید.
برای اطلاعات بیشتر درباره CreateWindowEx به <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/createwindowex.asp" target="_blank">اینجا</a> رجوع کنید.

taze kar
سه شنبه 21 تیر 1384, 17:26 عصر
میشه لطفا یه مثال ساده بزنید
ممنون

sh_roohani
چهارشنبه 22 تیر 1384, 09:48 صبح
<p align="left" dir="ltr">
WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = ::DefWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = (HINSTANCE)::GetModuleHandle(NULL);
wc.hIcon = NULL;
wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = WC_NAVIGATION_WINDOW_CLASS_NAME;

RegisterClassEx(&wc);
</p>

ببخشید. اون جانور عجیب و غریبی که وسط کد می بینید از ترکیب : و D به دست اومده. شما به جای اون، از یه علامت دونقطه و یه حرف D استفاده کنید.

خوب، این مثالی از RegisterClassEx که واقعا تو یکی از برنامه هایی که نوشتم، واسه ساختن یه کنترل Custom به کار بردم. این ثابت WC_NAVIGATION_WINDOW_CLASS_NAME هم به صورا زیر تعریف شده:

<p align="left" dir="ltr">
#define WC_NAVIGATION_WINDOW_CLASS_NAME _T("WC_NavigationWindow")
</p>

اینم تابعی که واسه ایجاد یه پنجره از این کلاس به کار رفته:
<p align="left" dir="ltr">
m_wndNav.Create(WC_NAVIGATION_WINDOW_CLASS_NAME, NULL, 0, rcNavWin, this, ID_NAV_WIN);
</p>

taze kar
پنج شنبه 23 تیر 1384, 12:08 عصر
آقا ممنون .
میشه در مورد این _t یه توضیحاتی بدین که چیه .
و مثلا میشه یه کلاس رو رجیستر کرد و بعد توی یه برنامه دیگه ازش استفاده کرد ؟

sh_roohani
پنج شنبه 23 تیر 1384, 12:38 عصر
سلام،
این T_ یه ماکرو هست که اگر پروژه شما یونیکدی باشه، رشته رو به UNICODE تبدیل می کنه و در غیر این صورت به شکل ANSI اون دست نمی زنه. البته اینو خیلی با اغماض گفتم. اگه این ماکرو رو در محیط ++Visual C برید Trace کنید، دقیقا می بینید که چه طوری تعریف شده.
منم تو این کلاس از این ماکرو استفاده کردم، چون می خواستم این کلاس رو تو یه پروژه یونیکدی به کار ببرم، اما توصیه می کنم اگه کلاسی که می نویسید فقط قراره تو Windows کار کنه، از این ماکرو استفاده کنید. چون اونوقت کلاستون هم تو پروژه های یونیکدی کار می کنه، هم تو پروژه های ANSI.

taze kar
پنج شنبه 23 تیر 1384, 18:01 عصر
یه چیز دیگه

من اگه نخوام این پنجره ای که میسازم titlebar نداشته باشه باید wc.style رو چی بزارم . آخه هرچی توی MSDN گشتم ندیدم همه چیز بود جز اونی که میخواستم(شاید هم ندیدم)
و این که رنگش رو هرچی خواستم بزارم . نه اون ثابت هایی که تعریف شدن .:o

taze kar
یک شنبه 26 تیر 1384, 12:10 عصر
روحی جون کجایی ؟