گفتگو هایی در باب سی شارپ

the_king

مدیرکل انجمن
آها ممنون.
پس 2 بایت از اون 4 بایت را به مختصات x و 2 بایت دیگه شو به y اختصاص دادن.
--------------
من یه کلاس ساختم که از کنترل Panel ارث بری میکنه. میخوام وقتی موس رو روی این کنترل درگ میکنیم (کلیک میکنیم و جابجا میکنیم) ، کنترل والدش که فرم هست ، جابجا بشه (البته از روش کد زیر) .
در کد زیر ، وقتی موس رو روی Panel میبرم ، یه پیام شخصی به فرم ارسال میکنه (در کنترل Panel ام) :


کد:
    class MovablePanel : Panel
    {
        [DllImportAttribute("User32.dll", EntryPoint = "SendMessage")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr WParam, IntPtr LParam);
        private const int WM_NCHITTEST = 0x84;
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_NCHITTEST)
            {
                MovablePanel.SendMessage(this.Parent.Handle, 1024, new IntPtr(0), new IntPtr(1));
            }
            base.WndProc(ref m);
        }
    }

در کنترل فرم ام :

کد:
        private const int WM_NCHITTEST = 0x84;
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 1024)
            {
                m.Result = (IntPtr)2;
                return;
            }
            base.WndProc(ref m);
        }

پیام به کنترل فرم میرسه اما با کد m.Result = (IntPtr)2 ، جابجا نمیشه . چرا؟ این کد رو میشه تغییر داد تا کار کنه؟ اگه آره ، چجوری؟
اولا در کد همینطوری 1024 ننویسید، اسم ثابتش رو تعریف کنید تا هم بعدا که خودتون یادتون رفت و هم بقیه بفهمند منظور WM_USER ئه.
این پیام و پاسخی که بین دو پنجره رد و بدل کردید برای سیستم هیچ معنی خاصی نداره، چه 2 پس میفرستادید و چه 2222 به هر حال سیستم کاری انجام نمیداد.
پیام WM_USER شرحی نداره که مشخص باشه LParam و WParam اش برای چیه و چیکار میکنه. منطقی نداره که اگه 2 رو پس بفرسته ارتباطی با HTCAPTION در پیام WM_NCHITTEST داشته بشه، اینکه پیام WM_NCHITTEST نیست، پیام WM_USER ئه.
WM_USERیک پیام اختصاصی برنامه شما است که فقط خودتون میدونید مقادیرش چه معنی ای داره.
وقتی که ماوس میخواد روی پنجره ای Drag کنه، ماوس توسط پنجره Capture میشه تا پیام های جابجایی ماوس فقط توسط اون پنجره دریافت بشن. Capture شدن این ویژگی رو داره که حتی اگه ماوس از کادر پنجره دربیاد همچنان پیام ها به پنجره ارسال میشه، حتی اگه ماوس روی پنجره دیگری رفته باشه، تا زمانی که ماوس مجددا Release بشه.
پنجره MovablePanel شما مشکلی با WM_NCHITTEST پیشفرض نداره، چون هر نقطه داخل کادرش رو جزئی از خودش محسوب می کنه.
نیازی هم ندارید که محیط داخلش HTCAPTION محسوب بشه، چون نمیخواهید MovablePanel تون مستقل جابجا بشه، پس کاری به WM_NCHITTEST پنجره MovablePanel ندارید.
فقط و فقط میخواهید وقتی ماوس روی MovablePanel خواست Drag ای رو شروع کنه، بجاش پنجره والد شروع به جابجایی کنه.
کد:
    class MovablePanel : Panel
    {
        private const int WM_NCLBUTTONDOWN = 0xA1;
        private const int HTCAPTION = 2;

        [DllImportAttribute("User32.dll", EntryPoint = "SendMessage")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr WParam, IntPtr LParam);

        [DllImport("User32.dll")]
        private static extern int ReleaseCapture();

        protected override void OnMouseDown(MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                ReleaseCapture();
                SendMessage(Parent.Handle, WM_NCLBUTTONDOWN, new IntPtr(HTCAPTION), IntPtr.Zero);
                return;
            }
            base.OnMouseDown(e);
        }
    }

بعد اینکه استاد علی ، من نام پروژه ام را از VSS به PoshtibangirTolo تغییر دادم .
حالا توی تسک منیجر ، در قسمت اول ، همون نام Vss هست اما متن فرم که PoshtibangirTolo هست :

مشاهده پیوست 112329

چی کار باید کرد تا اون نوشته ی VSS در تسک منیجر هم به Poshtibangir Tolo تغییر کنه؟
منوی Project > {project name} Properties... > Application > Assembly Information
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد علی.
درباره ی همون قضیه ی کنترل transparent ، کلاسی (بنام TransparentControl) را نوشتم که پیوست میکنم .
حالا وقتی از این کلاس شی میسازم :


کد:
            Bitmap closeDefaultBitmap = new Bitmap(@"E:\Project\Visual Studio\C#.Net\Saved Project\0 Important Project\Poshtibangir Tolo\PoshtibangirTolo\bin\Debug\Icon\PanelToolBar\Setting\Setting.png");
            TransparentControl transparentControl = new TransparentControl(closeDefaultBitmap);
            transparentControl.Bounds = new Rectangle(new Point(20, 10), new Size(closeDefaultBitmap.Width, closeDefaultBitmap.Height));

            this.toolBarPanel.Controls.Add(transparentControl);

toolBarPanel هم نوعی پنل هه (شخصی سازی شده) .
حالا وقتی bitmap ای را بهش میدم (مسیر فایل png در بالا) ، با اونکه سایزش را برابر با سایز همون فایل میگیرم (در کد بالا مشص هست) اما سایز و حتی گاها شکل متفاوتی داره . چرا؟
الان در تصویر زیر ، پروژه ی سی شارپ (سمت راست) را در برابر پروژه ی اتوپلی (سمت چپ) قرار میدم و با هم مقایسه کنید . اونی که در اتوپلی نمایش میده ، دقیق هم سایز و دقیق هم شکل فایل اصلی هه :

1.JPG
در تصویر بالا ، هم شکل و هم یه کم سایز پروژه ی سی شارپ (سمت راست واسه سی شارپ هه) فرق داره .

2.JPG

اینجا که دیگه اندازه ی بسیار کوچیک در پروژه ی سی شارپ (سمت راست واسه سی شارپ هه) کاملا مشخص هه.
موقع رسم در کلاس TransparentControl در متد OnPaint هم از متد DrawImageUnscaled استفاده کردم.
الان مشکلش بخاطر چیه؟
البته این کلاس یه اشکالات کوچیکی داره که ان شاء ا... بعد از این قضیه رفع میکنم

