PDA

View Full Version : داشتن یک قالب کلی برای فرمهای ویندوز



sinpin
جمعه 20 مهر 1386, 12:47 عصر
:لبخندساده:
سلام
چه روشی رو برای داشتن یک ظاهر و قالب ثابت برای کنترلهای فرمهای ویندوز پیشنهاد میکنید ؟
منظور من چیزی مشابه : CSS, Themes و Skin در مورد فرمهای وب است.

من چند روش رو امتحان کردم که هرکدوم یکسری مشکلات خودشون رو داشتند مثل :
1- استفاده از Derived Control
2- اعمال تغییر در RunTime با استفاده از foreach روی تک تک کنترلها
و ...

بنظر شما راه حل مناسب چیه؟

Mahdi.Kiani
جمعه 20 مهر 1386, 12:52 عصر
XML میتونه انتخاب خوبی باشه
اکثر کامپوننت های نوشته شده در این زمینه نیز از XML استفاده می کنند
کامپوننت هایی مثل

SkinCrafter
IrisSkin
, ....
راستی چرا از این کامپوننت ها استفاده نمی کنین ؟
البته بعضی ها شون با فارسی یکم مشکل دارن

sinpin
جمعه 20 مهر 1386, 12:58 عصر
XML میتونه انتخاب خوبی باشه
اکثر کامپوننت های نوشته شده در این زمینه نیز از XML استفاده می کنند
کامپوننت هایی مثل

SkinCrafter
IrisSkin
, ....
راستی چرا از این کامپوننت ها استفاده نمی کنین ؟
البته بعضی ها شون با فارسی یکم مشکل دارن

دوست عزیز ممنون از توجهتون اما ترجیح میدم از کامپوننت استفاده نکنم.

Chabok
جمعه 20 مهر 1386, 13:04 عصر
شما میتونید یک فرم به عنوان baseForm در نظر بگیرید و سایر فرمها رو از اون به ارث ببرید
در این فرم خواص عمومی که در سایر فرمها هست رو تغییر بدین
از نظر رنگ بک گراند . آیکون صفحات . فونت صفحات . و سایر چیزهای ظاهری و حتی غیر ویژوال .
حالا حتی اگه در یکی از فرمها چیزی غیر از خواص عمومی بخواهید خود VS میاد و اون رو OverRide تعریف میکنه
مثلا اگه توی BaseForm تون رنگ پس زمینه رو آبی قرار بدین این رنگ توی همه فرمهایی که ارث بری شده اند هست
ولی حالا مثلا اگه خواستید بک گراند یک فرمتون قرمز باشه خیلی راحت در همون فرم رنگ بک گراند رو به قرمز تغییر بدین .
این کار باعث میشه تا این پراپرتی بصورت override تعریف بشه و حتی مجبور نباشید از همه خواص عمومی پیروی کنید

این بهترین راهی است که من تا حالا دیده ام و استفاده کرده ام
موفق باشید .

sinpin
جمعه 20 مهر 1386, 13:14 عصر
شما میتونید یک فرم به عنوان baseForm در نظر بگیرید و سایر فرمها رو از اون به ارث ببرید
در این فرم خواص عمومی که در سایر فرمها هست رو تغییر بدین
از نظر رنگ بک گراند . آیکون صفحات . فونت صفحات . و سایر چیزهای ظاهری و حتی غیر ویژوال .
حالا حتی اگه در یکی از فرمها چیزی غیر از خواص عمومی بخواهید خود VS میاد و اون رو OverRide تعریف میکنه
مثلا اگه توی BaseForm تون رنگ پس زمینه رو آبی قرار بدین این رنگ توی همه فرمهایی که ارث بری شده اند هست
ولی حالا مثلا اگه خواستید بک گراند یک فرمتون قرمز باشه خیلی راحت در همون فرم رنگ بک گراند رو به قرمز تغییر بدین .
این کار باعث میشه تا این پراپرتی بصورت override تعریف بشه و حتی مجبور نباشید از همه خواص عمومی پیروی کنید

این بهترین راهی است که من تا حالا دیده ام و استفاده کرده ام
موفق باشید .

از شما هم ممنونم
اما در مورد کنترلها چه راهی رو پیشنهاد میکنید ؟

PC2st
جمعه 20 مهر 1386, 15:56 عصر
من چند روش رو امتحان کردم که هرکدوم یکسری مشکلات خودشون رو داشتند مثل :
1- استفاده از Derived Control
2- اعمال تغییر در RunTime با استفاده از foreach روی تک تک کنترلها
و ...
به نظر من استفاده از ارث بری خیلی خوبه... میشه بپرسم که مشکلات چه بود؟

