ورود

View Full Version : تغییر رنگ editbox



majid zarei
دوشنبه 15 شهریور 1389, 10:00 صبح
سلام، من میخواهم در برنامه ای که دارم مقداری را که داخل editbox نمایش میدهم را با رنگ دلخواه بنویسم. اگر امکان دارد راهنماییم کنید . با تشکر:خجالت:

mehdi.mousavi
چهارشنبه 17 شهریور 1389, 11:27 صبح
سلام، من میخواهم در برنامه ای که دارم مقداری را که داخل editbox نمایش میدهم را با رنگ دلخواه بنویسم. اگر امکان دارد راهنماییم کنید . با تشکر:خجالت:

سلام.
ابتدا یک Handler برای WM_CTLCOLOR تعریف کنید و Handler مربوطه رو بدین شکل پیاده سازی کنید:


HBRUSH CWinAppDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor == CTLCOLOR_EDIT)
pDC->SetTextColor(RGB(255, 0, 0));

return hbr;
}


موفق باشید.

majid zarei
چهارشنبه 17 شهریور 1389, 14:19 عصر
با تشکر فراوان از توجه وراهنمایی شما، اما متاُسفانه بدلیل مبتدی بودن من، این توضیحات برای بنده قابل درک نیست. لطفا یک سورس برای مطالعه در این زمینه و یا یک سورس برنامه در این زمینه معرفی کنید.:گیج::خجالت:

mehdi.mousavi
چهارشنبه 17 شهریور 1389, 14:35 عصر
با تشکر فراوان از توجه وراهنمایی شما، اما متاشفانه بدلیل مبتدی بودن من، این توضیحات برای بنده قابل درک نیست. لطفا یک سورس برای مطالعه در این زمینه و یا یک سورس برنامه در این زمینه معرفی کنید.:گیج::خجالت:

سلام.
ساده ترین راهش اینه که توی Visual Studio، ابتدا Dialog مورد نظر رو در Resource Editor باز کنید، سپس روی Dialog اتون Right-Click کرده، Properties رو انتخاب کنید. سپس در پنجره Properties، آیکون Messages رو انتخاب کنید. از درون لیست موجود، پیام WM_CTLCOLOR رو پیدا کنید و روبروی اون، ComboBox مربوطه رو باز کنید. سپس گزینه Add OnCtlColor رو انتخاب کنید (با این کار Message Map شما بطور خودکار به روز میشه و تابع OnCtlColor به برنامه اضافه میشه).

حالا OnCtlColor رو پیدا کنید و اونو با که در فوق بهتون دادم به روز کنید.

موفق باشید.

مصطفی ساتکی
چهارشنبه 17 شهریور 1389, 14:41 عصر
یه edit روی فرم بزار و سپس برو به پنجره property که در سمت راست قرار داره سپس tab مربوط به message رو کلیک کن از اونجا پیام ٌWM_CtlColor رو پیدا کن و کد جناب موسوی رو بهش اضافه کن اگر میخاید دقیقاً خود همون کنترل رنگ زمینه اش عوض شه می تونید از اشاره گر pWnd.GetDlgCtlID رو با ID مربوط به edit قرار داده شده با صفحه مقایسه کنید در صورت برقرار بودن رنگ پشت زمینه مربوط به DC مروبطه رو تغییر دهید.
اگر شما با مطالب گفته شده آشنایی ندارید کتاب IVor Horton 2008 رو مطالعه کنید می تونه تا حدی بهتون کمک کنه.
برای آشنایی بیشتر کتاب Ivor Horton 2008 رو بهتون پیشنهاد می کنم.
موفق باشید.

majid zarei
چهارشنبه 17 شهریور 1389, 14:54 عصر
با سلام و تشکر فراوان، من با vc2006 کار می کنم. به هر شکل ممکن راهنمایی شما را پیاده کردم حالا چند سوال اضافه شد:
1) با این دستورات من فقط برای یک بار می توام رنگ رو عوض کنم.(به نظرم میاد) اگر بخواهم هر بار که عدد جدیدی می نویسم رنگ رو عوض کنم باید چه کنم؟
2) با این کار اگر چند editbox داشته باشم همگی یک رنگ می شن ، اگر بخاهم هر کدام یک رنگ داشته باشند باید چه کنم؟