-----------------------------------------------------------------------------------------------

ویرایش :

از متد DrawImage استفاده کردم و درست شد. اونم تازه این اورلودش که Rectangle (که سایز را) میگیره :
کد:
e.Graphics.DrawImage(this.EventBitmap[this.eventBitmapIndex], new Rectangle(new Point(0, 0), this.Size));
نمیدونم از اورلود اول این متد DrawImage که point را میگیره و طبق توضیحاتش برابر با اندازه ی اصلی bitmap رسم میکنه را میدم ، بازم درست نمیشه.
و همینطور دلیل اون متد DrawImageUnscaled را متوجع نشدم. دقیق به اندازه ی اندازه ی bitmap مون رسم میکنه دیگه . مگه نه؟ اما پس چرا مشکل داشت ، نمیدونم!
 

پیوست ها

  • TransparentControl.rar
    1.8 کیلوبایت · بازدیدها: 0
آخرین ویرایش:

the_king

مدیرکل انجمن
از متد DrawImage استفاده کردم و درست شد. اونم تازه این اورلودش که Rectangle (که سایز را) میگیره :
کد:
e.Graphics.DrawImage(this.EventBitmap[this.eventBitmapIndex], new Rectangle(new Point(0, 0), this.Size));
نمیدونم از اورلود اول این متد DrawImage که point را میگیره و طبق توضیحاتش برابر با اندازه ی اصلی bitmap رسم میکنه را میدم ، بازم درست نمیشه.
و همینطور دلیل اون متد DrawImageUnscaled را متوجع نشدم. دقیق به اندازه ی اندازه ی bitmap مون رسم میکنه دیگه . مگه نه؟ اما پس چرا مشکل داشت ، نمیدونم!
چون واحد های رسم متفاوته. ساده تر بگم بصورت پیشفرض DPI تصویری که میخواهید رسم کنید با DPI محیطی که داخلش رسم رو انجام میدید فرق داره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
آها متوجه شدم. خیلی ممنون.
پس بجز از متد بالا که گفتم روش دیگه اش این هست که از پروپرتی های HorizontalResolution و VerticalResolution مقدار dpi را بگیریم و با متد SetResolution ، اون dpi و اطلاعات گرفته شده را ست کنیم؟
--------------------------
کلاس TransparentControl را که نوشتم ، در زیر پیوست میکنم (آپدیتش کردم و نسبت به اونی که در چند پست بالا گذاشتم ، بعضی از اعضاش فرق داره)
حالا وقتی اون کلاس را به پروژه تون اضافه کردین ، کد زیر را در رویدادی اضافی کنید :


کد:
        private void Button1_Click(object sender, EventArgs e)
        {
            string path = Application.StartupPath + @"\Icon\PanelToolBar\Close\Close.png";
            Bitmap closeDefaultBitmap = new Bitmap(path);
            Bitmap opacityBitmap = TransparentControl.SetOpacity(closeDefaultBitmap, 10);
            TransparentControl transparentControl = new TransparentControl(opacityBitmap, new Point(868, 80));

            this.Controls.Add(transparentControl);

            ////////////////////////////////////////
            // دومین کنترل
            string path_2 = Application.StartupPath + @"\Icon\PanelToolBar\Close\Close.png";
            Bitmap closeDefaultBitmap_2 = new Bitmap(path_2);
            Bitmap opacityBitmap_2 = TransparentControl.SetColor(closeDefaultBitmap_2, Color.Yellow);
            TransparentControl transparentContro_2 = new TransparentControl(opacityBitmap_2, new Point(800, 80));

            this.Controls.Add(transparentContro_2);
        }

حالا این مشکل را داره که اون کنترلی که opacity اش کم هست (کنترل اولی transparentControl که opacity اش کم و 10 هست) ، کلفت تر از حالت استانداردش هست . چرا؟ من توی کد ام (مخصوصا در کد متد استاتیک SetColorOpacity در کلاس TransparentControl) مشکلی نتونستم پیدا کنم برای این موضوع . پس مشکل کجاست؟

دوم اینکه هر چند این دو کنترل ، دو کنترل مجزا (و new شده) هستن و هم Bitmap شون ، دو شی Bitmap مجزا هستن ولی وقتی موس را چندین بار روی کنترل اولی ببریم ، کنترل دومی (رنگ زرد) ، کلفت تر میشه و وقتی موس را چندین بار روی کنترل دومی ببریم ، کنترل دومی (اونی که opacity اش کم و 10 هست) ، مقدار opacity اش همینطور بیشتر و بیشتر میشه!
اما موس را روی هر کدوم از این کنترل ها که میبرم ، به حالت اولیه اش برمیگرده.
این هم بخاطر چه مشکلی از کد کلاس TransparentControl هست؟

اینم بگم که در همین کلاس ، در رویداد Invalidate از همه ی کنترل های والدش (کنترل های والد کنترل TransparentControl ) گفتم که متد Invalidate همین کنترل ( کنترل TransparentControl ) را اجرا کنه . یعنی هر وقت هر کنترل والدش (یا والد والدش یا والد والد والدش و ....) ، Invalidate شد ، این کنترل هم متد Invalidate اش را اجرا میکنه .
توی رویدادهای OnMouseEnter و OnMouseDown و OnMouseUp و OnMouseLeave هم کنترل والدش را Invalidate کردم (فقط اون قسمتی که این کنترل هست) .

خیلی ممنون استاد علی :rose:
 

پیوست ها

  • TransparentControl.rar
    2.2 کیلوبایت · بازدیدها: 2

the_king

مدیرکل انجمن
آها متوجه شدم. خیلی ممنون.
پس بجز از متد بالا که گفتم روش دیگه اش این هست که از پروپرتی های HorizontalResolution و VerticalResolution مقدار dpi را بگیریم و با متد SetResolution ، اون dpi و اطلاعات گرفته شده را ست کنیم؟
در همه مثال هایی که در انجمن نوشتم همونطور با دو تا Rectangle مشخصش کردم، اگه نخواهید ابعاد به اندازه مانیتور و تنظیماتی که کاربر برای نمایش تنظیم کرده ربط داشته باشه درستش همونه، خیالتون راحت.

حالا این مشکل را داره که اون کنترلی که opacity اش کم هست (کنترل اولی transparentControl که opacity اش کم و 10 هست) ، کلفت تر از حالت استانداردش هست . چرا؟ من توی کد ام (مخصوصا در کد متد استاتیک SetColorOpacity در کلاس TransparentControl) مشکلی نتونستم پیدا کنم برای این موضوع . پس مشکل کجاست؟
این SetColorOpacity که شما کدش رو نوشتید یا از جایی کپی کردید اصلا کاری به این نداره که png نیمه شفاف خودش برای هر پیکسل alpha مجزایی داره و باید اون alpha ها رو مستقل به نسبت opacity تعیین شده کم کنه، همینطور کیلویی میخواد alpha همه پیکسل ها رو یکسان کنه، همین میشه دیگه. opacity برابر 50 درصد معنی اش این نیست که alpha همه پیکسل ها بشه 127
اگه شما پیکسلی در importBitmap داشتید که alpha اش 80 بود و میخواهید opacity برابر 50 درصد باشه، alpha اون پیکسل در exportBitmap باید 40 بشه، نه 127.

دوم اینکه هر چند این دو کنترل ، دو کنترل مجزا (و new شده) هستن و هم Bitmap شون ، دو شی Bitmap مجزا هستن ولی وقتی موس را چندین بار روی کنترل اولی ببریم ، کنترل دومی (رنگ زرد) ، کلفت تر میشه و وقتی موس را چندین بار روی کنترل دومی ببریم ، کنترل دومی (اونی که opacity اش کم و 10 هست) ، مقدار opacity اش همینطور بیشتر و بیشتر میشه!
اما موس را روی هر کدوم از این کنترل ها که میبرم ، به حالت اولیه اش برمیگرده.
این هم بخاطر چه مشکلی از کد کلاس TransparentControl هست؟
اساس کار مشخصه، شما یا باید اصلا قید پنجره شفاف رو بزنید، یا قبل از هر رسم هر چیزی که زیر پنجره بوده مجددا رسم کنید.
همون مشکل اساسی پنجره شفاف، هر چقدر که بهش فکر نکنید باز سر جاشه.
الان شما رسم زمینه رو غیر فعال کردید تا شفاف به نظر بیاد.
هر رسمی که انجام میدید روی رسم قبلی خودتون بوده، چون نه میتونید زیرش رو پاک کنید و نه تصویری از زیرش دارید که بکشید.
نمیتونید هم بگید زیرش بمونه ولی رسم قبلی من پاک بشه تا مجدد رسم کنم. اگه opacity اش یک درصد هم باشه لایه لایه به تدریج پر رنگ میشه.

اینم بگم که در همین کلاس ، در رویداد Invalidate از همه ی کنترل های والدش (کنترل های والد کنترل TransparentControl ) گفتم که متد Invalidate همین کنترل ( کنترل TransparentControl ) را اجرا کنه . یعنی هر وقت هر کنترل والدش (یا والد والدش یا والد والد والدش و ....) ، Invalidate شد ، این کنترل هم متد Invalidate اش را اجرا میکنه .
توی رویدادهای OnMouseEnter و OnMouseDown و OnMouseUp و OnMouseLeave هم کنترل والدش را Invalidate کردم (فقط اون قسمتی که این کنترل هست) .
کنترل خودتون Invalidate شدنش باعث رسم زیرش نمیشه. اون چیزی که شما به عنوان زیرش میبینید رسم پنجره زیرش بوده، نه خودش. و چیزی که زیر کنترل تون هست هم الزاما والدش نیست.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
در همه مثال هایی که در انجمن نوشتم همونطور با دو تا Rectangle مشخصش کردم، اگه نخواهید ابعاد به اندازه مانیتور و تنظیماتی که کاربر برای نمایش تنظیم کرده ربط داشته باشه درستش همونه، خیالتون راحت.


این SetColorOpacity که شما کدش رو نوشتید یا از جایی کپی کردید اصلا کاری به این نداره که png نیمه شفاف خودش برای هر پیکسل alpha مجزایی داره و باید اون alpha ها رو مستقل به نسبت opacity تعیین شده کم کنه، همینطور کیلویی میخواد alpha همه پیکسل ها رو یکسان کنه، همین میشه دیگه. opacity برابر 50 درصد معنی اش این نیست که alpha همه پیکسل ها بشه 127
اگه شما پیکسلی در importBitmap داشتید که alpha اش 80 بود و میخواهید opacity برابر 50 درصد باشه، alpha اون پیکسل در exportBitmap باید 40 بشه، نه 127.

سلامی مجدد
خیلی ممنون استاد علی.
آها متوجه شدم. هر چند به این قضیه فکر میکردم اما حدس نمیزدم این مشکل واسه ی این باشه

اساس کار مشخصه، شما یا باید اصلا قید پنجره شفاف رو بزنید، یا قبل از هر رسم هر چیزی که زیر پنجره بوده مجددا رسم کنید.
همون مشکل اساسی پنجره شفاف، هر چقدر که بهش فکر نکنید باز سر جاشه.
الان شما رسم زمینه رو غیر فعال کردید تا شفاف به نظر بیاد.
هر رسمی که انجام میدید روی رسم قبلی خودتون بوده، چون نه میتونید زیرش رو پاک کنید و نه تصویری از زیرش دارید که بکشید.
نمیتونید هم بگید زیرش بمونه ولی رسم قبلی من پاک بشه تا مجدد رسم کنم. اگه opacity اش یک درصد هم باشه لایه لایه به تدریج پر رنگ میشه.

خوب من در متدها و رویدادهای OnMouseEnter و OnMouseDown و OnMouseUp و OnMouseLeave ، گفتم که parent اش را Invalidate کنه دیگه .
شما هم گفته بودین و من هم در تست قبلی تست کردم که وقتی کنترل parent شون Invalidate بشه ، رسم در همین کنترل TransparentControl ، پاک میشه. بعد هم در همین رویدادها و متدها گفتم که هر کنترل Parent شون که Invalidate شد ، کنترل TransparentControl را هم Invalidate کنه برای رسم مجدد.

بعد هم فرضا هم که این قضیه اصلا نبود . یعنی قضیه ی Invalidate شدن parent و پاک شدن رسم کنترل های TransparentControl هم نبود . سئوال اینجاست که وقتی دو شی مجزا هستن ، چرا وقتی موس رو روی یکی شون میبریم و برمیگردیم (کد متد OnMouseEnter و OnMouseDown اجرا میشه) ، اون شی دیگه تحت تاثیر قرار میگیره؟!! اینش واسم خیلی تعجب داره . دو شی new شده و کاملا مجزا هستن که . بهم reference نشدن.

کنترل خودتون Invalidate شدنش باعث رسم زیرش نمیشه. اون چیزی که شما به عنوان زیرش میبینید رسم پنجره زیرش بوده، نه خودش. و چیزی که زیر کنترل تون هست هم الزاما والدش نیست.

من دقیقا منظورتون را متوجه نشدم.
منظورتون از کلمه ی "زیرش" دقیقا چیه؟
منظورتون اینه که وقتی کنترل TransparentControl را Invalidate میکنم ، باعث نمیشه توی کنترل parent اش ، رسم انجام بشه؟
اگه منظورتون اینه ، خوب این رو میدونم . رسم انجام نشه . ربظش را به موضوع دقیق متوجه نشدم.
 

the_king

مدیرکل انجمن
بعد هم فرضا هم که این قضیه اصلا نبود . یعنی قضیه ی Invalidate شدن parent و پاک شدن رسم کنترل های TransparentControl هم نبود . سئوال اینجاست که وقتی دو شی مجزا هستن ، چرا وقتی موس رو روی یکی شون میبریم و برمیگردیم (کد متد OnMouseEnter و OnMouseDown اجرا میشه) ، اون شی دیگه تحت تاثیر قرار میگیره؟!! اینش واسم خیلی تعجب داره . دو شی new شده و کاملا مجزا هستن که . بهم reference نشدن.
تعجبی نداره، Invalidate کردن هاتون رو در نظر میگیرید؟ شما می توانید کدهایی که نوشتید رو comment کنید و ذره ذره uncomment کنید تا ببینید چطور این شرایط رو ایجاد می کنید.

من دقیقا منظورتون را متوجه نشدم.
منظورتون از کلمه ی "زیرش" دقیقا چیه؟
منظورتون اینه که وقتی کنترل TransparentControl را Invalidate میکنم ، باعث نمیشه توی کنترل parent اش ، رسم انجام بشه؟
اگه منظورتون اینه ، خوب این رو میدونم . رسم انجام نشه . ربظش را به موضوع دقیق متوجه نشدم.
منظورم از زیرش یعنی یک یا چند پنجره ای است که در لایه های پایینتر از اون پنجره WS_EX_TRANSPARENT شما قرار داره و حداقل بخشی از مساحت اونها در کادر کنترل تون قابل مشاهده است.
ربطش اینه که شما نباید و نمی توانید رسمی داخل پنجره کنترل تون داشته باشید، مگر اینکه همه رسم های زیرش که مربوط به یک یا چند تا پنجره دیگه میشه انجام شده باشه. ربطش اینه. اگر ربط نداشت که به همه کنترل های روی فرم یک ویژگی WS_EX_TRANSPARENT اضافه میکردید و شفاف و نیمه شفاف میشدن.
شما اگر بخواهید چیزی رسم کنید نمی توانید همینطوری با یک Invalidate برید سراغ رسم خودتون.
برای پنجره های عادی این سلسله مراتب لازم نیست ولی برای پنجره های WS_EX_TRANSPARENT این قاعده هست، قبلا به این مساله اشاره کردم.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
تعجبی نداره، Invalidate کردن هاتون رو در نظر میگیرید؟ شما می توانید کدهایی که نوشتید رو comment کنید و ذره ذره uncomment کنید تا ببینید چطور این شرایط رو ایجاد می کنید.


منظورم از زیرش یعنی یک یا چند پنجره ای است که در لایه های پایینتر از اون پنجره WS_EX_TRANSPARENT شما قرار داره و حداقل بخشی از مساحت اونها در کادر کنترل تون قابل مشاهده است.
ربطش اینه که شما نباید و نمی توانید رسمی داخل پنجره کنترل تون داشته باشید، مگر اینکه همه رسم های زیرش که مربوط به یک یا چند تا پنجره دیگه میشه انجام شده باشه. ربطش اینه. اگر ربط نداشت که به همه کنترل های روی فرم یک ویژگی WS_EX_TRANSPARENT اضافه میکردید و شفاف و نیمه شفاف میشدن.
شما اگر بخواهید چیزی رسم کنید نمی توانید همینطوری با یک Invalidate برید سراغ رسم خودتون.
برای پنجره های عادی این سلسله مراتب لازم نیست ولی برای پنجره های WS_EX_TRANSPARENT این قاعده هست، قبلا به این مساله اشاره کردم.

آها خیلی ممنونم
چون موقع رویدادها (ورود موس روی کنترل و ...) گفتم که فقط اون قسمتی از کنترل parent را که کنترل TransparentControl هست را Invalidate کن ، پس بقیه ی قسمت های اون کنترل parent را که بقیه ی کنترل های TransparentControl هست را Invalidate نمیکنه و رسم جدید روی رسم قبلی اش انجام میشد .
متوجه شدم . خیلی ممنون استاد علی :rose:
 

SU-57

Active Member
سلام
استاد علی این جدول رو در نظر بگیر

qzki_sdf.png

1- موجودیت های توی این جدول کدوم ها هستن؟ چون تو هر سایتی یک چیزی رو موجودیت معرفی کرده. یکی گفته Employees و یکی گفته هر کدوم از نام های افراد
2- بالای هر ستون یک نامی اومده مثل FName یا LName. آیا اونها هم فیلد هستند؟
3- توی یک سایت گفته فیلد فقط هر کدوم از اون مکان های خالی است که ما داده ها رو وارد می کنیم اما توی سایت دیگه گفته کل یک ستون فیلده مثل کل یک ردیف که رکورده
 

the_king

مدیرکل انجمن
سلام
استاد علی این جدول رو در نظر بگیر

qzki_sdf.png

1- موجودیت های توی این جدول کدوم ها هستن؟ چون تو هر سایتی یک چیزی رو موجودیت معرفی کرده. یکی گفته Employees و یکی گفته هر کدوم از نام های افراد
به Employees به دید ماهیت مجموعه کارمندان نگاه کنید نه فقط یک جدول بی معنا. همه شون موجودیت هستند. هر موردی که ذخیره می کنید تا بعدا بهشون دسترسی داشته باشید و براتون اهمیت داره موجودیت ئه.
همونطور که مجموعه کارمندان موجودیته، یک کارمند هم موجودیت ئه، و نام خانوادگی کارمند هم موجودیته.
2- بالای هر ستون یک نامی اومده مثل FName یا LName. آیا اونها هم فیلد هستند؟
برای Schema اون جدول که ستون ها داخلش تعریف شده، بله. ولی قاطی داده های داخل جدول تون نیست. جدول تون هیچ سطری هم که نداشته باشه اون عنوان ستون ها سر جاشون در Schema هستند.
3- توی یک سایت گفته فیلد فقط هر کدوم از اون مکان های خالی است که ما داده ها رو وارد می کنیم اما توی سایت دیگه گفته کل یک ستون فیلده مثل کل یک ردیف که رکورده
دو دید متفاوت نسبت به مفاهیم پایگاه داده است، هیچکدوم درست یا اشتباه یا درست تر نیست. مفاهیم پایگاه داده با پیاده سازی هایی که در فلان نرم افزار مدیریت پایگاه داده هست الزاما تطابق نداره، به همین جهت خیلی عادیه که بین مفاهیم کلی و تعاریف عملی در مورد فلان پایگاه داده خاص تفاوتی باشه.
مثل اینه که بگم فیلد اون خانه هایی است که رنگشون سفید ئه. شاید در مورد یک محیط خاص همینطور باشه. ولی حالا اگه رنگش زرد بود دیگه فیلد نمیتونه باشه؟ باید حتما سفید باشه؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
آها متوجه شدم. خیلی ممنون.
پس بجز از متد بالا که گفتم روش دیگه اش این هست که از پروپرتی های HorizontalResolution و VerticalResolution مقدار dpi را بگیریم و با متد SetResolution ، اون dpi و اطلاعات گرفته شده را ست کنیم؟
--------------------------
کلاس TransparentControl را که نوشتم ، در زیر پیوست میکنم (آپدیتش کردم و نسبت به اونی که در چند پست بالا گذاشتم ، بعضی از اعضاش فرق داره)
حالا وقتی اون کلاس را به پروژه تون اضافه کردین ، کد زیر را در رویدادی اضافی کنید :


کد:
        private void Button1_Click(object sender, EventArgs e)
        {
            string path = Application.StartupPath + @"\Icon\PanelToolBar\Close\Close.png";
            Bitmap closeDefaultBitmap = new Bitmap(path);
            Bitmap opacityBitmap = TransparentControl.SetOpacity(closeDefaultBitmap, 10);
            TransparentControl transparentControl = new TransparentControl(opacityBitmap, new Point(868, 80));

            this.Controls.Add(transparentControl);

            ////////////////////////////////////////
            // دومین کنترل
            string path_2 = Application.StartupPath + @"\Icon\PanelToolBar\Close\Close.png";
            Bitmap closeDefaultBitmap_2 = new Bitmap(path_2);
            Bitmap opacityBitmap_2 = TransparentControl.SetColor(closeDefaultBitmap_2, Color.Yellow);
            TransparentControl transparentContro_2 = new TransparentControl(opacityBitmap_2, new Point(800, 80));

            this.Controls.Add(transparentContro_2);
        }

حالا این مشکل را داره که اون کنترلی که opacity اش کم هست (کنترل اولی transparentControl که opacity اش کم و 10 هست) ، کلفت تر از حالت استانداردش هست . چرا؟ من توی کد ام (مخصوصا در کد متد استاتیک SetColorOpacity در کلاس TransparentControl) مشکلی نتونستم پیدا کنم برای این موضوع . پس مشکل کجاست؟

دوم اینکه هر چند این دو کنترل ، دو کنترل مجزا (و new شده) هستن و هم Bitmap شون ، دو شی Bitmap مجزا هستن ولی وقتی موس را چندین بار روی کنترل اولی ببریم ، کنترل دومی (رنگ زرد) ، کلفت تر میشه و وقتی موس را چندین بار روی کنترل دومی ببریم ، کنترل دومی (اونی که opacity اش کم و 10 هست) ، مقدار opacity اش همینطور بیشتر و بیشتر میشه!
اما موس را روی هر کدوم از این کنترل ها که میبرم ، به حالت اولیه اش برمیگرده.
این هم بخاطر چه مشکلی از کد کلاس TransparentControl هست؟

اینم بگم که در همین کلاس ، در رویداد Invalidate از همه ی کنترل های والدش (کنترل های والد کنترل TransparentControl ) گفتم که متد Invalidate همین کنترل ( کنترل TransparentControl ) را اجرا کنه . یعنی هر وقت هر کنترل والدش (یا والد والدش یا والد والد والدش و ....) ، Invalidate شد ، این کنترل هم متد Invalidate اش را اجرا میکنه .
توی رویدادهای OnMouseEnter و OnMouseDown و OnMouseUp و OnMouseLeave هم کنترل والدش را Invalidate کردم (فقط اون قسمتی که این کنترل هست) .

خیلی ممنون استاد علی :rose:

بعد استاد علی ، چرا متد سازنده ی سومی ، یعنی وقتی که text را مقداردهی میکنیم ، کار نمیکنه و متن را رسم نمیکنه؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بعد اینکه استاد علی ، همونطور که قبلا گفتین و تصحیح کردم ، الگوریتم زیر :
کد:
        private static void SetColorOpacity(Bitmap importBitmap, ref Bitmap exportBitmap, int opacity = -1, Color color = new Color())
        {
            int resultOpacity = opacity;
            Color resultColor = color;


            for (int y = 0; y < importBitmap.Height; y++)
            {
                for (int x = 0; x < importBitmap.Width; x++)
                {
                    Color importBtmpColor = importBitmap.GetPixel(x, y);
                    if (importBtmpColor.A > 0)
                    {
                        if (opacity == -1)
                        {
                            resultOpacity = importBtmpColor.A;
                        }
                        else
                        {
                            resultOpacity = importBtmpColor.A;
                            resultOpacity = Convert.ToInt32(resultOpacity * ((float)opacity / 100));
                        }

                        if (color.IsEmpty == true)
                        {
                            resultColor = importBtmpColor;
                        }
                       
                        Color exportBtmpColor = Color.FromArgb(resultOpacity, resultColor);
                        exportBitmap.SetPixel(x, y, exportBtmpColor);
                    }

                }
            }
        }

یعنی خط

کد:
                            resultOpacity = importBtmpColor.A;
                            resultOpacity = Convert.ToInt32(resultOpacity * ((float)opacity / 100));