Chabok
جمعه 20 مهر 1386, 22:36 عصر
اگه از ظاهر اصلی کنترل ها خوشتون نمیاد و دوست دارید کنترل ها هم متفاوت باشه پس باید یک کلاس ارث بری شده از کنترلتون بسازید و کاستومایز کنید و از اون کنترل استفاده کنید .
ولی آخه مثلا یک تکست باکس غیر ForeColor , BGColor چیز به درد بخور دیگه ای نداره ؟
شاید مجبور باشید برای کنترل ها از کامپوننت ها استفاده کنید . نه از کنترل ها معمولی
همه چیز به خودتون بستگی داره
حتی میتونید یک کامپوننت دیگه که استفاده کردید رو یک کلاس ازش ارث بری کنید و پس از تنظیم به سلیقه خودتون همه جا استفاده کنید .

sinpin
یک شنبه 22 مهر 1386, 09:58 صبح
به نظر من استفاده از ارث بری خیلی خوبه... میشه بپرسم که مشکلات چه بود؟

مثلا فرض کنید یک تکست باکس مشتق شده دارید که یه سری خواص ظاهری داره و از اون خیلی جاها استفاده کردید. حالا یه دفعه تصمیم میگیرید که استایل اون رو عوض کنید. در این صورت باید دوباره تمام اون کنترلها رو به فرم هاتون اضافه کنید. (یعنی با تغییر کنترل اصلی اون خواص ظاهری به کنترلهای استفاده شده قبلی منتقل نمیشه.)

sinpin
یک شنبه 22 مهر 1386, 10:01 صبح
با تشکر از همه دوستانی که جواب دادند،
راستش من دنبال یه راه حل ساده مثل Skin ها در ASP.net هستم (و بدون استفاده از کامپوننتهای شرکتهای ثالث).
کسی راه بهتری سراغ نداره ؟

Chabok
یک شنبه 22 مهر 1386, 17:19 عصر
دوستان . با سلام مجدد
کی میدونه FireFox از چه روشی برای Theme های خود استفاده میکنه ؟
مثلا Theme هاش در یک فایل Jar هستن که پسوندش مهم نیست
فایل های داخلش مثلا یکی از این تمها رو چند قسمتش رو مینویسم

مثلا یکی از فایلها فایل contents.rdf است که محتویات داخلش اینه


<?xml version="1.0"?>

<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:chrome="http://www.mozilla.org/rdf/chrome#">

<!-- List all the skins being supplied by this theme -->
<RDF:Seq about="urn:mozilla:skin:root">
<RDF:li resource="urn:mozilla:skin:Noia2f" />
</RDF:Seq>

<!-- classic Information -->
<RDF:Description about="urn:mozilla:skin:Noia2f"
chrome:displayName="Noia 2.0(FULL)"
chrome:accessKey="N"
chrome:author="Kongkeat Kuatrakull (،éح§à،صآأµش ،راµأذ،ظإ)"
chrome:authorURL="http://kasteo.deviantart.com/"
chrome:description="Fully Firefox skinned based on Noia icon set by Carlitus."
chrome:name="Noia2f"
chrome:image="preview.png">
<chrome:packages>
<RDF:Seq about="urn:mozilla:skin:Noia2f:packages">
<RDF:li resource="urn:mozilla:skin:Noia2f:browser"/>
<RDF:li resource="urn:mozilla:skin:Noia2f:communicator"/>
<RDF:li resource="urn:mozilla:skin:Noia2f:help"/>
<RDF:li resource="urn:mozilla:skin:Noia2f:global"/>
<RDF:li resource="urn:mozilla:skin:Noia2f:mozapps"/>
</RDF:Seq>
</chrome:packages>
</RDF:Description>

<!-- Version Information. State that we work only with major version 1 of this package. -->
<RDF:Description about="urn:mozilla:skin:Noia2f:browser" chrome:skinVersion="1.5"/>
<RDF:Description about="urn:mozilla:skin:Noia2f:communicator" chrome:skinVersion="1.5"/>
<RDF:Description about="urn:mozilla:skin:Noia2f:help" chrome:skinVersion="1.5"/>
<RDF:Description about="urn:mozilla:skin:Noia2f:global" chrome:skinVersion="1.5"/>
<RDF:Description about="urn:mozilla:skin:Noia2f:mozapps" chrome:skinVersion="1.5"/>
</RDF:RDF>و فایل دیگری داره بنام install.rdf که اونم اینه :