با تشکر فراوان از راهنمایی های شما...:تشویق::خجالت:

mehdi.mousavi
چهارشنبه 17 شهریور 1389, 17:25 عصر
1) با این دستورات من فقط برای یک بار می توام رنگ رو عوض کنم.(به نظرم میاد) اگر بخواهم هر بار که عدد جدیدی می نویسم رنگ رو عوض کنم باید چه کنم؟
2) با این کار اگر چند editbox داشته باشم همگی یک رنگ می شن ، اگر بخاهم هر کدام یک رنگ داشته باشند باید چه کنم؟ با تشکر فراوان از راهنمایی های شما...

سلام.
بسیار خوب. اگر قصد دارید از این EditBox در بیش از یک نقطه استفاده کنید، روش صحیح SubClass کردن CEdit هستش. بدین ترتیب که کلاس جدیدی ایجاد می کنید، اونو از CEdit درایو میکنید، و هر جا که مایل بودید از این کلاس Derive شده استفاده میکنید.

برای اینکار، یه کلاس به برنامه اضافه کنید، اسمش رو CEditEx (یا هر چیزی که مایل بودید) بذارید. سپس، در فایل header اون، این کد رو بنویسید:

#pragma once
#include "afxwin.h"

class CEditEx :
public CEdit
{
public:

CEditEx(void);
~CEditEx(void);

DECLARE_MESSAGE_MAP()
afx_msg HBRUSH CtlColor(CDC* /*pDC*/, UINT /*nCtlColor*/);

private:
CBrush m_brBackground;
};

در فایل cpp نیز، این کد رو اضافه کنید:

#include "StdAfx.h"
#include "EditEx.h"

BEGIN_MESSAGE_MAP(CEditEx, CEdit)
ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()


CEditEx::CEditEx(void)
{
m_brBackground.CreateSolidBrush(RGB(255, 255, 255));
}

CEditEx::~CEditEx(void)
{
}

HBRUSH CEditEx::CtlColor(CDC* pDC, UINT nCtlColor)
{
if(nCtlColor == CTLCOLOR_EDIT)
pDC->SetTextColor(RGB(255, 0, 0));

return m_brBackground;
}

اینجا، من اینبار WM_CTLCOLOR_REFLECT رو میگیرم، اما کاری که انجام میدم، مثل روش قبلی هستش. در واقع در CtlColor رنگ متن رو به اون چیزی که مایلم تغییر میدم. اگر دوست دارید این رنگ در شرایط متفاوت مختلف باشه، میتونید به Constructor این کلاس رنگ دلخواهتون رو پاس کنید و از اون استفاده کنید. شما حتی میتونید با استفاده از یک Method جداگانه، رنگ EditBox رو Set یا Get (یا هر دو) کنید. در واقع، متودهایی به اسم GetTextColor و SetTextColor روی CEditEx تعریف کنید، و از بیرون، اونها رو هر طور که مایلید Call کنید.

در نهایت، توی Dialog خودتون، اونجایی که میخواهید از EditBox استفاده کنید، جای CEdit از CEditEx استفاده کنید.

موفق باشید.

majid zarei
جمعه 19 شهریور 1389, 08:57 صبح
با تشکر فراوان از شما دوست عزیز؛ اما من نتونستم این کار رو بکنم. در صورت امکان مرجع فارسی یا یک برنامه کامل در این زمینه به بنده معرفی کنید. اگه حوصله شما را سر می برم، پیشاپیش عذرخواهی می کنم. ممنون

مصطفی ساتکی
جمعه 19 شهریور 1389, 12:00 عصر
برای کسب اطلاعات بیشتر در این زمینه بهمراه sample می تونید به لینک زیر مراجعه کنید.
http://www.codeguru.com/cpp/controls/editctrl/backgroundcolor/
اگر دنبال کتاب فارسی هستید به نظر من Visual C++‎‎.Net انتشارات نص از همشون بهتره .
موفق باشید.

majid zarei
یک شنبه 21 شهریور 1389, 09:22 صبح
با تشکر از همه دوستان، با راهنمایی های شما و منبع اینترنتی که معرفی کرده بودید، مشکل بنده حل شد. از کلیه دوستان مبتدی که در این زمینه سوالی دارند، (در صورت بلد بودن ) حاضر به راهنمایی هستم.:تشویق::لبخندساده: