PDA

View Full Version : سوال: تنظیم جهت دکمه کشویی combobox



A_Salimi
جمعه 17 آبان 1387, 22:14 عصر
برنامه ای دارم که زبان انگلیسی و فارسی داره. در این برنامه combo box هایی دارم که اطلاعات درون آنها هم در موقع تغییر زبان به اون زبان تغییر میکنه .حالا میخوام بدونم چطور از طریق کد نویسی میتونم جهت دکمه کشویی combo box رو تغییر بدم .(این کار از طریق گزینه های تنظیمات از طریق تغییر مشخصه Right Align Text امکان پذیر است)

کارهایی که خودم انجام دادم :

در یک نمونه مثال که در codeproject دیدم که دقیقا این کار پیاده سازی میشد (البته با MFC و خانواده C نبود) هندل Edit box در آن combo box دریافت میشد و بعد هم پیغامهای EM_SETMARGINS با مقادیر EC_RIGHTMARGIN یاEC_LEFTMARGINرا به آن ارسال میکرد.

من هم به این صورت عمل کردم :

گرفتن هندل combo :



HWND hw=m_combo.GetSafeHwnd();

گرفتن هندل کادر ویرایشی آن :




CString Str;

HWND hwchild=::FindWindowEx(hw,NULL,NULL,Str);

فرستادن پیغام :




::PostMessage(hwchild, EM_SETMARGINS, EC_RIGHTMARGIN,100);



كه اين كار فقط متن داخل باکس را با توجه به پارامتر آخر در محل جدیدی قرار میداد.

میخواستم بدانم که اولا مشکل کد بالا چیست و ثانیا آیا راه ساده تری وجود ندارد ؟ در کل هر کنترل مشخصه های زیادی دارد ... روش رسیدن به هر مشخصه دلخواه و تغییر آن از طریق کد نویسی چیست ؟

با تشکر

Nima_NF
سه شنبه 21 آبان 1387, 16:40 عصر
یک چند روزی بود به کامپیوتر اصلی ام دسترسی نداشتم و حتی mdn هم نداشتم.

اگر هدفتان این است که کل combo-box برای حالت فارسی از راست به چپ شود، style نوع کنترل را با SetWindowLongPtr تغییر دهید(دقیقا همان طور که در properties تغییر می دهید):



SetWindowLongPtr( hwndCombo,
GWL_EXSTYLE,
GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_RIGHT);

در پارامتر 3 شما style قبلی را می گیرید به علاوه WS_EX_RIGHT می کنید تا کنترل از راست تنظیم شود. (اگر خطایی گرفتید در پارامتر 3 از GetWindowLongPtr استفاده کنید یا به صورت صریح به LONG_PTR تبدیل کنید )
البته در MFC یک متد با همین نام هست از آن استفاده کنید.

A_Salimi
سه شنبه 21 آبان 1387, 23:58 عصر
زمانی که از WS_EX_LEFT در پارامتر سوم استفاده کردم ، جهت combo تغییر نمیکرد که در هر حال به این صورت برای هر دو حالت چپ و راست جواب گرفتم :



::SetWindowLongPtr(m_combo.GetSafeHwnd(),GWL_EXSTY LE,WS_EX_RIGHT);
::SetWindowLongPtr(m_combo.GetSafeHwnd(),GWL_EXSTY LE,WS_EX_LEFT);



تايپيک را حل شده اعلان ميکنم.