<?xml version="1.0"?>

<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">

<Description about="urn:mozilla:install-manifest">
<em:id>{9f08cb5a-76b1-4bcf-aff9-90e1a5d60b1e}</em:id>
<em:version>3.01</em:version>

<!-- Target Application this extension can install into,
with minimum and maximum supported versions. -->
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>1.5</em:minVersion>
<em:maxVersion>1.6</em:maxVersion>
</Description>
</em:targetApplication>

<!-- Front End MetaData -->
<em:name>Noia 2.0 (eXtreme)</em:name>
<em:description>Fully skinned based on Noia icon set.</em:description>
<em:creator>Kongkeat Kuatrakull (،éح§à،صآأµش ،راµأذ،ظإ)</em:creator>
<em:contributor>Noia icons by Carlitus</em:contributor>
<em:homepageURL>http://kasteo.deviantart.com/</em:homepageURL>

<!-- Front End Integration Hooks (used by Theme Manager)-->
<em:internalName>Noia2f</em:internalName>

</Description>

</RDF>

و برای مثال یکی از فایل های دیگه اش که مربوط به Button ها می شود اینجوریه :


/* ===== button.css ================================================== ===
== Styles used by the XUL button element.
================================================== ===================== */

@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");

/* :::::::::: button :::::::::: */

/*Startcap*/
button {
-moz-appearance: none;
margin: 0px 5px;
min-width: 6.3em;
border: 0px;
background: url("chrome://global/skin/button/startcap.png") no-repeat top left transparent;
color: #000000;
font-family: arial, san-serif;
font-weight: bold;
height: 26px;
padding-left: 14px;
list-style-position: inside;
}

/* Right Endcap and body*/
.button-box {
border: 0px;
padding: 0px;
background: url("chrome://global/skin/button/endcap.png") no-repeat top right transparent;
padding-right: 14px;
}

/*Button Body*/
.button-text {
text-align: center;
font-weight: bold;
/*get rid of extra margin from labels; make compatible with default theme*/
margin: 0px !important;
}

/* :::::::::: focused state :::::::::: */

/*startcap:focus*/
button:focus {
background: url("chrome://global/skin/button/startcap-focus.png") no-repeat top left transparent;
}

/*right endcap:focus*/
button:focus > .button-box {
background: url("chrome://global/skin/button/endcap-focus.png") no-repeat top right transparent;
}


/* :::::::::: default state :::::::::: */

/* startcap:default */
button[default="true"] {
background: url("chrome://global/skin/button/startcap-active.png") no-repeat top left transparent;
color: #000000;
}

/*right endcap:default*/
button[default="true"] > .button-box {
background: url("chrome://global/skin/button/endcap-active.png") no-repeat top right transparent;
}


/* :::::::::: active state :::::::::: */

/*left endcap:active */
button:hover:active {
background: url("chrome://global/skin/button/startcap-active.png") no-repeat top left transparent;
}

/*right endcap:active*/
button:hover:active > .button-box {
background: url("chrome://global/skin/button/endcap-active.png") no-repeat top right transparent;
}

/* :::::::::: hover state :::::::::: */

/*startcap:hover*/
button:hover {
background: url("chrome://global/skin/button/startcap-focus.png") no-repeat top left transparent;
}

/*right endcap:hover*/
button:hover > .button-box {
background: url("chrome://global/skin/button/endcap-focus.png") no-repeat top right transparent;
}

/* :::::::::: disabled state :::::::::: */

/*left endcap:disabled */
button[disabled="true"] {
color: #D4D0C8;
background: url("chrome://global/skin/button/startcap-disabled.png") no-repeat top left transparent !important;
}

/*right endcap*/
button[disabled="true"] > .button-box {
background: url("chrome://global/skin/button/endcap-disabled.png") no-repeat top right transparent !important;
}


/* ::::: menu/menu-button buttons ::::: */

button[type="menu-button"] {
-moz-appearance: none !important;
-moz-box-align: center;
-moz-box-pack: center;
margin: 0;
border: none;
}

.button-menu-dropmarker,
.button-menubutton-dropmarker {
margin: 1px;
background-image: url("chrome://global/skin/arrow/arrow-dn.gif");
min-width:11px;
min-height:11px;
}

.button-menu-dropmarker[disabled="true"],
.button-menubutton-dropmarker[disabled="true"] {
background-image: url("chrome://global/skin/arrow/arrow-dn-dis.gif");
}