برای وقتی که یه bitmap ای را که opacity اش زیاد باشه (مثلا 100 باشه) و مقدار پارامتر opacity برای این تابع را کمتر از opacity ای که خود bitmap داره ، بدیم (مثلا مقدار opacity را 50 بدیم) ، مشکلی نداره و درست عمل میکنه اما برعکسش عمل نمیکنه . یعنی وقتی که bitmap مون مثلا opacity اش 50 باشه و ما مقدار پارامتر opacity برای این تابع را از چیزی که هست بالاتر بدیم (مثلا 100 بدیم) ، عمل نمیکنه .
چجور باید الگوریتم بالا را تغییر داد تا توی هر دو عمل کنه؟
اگه توضیحی هم واسه اون الگوریتم بدین ، ممنون میشم.
خیلی ممنون
 

the_king

مدیرکل انجمن
بعد اینکه استاد علی ، همونطور که قبلا گفتین و تصحیح کردم ، الگوریتم زیر :
کد:
        private static void SetColorOpacity(Bitmap importBitmap, ref Bitmap exportBitmap, int opacity = -1, Color color = new Color())
        {
            int resultOpacity = opacity;
            Color resultColor = color;


            for (int y = 0; y < importBitmap.Height; y++)
            {
                for (int x = 0; x < importBitmap.Width; x++)
                {
                    Color importBtmpColor = importBitmap.GetPixel(x, y);
                    if (importBtmpColor.A > 0)
                    {
                        if (opacity == -1)
                        {
                            resultOpacity = importBtmpColor.A;
                        }
                        else
                        {
                            resultOpacity = importBtmpColor.A;
                            resultOpacity = Convert.ToInt32(resultOpacity * ((float)opacity / 100));
                        }

                        if (color.IsEmpty == true)
                        {
                            resultColor = importBtmpColor;
                        }
                   
                        Color exportBtmpColor = Color.FromArgb(resultOpacity, resultColor);
                        exportBitmap.SetPixel(x, y, exportBtmpColor);
                    }

                }
            }
        }

یعنی خط

کد:
                            resultOpacity = importBtmpColor.A;
                            resultOpacity = Convert.ToInt32(resultOpacity * ((float)opacity / 100));

برای وقتی که یه bitmap ای را که opacity اش زیاد باشه (مثلا 100 باشه) و مقدار پارامتر opacity برای این تابع را کمتر از opacity ای که خود bitmap داره ، بدیم (مثلا مقدار opacity را 50 بدیم) ، مشکلی نداره و درست عمل میکنه اما برعکسش عمل نمیکنه . یعنی وقتی که bitmap مون مثلا opacity اش 50 باشه و ما مقدار پارامتر opacity برای این تابع را از چیزی که هست بالاتر بدیم (مثلا 100 بدیم) ، عمل نمیکنه .
چجور باید الگوریتم بالا را تغییر داد تا توی هر دو عمل کنه؟
اگه توضیحی هم واسه اون الگوریتم بدین ، ممنون میشم.
خیلی ممنون
قبلا پیشنهاد کردم، همچنان هم پیشنهاد می کنم که بجای GetPixel و SetPixel های متوالی از LockBits استفاده کنید :
گفتگو هایی در باب سی شارپ
تحریک برنامه vb6 به وسیله #c

در ضمن اگر مقدار Opacity تون 50 درصد باشه، شفافیت نصف میشه، اگر 100 درصد باشه تغییری نمیکنه و اگر 200 درصد باشه دو برابر میشه. منطقی نیست که 100 درصدش کنید و توقع داشته باشید تغییری بکنه.
الگوریتم تون رو هم ساده و بهینه کنید، اگر لازمه مقداری رو تکراری بدست بیارید، مثلا opacity رو به 100 تقسیم کنید بجای اینکه بارها و بارها در حلقه انجامش بدید بیرون حلقه در یک متغیر ذخیره اش کنید.
اگر لازمه یک if ای رو مدام چک کنید چرا داخل حلقه باشه. بجای اینکه داخل حلقه قرارش بدید اول if رو با else اش بنویسید و حلقه ها رو تفکیک شده داخل if و else اش قرار بدید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
قبلا پیشنهاد کردم، همچنان هم پیشنهاد می کنم که بجای GetPixel و SetPixel های متوالی از LockBits استفاده کنید :
گفتگو هایی در باب سی شارپ
تحریک برنامه vb6 به وسیله #c

در ضمن اگر مقدار Opacity تون 50 درصد باشه، شفافیت نصف میشه، اگر 100 درصد باشه تغییری نمیکنه و اگر 200 درصد باشه دو برابر میشه. منطقی نیست که 100 درصدش کنید و توقع داشته باشید تغییری بکنه.
الگوریتم تون رو هم ساده و بهینه کنید، اگر لازمه مقداری رو تکراری بدست بیارید، مثلا opacity رو به 100 تقسیم کنید بجای اینکه بارها و بارها در حلقه انجامش بدید بیرون حلقه در یک متغیر ذخیره اش کنید.
اگر لازمه یک if ای رو مدام چک کنید چرا داخل حلقه باشه. بجای اینکه داخل حلقه قرارش بدید اول if رو با else اش بنویسید و حلقه ها رو تفکیک شده داخل if و else اش قرار بدید.

خیلی ممنون استاد علی
میگم من الان مثال ها و پست های قبلی تون را میبینم ، بیشتراز قبل متوجه میشم . همیشه چند منزل عقبم :green:
حالا ایمیجی که طرف میده ، بیشتر ساخته شده برای ایمیج های کوچیک . مثلا برای بیت مپ هایی در ابعاد حداکثر 100 در 100 (بصورت استاندارد 25 در 25) وگرنه معنایی نداره که یه بیت مپی به عنوان شکل یه کنترل با ابعاد بزرگتر از این داده بشه . با این حال هم پیشنهاد میکنید از LockBit استفاده کنم؟ چون خوانایی و کار کردن با این کد بیشتره و در ابعاد کوچیک هم سرعت خوبی داره و هم اینکه این کلاس از اساس ساخته نشد که افکت ها (مثل کم و زیاد کردن opacity و تغییر رنگ بیت مپ و ...) را برای کاربر بسازه . فقط من باب اینکه دو افکت تغییر opacity و تغییر color ، خیلی کاربرد داره ، این متد را گذاشتم تا کاربر خودش تغییر رنگش را محاسبه نکنه و بعد به پروپرتی MouseEnterBitmap بده (این پروپرتی زمانی رسم میشه که کاربر موس را روی کنترل میبره) . (3 پروپرتی بیت مپ برای رسم در زمان های مختلف داره این کلاس بنام های DefaultBitmap و MouseEnterBitmap و MouseDownBitmap هست) .
حالا برنامه نویس میتونه با کلاس های دیگه و هر روشی ، تغییرات و افکت های مورد نظرش در بیت مپ را محاسبه کنه و بعد اون بیت مپ را به یکی از این 3 پروپرتی برای رسم در حالت مورد نظرش بده.