.button-menubutton-dropmarker[open="true"] {
margin: 2px 0px 0px 2px;
}

/* ::::: plain buttons ::::: */

button.plain {
-moz-appearance: none !important;
border: 0px !important;
margin: 0px !important;
padding: 0px !important;
}

button[type="disclosure"] {
-moz-appearance: none !important;
border: none !important;
background: none !important;
min-width: 0px !important;
background-color: transparent;
margin: 0px !important;
padding: 0px !important;
list-style-image: url("chrome://global/skin/button/twisty.png");
}
button[type="disclosure"] .button-box {
-moz-appearance: none !important;
border: none !important;
background: none !important;
}

button[type="disclosure"][open="true"] {
-moz-appearance: none !important;
border: none !important;
background: none !important;
list-style-image: url("chrome://global/skin/button/twisty-open.png");
}
button[type="disclosure"][open="true"] .button-box {
-moz-appearance: none !important;
border: none !important;
background: none !important;
}ظاهرا این ها شبیه CSS(Cascading Style Sheet) ها است
یعنی در اصل خودشون هستند . چون این ها هم در یک فایل button.css بود

حالا در کل کسی میدونه چجوری میشه تکنیک این بابا رو پیاده کرد ؟
یعنی استفاده از CSS ?

این ها هم گفتم مربوط به تم noia_2.0_extreme_-3.01 بود .
ممنون

PC2st
یک شنبه 22 مهر 1386, 18:31 عصر
در این صورت باید دوباره تمام اون کنترلها رو به فرم هاتون اضافه کنید.
وقتی از ارث بری استفاده میکنید، چه نیازی به این کار هست؟ مثلا کلاس MyTextBox رو در نظر بگیرید که از TextBox به ارث رسیده:


class MyTextBox : TextBox
{
override void OnPaint(...
...
}

کلاس MyTextBox استایل TextBox معمولی رو تغییر داده، پس هر وقت از کنترل MyTextBox استفاده کنید، در واقع از آن استایل جدید استفاده میکنید، مثلا من از این کلاس استفاده میکنم:


MyTextBox myy = new MyTextBox();
this.Controls.Add(myy);

فرض کنید من از این کلاس در چندین پروژه مختلف استفاده کردم، حالا مثلا میخوام که استایل اون کنترلها رو به شکل دیگری تغییر بدهم و برای اینکار کافیست که نحوه پیاده سازی کلاس MyTextBox رو تغییر بدهم و با اینکار همه کنترلها که در سایر پروژه ها ازش استفاده کردم هم شکلشون تغییر پیدا میکنه و دیگه لازم نیست که تک تک کنترلها رو دوباره به فرم اضافه کنید.

sinpin
چهارشنبه 25 مهر 1386, 10:59 صبح
وقتی از ارث بری استفاده میکنید، چه نیازی به این کار هست؟ مثلا کلاس MyTextBox رو در نظر بگیرید که از TextBox به ارث رسیده:


class MyTextBox : TextBox
{
override void OnPaint(...
...
}
کلاس MyTextBox استایل TextBox معمولی رو تغییر داده، پس هر وقت از کنترل MyTextBox استفاده کنید، در واقع از آن استایل جدید استفاده میکنید، مثلا من از این کلاس استفاده میکنم:


MyTextBox myy = new MyTextBox();
this.Controls.Add(myy);
فرض کنید من از این کلاس در چندین پروژه مختلف استفاده کردم، حالا مثلا میخوام که استایل اون کنترلها رو به شکل دیگری تغییر بدهم و برای اینکار کافیست که نحوه پیاده سازی کلاس MyTextBox رو تغییر بدهم و با اینکار همه کنترلها که در سایر پروژه ها ازش استفاده کردم هم شکلشون تغییر پیدا میکنه و دیگه لازم نیست که تک تک کنترلها رو دوباره به فرم اضافه کنید.

راستش رو بخواین منم همینطور فکر میکردم ولی در عمل متوجه شدم که همیشه اینطور نمیشه و گاهی با تغییر استایل کنترل اصلی لازم است اون کنترلها رو دوباره اد کنید.

sinpin
چهارشنبه 25 مهر 1386, 11:02 صبح
البته مشکل من در زمان دیزاین فرم است و اگه منظور شما اد کردن در زمان ران تایم باشه فکر کنم حق با شما باشه و مشکلی پیش نیاد.

sinpin
چهارشنبه 02 آبان 1386, 13:30 عصر
با تشکر از همه دوستان
کسی نظر دیگه ای نداره ؟