و بعد نکته ی دیگه اینکه همونطور که میدونیم ، برای رسم در این کنترل ، باید کنترل والدش را Invalidate کنم که گه گاهی (هر چند تک و توک) باعث پرپر زدن این کنترل TransparentControl میشه . پروپرتی DoubleBuffer را هم که از این کنترل فعال میکنم ، رسم اصلا ناجور میشه و بهم میریزه . میتونم برای جلوگیری از پرپر زدن ، از این کنترل توسط متد CreateGraphics یه گرافیک جدید ایجاد کنم و بوسیه ی کلاس BufferedGraphics و BufferedGraphicsContext ، توی این گرافیک های BufferedGraphics و BufferedGraphicsContext رسم انجام بدم؟ اگه این کار را کنم ، شبیه وقتی که پروپرتی DoubleBuffer را فعال میکنم ، رسم ها ناجور نمیشه و بهم نمیریزه؟ همینطور اینکه دیگه پرپر (هر چند اندک که میزد) را هم نمیزنه؟
چیزی شبیه همین کدی که اینجا برام نوشتید منظورمه :

گفتگو هایی در باب سی شارپ

خیلی ممنون
 

the_king

مدیرکل انجمن
خیلی ممنون استاد علی
میگم من الان مثال ها و پست های قبلی تون را میبینم ، بیشتراز قبل متوجه میشم . همیشه چند منزل عقبم :green:
حالا ایمیجی که طرف میده ، بیشتر ساخته شده برای ایمیج های کوچیک . مثلا برای بیت مپ هایی در ابعاد حداکثر 100 در 100 (بصورت استاندارد 25 در 25) وگرنه معنایی نداره که یه بیت مپی به عنوان شکل یه کنترل با ابعاد بزرگتر از این داده بشه . با این حال هم پیشنهاد میکنید از LockBit استفاده کنم؟ چون خوانایی و کار کردن با این کد بیشتره و در ابعاد کوچیک هم سرعت خوبی داره و هم اینکه این کلاس از اساس ساخته نشد که افکت ها (مثل کم و زیاد کردن opacity و تغییر رنگ بیت مپ و ...) را برای کاربر بسازه . فقط من باب اینکه دو افکت تغییر opacity و تغییر color ، خیلی کاربرد داره ، این متد را گذاشتم تا کاربر خودش تغییر رنگش را محاسبه نکنه و بعد به پروپرتی MouseEnterBitmap بده (این پروپرتی زمانی رسم میشه که کاربر موس را روی کنترل میبره) . (3 پروپرتی بیت مپ برای رسم در زمان های مختلف داره این کلاس بنام های DefaultBitmap و MouseEnterBitmap و MouseDownBitmap هست) .
حالا برنامه نویس میتونه با کلاس های دیگه و هر روشی ، تغییرات و افکت های مورد نظرش در بیت مپ را محاسبه کنه و بعد اون بیت مپ را به یکی از این 3 پروپرتی برای رسم در حالت مورد نظرش بده.

و بعد نکته ی دیگه اینکه همونطور که میدونیم ، برای رسم در این کنترل ، باید کنترل والدش را Invalidate کنم که گه گاهی (هر چند تک و توک) باعث پرپر زدن این کنترل TransparentControl میشه . پروپرتی DoubleBuffer را هم که از این کنترل فعال میکنم ، رسم اصلا ناجور میشه و بهم میریزه . میتونم برای جلوگیری از پرپر زدن ، از این کنترل توسط متد CreateGraphics یه گرافیک جدید ایجاد کنم و بوسیه ی کلاس BufferedGraphics و BufferedGraphicsContext ، توی این گرافیک های BufferedGraphics و BufferedGraphicsContext رسم انجام بدم؟ اگه این کار را کنم ، شبیه وقتی که پروپرتی DoubleBuffer را فعال میکنم ، رسم ها ناجور نمیشه و بهم نمیریزه؟ همینطور اینکه دیگه پرپر (هر چند اندک که میزد) را هم نمیزنه؟
چیزی شبیه همین کدی که اینجا برام نوشتید منظورمه :

گفتگو هایی در باب سی شارپ

خیلی ممنون
خودتون تصمیم میگیرید، ولی در مورد طراحی اینترفیس کوچکترین بهینه سازی برای افزایش کارایی میتونه اثرات بزرگی داشته باشه چون ذاتا کنترل هم شیء ازش زیاد ساخته میشه وهم مکررا در حال رسم شدنه.
در مورد پنجره های WS_EX_TRANSPARENT بافر چندان بدردتون نمیخوره، چون چیزی که بافر شدنی میشه اون رسم روی کنترل ئه، نه رسم پنجره های زیرش. دلیل پرپر زدن هم جدا بودن رسم پنجره های زیرش با رسم روی اونه، بافر شما این مشکل رو حل نمی کنه. همون اولین بار که به WS_EX_TRANSPARENT اشاره کردید گفتم بدردتون نمیخوره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون.
میگم من الان شی ای از این کلاس TransparentControl را میسازم ، کار میکنه.
کدش را توی قسمت Designer.cs میذارم ، موقع شروع پروژه (وقتی پروژه را start میزنم) ، مشکلی نداره و زمان اجرا نشون میده اما زمان غیر اجرا ، قسمت دیزاینرم مشکل داره (با اونکه در پنل error list ، اروری ندارم) :


1.JPG

کدش در قسمت Designer.cs اینه (موقع اجرا مشکلی نداره) :


کد:
        private TransparentControl TransparentControl1;
        private void InitializeComponent()
        {
            this.SuspendLayout();

            System.Drawing.Bitmap bitmapTrCotrl = new System.Drawing.Bitmap(Application.StartupPath + @"\Icon\PanelToolBar\Setting\Setting.png");
            this.TransparentControl1 = new TransparentControl(bitmapTrCotrl, new System.Drawing.Point(5, 5));
            this.TransparentControl1.Name = "TransparentControl1";
            this.toolBarPanel.Controls.Add(this.TransparentControl1);

            this.ResumeLayout(false);

        }

من حدس میزنم مشکل از اینه که متد سازنده ی کلاس TransparentControl ، ورودی دریافت میکنه یا اینکه من به بیت مپ اش ، مقداریه فایل که یه چیز خارجی هست را دادم ، باشه . حالا خودم دقیق نمیدونم.

به هر حال ، میشه کاری کرد که این مشکل را نداشته باشه؟ (البته متد سازنده اش را نمیخوام بدون ورودی باشه)
 

the_king

مدیرکل انجمن
خیلی ممنون.
میگم من الان شی ای از این کلاس TransparentControl را میسازم ، کار میکنه.
کدش را توی قسمت Designer.cs میذارم ، موقع شروع پروژه (وقتی پروژه را start میزنم) ، مشکلی نداره و زمان اجرا نشون میده اما زمان غیر اجرا ، قسمت دیزاینرم مشکل داره (با اونکه در پنل error list ، اروری ندارم) :


مشاهده پیوست 112354

کدش در قسمت Designer.cs اینه (موقع اجرا مشکلی نداره) :


کد:
        private TransparentControl TransparentControl1;
        private void InitializeComponent()
        {
            this.SuspendLayout();

            System.Drawing.Bitmap bitmapTrCotrl = new System.Drawing.Bitmap(Application.StartupPath + @"\Icon\PanelToolBar\Setting\Setting.png");
            this.TransparentControl1 = new TransparentControl(bitmapTrCotrl, new System.Drawing.Point(5, 5));
            this.TransparentControl1.Name = "TransparentControl1";
            this.toolBarPanel.Controls.Add(this.TransparentControl1);

            this.ResumeLayout(false);

        }

من حدس میزنم مشکل از اینه که متد سازنده ی کلاس TransparentControl ، ورودی دریافت میکنه یا اینکه من به بیت مپ اش ، مقداریه فایل که یه چیز خارجی هست را دادم ، باشه . حالا خودم دقیق نمیدونم.

به هر حال ، میشه کاری کرد که این مشکل را نداشته باشه؟ (البته متد سازنده اش را نمیخوام بدون ورودی باشه)
اولا نباید در Designer که محل کد های خودکار تولید شده Designer ئه Visual Studio است کد نویسی کنید. مگر شما Designer ویژوال استدیو هستید؟ در فایل های کلاس خودتون و در متد سازنده کلاس یا رخداد Load یا Shown کد بنویسید، نه داخل InitializeComponent ای که Designer ساخته و مخصوص خودشه. ثانیا Designer با کنترل هایی که سازنده بدون پارامتر ندارند مشکل داره، از این بابت که برای ذخیره سازی تغییراتی که موقع طراحی در مشخصه ها میدهید و نمایش مجدد فرم بصورتی که بود روال مشخصی داره. ممکنه خطای الان کدتون مربوط به این قضیه نباشه ولی این نکته رو هم باید رعایت کنید.
شما می توانید یک متد سازنده بدون پارامتر داشته باشید که تصویری هم نشون نده و خودتون هیچوقت ازش استفاده نکنید ولی اگر میخواهید با Designer ویژوال استدیو کار کنید لازمش دارید.
در ضمن اگر از من راهنمایی بخواهید باید کدی که واقعا اجرا میشه رو بینم، نه یک روتین سر و ته زده که معلوم نیست خطا در چیزی که میبینیم بوده یا در بخش های حذف شده.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اولا نباید در Designer که محل کد های خودکار تولید شده Designer ئه Visual Studio است کد نویسی کنید. مگر شما Designer ویژوال استدیو هستید؟ در فایل های کلاس خودتون و در متد سازنده کلاس یا رخداد Load یا Shown کد بنویسید، نه داخل InitializeComponent ای که Designer ساخته و مخصوص خودشه. ثانیا Designer با کنترل هایی که سازنده بدون پارامتر ندارند مشکل داره، از این بابت که برای ذخیره سازی تغییراتی که موقع طراحی در مشخصه ها میدهید و نمایش مجدد فرم بصورتی که بود روال مشخصی داره. ممکنه خطای الان کدتون مربوط به این قضیه نباشه ولی این نکته رو هم باید رعایت کنید.
شما می توانید یک متد سازنده بدون پارامتر داشته باشید که تصویری هم نشون نده و خودتون هیچوقت ازش استفاده نکنید ولی اگر میخواهید با Designer ویژوال استدیو کار کنید لازمش دارید.
در ضمن اگر از من راهنمایی بخواهید باید کدی که واقعا اجرا میشه رو بینم، نه یک روتین سر و ته زده که معلوم نیست خطا در چیزی که میبینیم بوده یا در بخش های حذف شده.

خیلی ممنون
متد سازنده ی بدون پارامتر هم ازش ساختم ولی در دیزاینر بازم ارور میداد .
به هر حال منتشر کردم تا هر کس خواست ازش استفاده کنه.
خیلی ممنون که برای ساختش راهنمایی کردین :rose:
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
آها خیلی ممنونم
چون موقع رویدادها (ورود موس روی کنترل و ...) گفتم که فقط اون قسمتی از کنترل parent را که کنترل TransparentControl هست را Invalidate کن ، پس بقیه ی قسمت های اون کنترل parent را که بقیه ی کنترل های TransparentControl هست را Invalidate نمیکنه و رسم جدید روی رسم قبلی اش انجام میشد .
متوجه شدم . خیلی ممنون استاد علی :rose:

سلامی مجدد
استاد علی ، الان اینی که گفتم ، درسته؟
من الان فکر میکنم ، بازم عجیبه برام .
مثلا فرض کنیم دو تا کنترل TransparentControl را روی پنل ای داریم . وقتی موس را روی هر کدوم از شی TransparentControl میبریم ، بگیم که فقط اون بخشی از پنل که فقط همون کنترل TransparentControl هست را Invalidate کنه . پس قسمت دیگه ی پنل که یکی دیگه از کنترل TransparentControl هست ، اصلا Invalidate نمیشه که بخواد تغییری کنه!

بنابراین من هنوز جواب بخش دوم پست 1164 را نگرفتم و جوابی که دادین را متوجهش نشدم :
دوم اینکه هر چند این دو کنترل ، دو کنترل مجزا (و new شده) هستن و هم Bitmap شون ، دو شی Bitmap مجزا هستن ولی وقتی موس را چندین بار روی کنترل اولی ببریم ، کنترل دومی (رنگ زرد) ، کلفت تر میشه و وقتی موس را چندین بار روی کنترل دومی ببریم ، کنترل دومی (اونی که opacity اش کم و 10 هست) ، مقدار opacity اش همینطور بیشتر و بیشتر میشه!
اما موس را روی هر کدوم از این کنترل ها که میبرم ، به حالت اولیه اش برمیگرده.
 

جدیدترین ارسال ها

بالا