نمایش نتایج 1 تا 21 از 21

نام تاپیک: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

  1. #1
    کاربر دائمی آواتار alireza_s_84
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    اهواز
    پست
    1,191

    نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    سلام دوستان:
    یکی از کاربران این سوال رو مطرح کرده بودن دیدم تاپیک جداگانه بزنم بهتره . ضمنا در تمامی زبانهایی که از توابع API پشتیبانی میکنن این مساله که در زیر مطرح میکنم صدق میکنه (فقط در پیاده سازی یه خورده متفاوته)
    وقتی که فرم برنامه شما رویدادهای موس رو هندل میکنه (کلا فرمهای تحت ویندوز) از یکسری پیغامهایی برای ردو بدل کردن این اطلاعات استفاده میشه.
    برای مثال وقتی شما هر کدون از رویداد های موس رو که در نظر بگیرید رخ میده ویندوز یک پیغام WM_NCHITTEST رو به فرم میفرسته تا معین بکنه که رویداد موس کجا اتفاق افتاده است.
    حالا این پیغام ها یک سری مقادیر دارن که معین میکنن قسمتی از فرم که کلیک شده کجاست. مثلا Titlebar فرم HTCAPTION رو برمیگردونه.(که نشون میده کاربر Titlebar رو کلیک کرده) حالا وقتی شما روی قسمتی از فرم که محل قرار دادن کنترلهاست کلیک میکنید (به این ناحیه Client Area گفته میشه یعنی ناحیه کاربری) مقدار HTCLIENT به فرم پاس داده میشه که نشون میده کاربر ناحیه کاربری فرم رو کلیک کرده.
    حالا با دونستن مطالب فوق میتونیم کاری کنیم که هرجای فرم رو که کلیک کردیم بتونیم اونو حرکت بدیم(بدون نیاز به هیچ کامپوننت و یا چیز دیگری فقط با دو خط کد)
    هر فر ویندوزی یک رویداد WndProc داره که تمامی پیغامهای ارسالی به فرم رو هندل میکنه. با Override کردن این متد میتونیم منطق خودمون رو به فرم تحمیل کنیم.
    در این متد باید چک بکنیم که اگه پیغام WM_NCHITTEST بود (پیغام مربوط به رویدادهای موس) مقدار ارسالی رو لغو کنیم و مقدار مورد نظر خودمون رو جایگزین کنیم ( در اینکار مقدار ارسالی HTCAPTION هست که باید با مقدار مورد نظرمون یعنی HTCLIENT جایگزین بشه)
    حالا تمامی دونستنی هامون رو کنار هم میذاریم و کد رو مینویسیم



    private const int WM_NCHITTEST = 0x84;

    private const int HTCLIENT = 0x1;

    private const int HTCAPTION = 0x2;

    protected override void WndProc(ref Message m)

    {

    switch(m.Msg)

    {

    case WM_NCHITTEST:

    base.WndProc(ref m;)

    if ((int)m.Result == HTCLIENT)

    m.Result = (IntPtr)HTCAPTION;

    return;

    break;

    {

    base.WndProc (ref );

    {


    موفق باشید

  2. #2

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

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

  3. #3
    کاربر دائمی آواتار Saeed.Masoumi
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    نامعلوم
    پست
    539

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    در کل جالب بود
    اما فرض کن قرار روی فرم یک سری اتفاقات توسط موس اجرا بشه مثه کلیک کردن و...
    این روش شما مشکلی ایجاد نمی کنه؟

  4. #4
    کاربر دائمی آواتار alireza_s_84
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    اهواز
    پست
    1,191

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    نقل قول نوشته شده توسط ali_autumnal مشاهده تاپیک
    من که نفهمیدم این کد رو باید تو کدوم رویداد بنویسم تا فرم حرکت کنه.
    دوست عزیز همین کد رو توی کلاس فرمتون کپی کنید ضمنا اگه خوب بخونید گفتم که توی کدوم رویداد اینکار انجام میشه

  5. #5
    کاربر دائمی آواتار alireza_s_84
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    اهواز
    پست
    1,191

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    نقل قول نوشته شده توسط سعید معصومی مشاهده تاپیک
    در کل جالب بود
    اما فرض کن قرار روی فرم یک سری اتفاقات توسط موس اجرا بشه مثه کلیک کردن و...
    این روش شما مشکلی ایجاد نمی کنه؟
    کارهایی عادی که همه برنامه نویس ها انجام میدن نه مشکلی بوجود نمیاد اما در یه سطح پیشرفته تر برای هندل کردن رویدادهای موس باید بصورت دستی عمل کنید
    در کل مشکلی در پروژه هایی که من و شما مینویسیم بوجود نمیاره
    ضمنا این روش رو از خود MSDN پیدا کردم و MediaPlayer هم از اونو استفاده میکنه

  6. #6

    Smile نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

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

    هرجایی که میخوام فراخونی کنمش ایراد میگیره!!!!!!

  7. #7
    کاربر دائمی آواتار alireza_s_84
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    اهواز
    پست
    1,191

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

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

    هرجایی که میخوام فراخونی کنمش ایراد میگیره!!!!!!
    سلام دوست عزیز :
    این یک متد نیست که شما اونو فراخونی کنید بلکه یکی از event های فرم است(ایونت WndProc) که باید OverRide کنید
    موفق باشید

  8. #8

    Smile نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    خوب حالا چطور OverRide کنم؟
    بابا کمی توضیح بدید. نمیشه؟ سخته؟

  9. #9
    کاربر دائمی آواتار alireza_s_84
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    اهواز
    پست
    1,191

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    نقل قول نوشته شده توسط ali_autumnal مشاهده تاپیک
    خوب حالا چطور OverRide کنم؟
    بابا کمی توضیح بدید. نمیشه؟ سخته؟
    دوست گرامی در همون تاپیک اول به خوبی و سادگی توضیح دادم . ساده تر از این نمیشه نمیشه توضیح داد. شما ابتدا با اصول اولیه برنامه نویسی آشنا بشید بعد سراغ این جور مسائل برید چون اگه بخواید بدون شناخت (لازم نیست این شناخت عمیق باشه سطحی هم کافیه) اینکارها رو بکنید به نتیجه مطلوب نمیرسید.
    ضمنا اگه با #C مینویسید لازمه کل کد رو توی کلاس کپی کنید. دیگه لازم نیست کاری انجام بدید.
    موفق باشید

  10. #10
    کاربر دائمی آواتار saeeedft
    تاریخ عضویت
    اردیبهشت 1388
    محل زندگی
    تهران
    پست
    320

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    اقا ممنون،خیلی کامل و جالب بود، بازم از این چیزا برامون بذار

  11. #11
    کاربر دائمی آواتار alireza_s_84
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    اهواز
    پست
    1,191

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

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

  12. #12
    کاربر دائمی آواتار saeeedft
    تاریخ عضویت
    اردیبهشت 1388
    محل زندگی
    تهران
    پست
    320

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    در مورد API چیزهای دیگه ای هم دارید که جالب باشه و کاربرد داشته باشه

  13. #13
    منتظر تایید آدرس ایمیل
    تاریخ عضویت
    اردیبهشت 1386
    محل زندگی
    کاشان
    پست
    580

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    دوست عزیز سلام
    چند مورد :
    1. این base.wndproc چکار می کنه ؟
    2. کلا اگه بتونی یه آموزش کامل برای کار با توابع API به زبان ساده و از مبتدی بزاری ممنون میشم .
    3. این ارتباط با API میتونه برای تاثیر گذاری روی برنامه های دیگه خارج برنامه خودمون استفاده کنیم یا نه ؟

  14. #14
    کاربر دائمی آواتار alireza_s_84
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    اهواز
    پست
    1,191

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    نقل قول نوشته شده توسط seven7777777 مشاهده تاپیک
    دوست عزیز سلام
    چند مورد :
    1. این base.wndproc چکار می کنه ؟
    2. کلا اگه بتونی یه آموزش کامل برای کار با توابع API به زبان ساده و از مبتدی بزاری ممنون میشم .
    3. این ارتباط با API میتونه برای تاثیر گذاری روی برنامه های دیگه خارج برنامه خودمون استفاده کنیم یا نه ؟
    سلام دوست عزیز:
    سوال اولتون رو توی تاپیک زیر جواب دادم
    https://barnamenevis.org/showthread.php?t=210549
    کلا توی تاپیک بالا قصد دارم در اینمورد کاملا توضیح بدم
    آموزش توابع API لزومی نداره چون دات نت خیلی منسجمتر عملکرده و همه رو یکجا و منطقی کنار هم چیده.
    با استفاده از توابع API شما به هر پنجره و فرمی که دوست دارید میتونید از برنامه خودتون با خارج ارتباط برقرار کنید
    موفق باشید

  15. #15

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    جابجا کردن فرم با کلیک بر روی هر قسمت از آن - با استفاده از توابع API
    https://barnamenevis.org/showpo...5&postcount=40

    using System.Runtime.InteropServices;

    [DllImport("user32.dll")]
    static extern int ReleaseCapture();
    [DllImport("user32.dll", EntryPoint = "SendMessageA")]
    static extern int SendMessage(int hwnd, int wMsg, int wParam, object lParam);
    private const int WM_NCLBUTTONDOWN = 161;

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
    ReleaseCapture();
    SendMessage(this.Handle.ToInt32(), WM_NCLBUTTONDOWN, 2, 0);
    }


    جابجا کردن فرم با کلیک بر روی هر قسمت از آن - بدون استفاده از توابع API
    https://barnamenevis.org/showpo...5&postcount=52

    private bool dragging;
    private Point pointClicked;
    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
    if (e.Button == MouseButtons.Left)
    {
    // Turn drag mode on and store the point clicked.
    dragging = true;
    pointClicked = new Point(e.X, e.Y);
    }
    else
    {
    dragging = false;
    }
    }
    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
    if (dragging)
    {
    Point pointMoveTo;
    // Find the current mouse position in screen coordinates.
    pointMoveTo = this.PointToScreen(new Point(e.X, e.Y));
    // Compensate for the position the control was clicked.
    pointMoveTo.Offset(-pointClicked.X, -pointClicked.Y);
    // Move the form.
    this.Location = pointMoveTo;
    }
    }
    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
    dragging = false;
    }

  16. #16
    کاربر دائمی آواتار teardrop
    تاریخ عضویت
    مهر 1388
    محل زندگی
    همدان
    پست
    139

    Talking نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    این کدها رو نگاه کن:
    فایل های ضمیمه فایل های ضمیمه

  17. #17
    کاربر تازه وارد
    تاریخ عضویت
    شهریور 1388
    محل زندگی
    تهران
    پست
    68

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    ممنون از alireza_s_84 به خاطر مطلب مفیدشون
    من کد بالا را اجرا کردم جواب هم داد فقط یک خطا گرفت که اون هم با تغییر خط زیر به صورت خط زیرش درست شد
    if ((int)m.Result == HTCLIENT)
    if ((int)m.Result == 5)

  18. #18
    کاربر تازه وارد
    تاریخ عضویت
    شهریور 1388
    محل زندگی
    تهران
    پست
    68

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    درباره سوال ali_autumnal در مورد محل کپی کردن این کدها، کدهای بالا را به همراه قسمتی از سایر کدهای فرم قرار میدم مطمئنا محلش قابل درک میشه
    public partial class Form1 : Form
    {


    public Form1()
    {
    InitializeComponent();

    }


    private const int WM_NCHITTEST = 0x84;
    private const int HTCLIENT = 0x1;
    private const int HTCAPTION = 0x2;
    protected override void WndProc(ref Message m)
    {
    switch (m.Msg)
    {
    case WM_NCHITTEST:
    base.WndProc(ref m);
    if ((int)m.Result == 5)
    m.Result = (IntPtr)HTCAPTION;
    return;
    break;
    }
    base.WndProc(ref m);
    }using System.Runtime.InteropServices;

    .
    .
    .

  19. #19
    کاربر تازه وارد
    تاریخ عضویت
    خرداد 1389
    محل زندگی
    قم
    پست
    65

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    نقل قول نوشته شده توسط teardrop مشاهده تاپیک
    این کدها رو نگاه کن:
    نمونه برنامه ای که شما قرار دادید شایسته ی تقدیره

  20. #20
    کاربر دائمی آواتار اَرژنگ
    تاریخ عضویت
    آبان 1384
    محل زندگی
    arjang8000@gmail.com
    پست
    2,736

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    نقل قول نوشته شده توسط mojdeh6583 مشاهده تاپیک
    نمونه برنامه ای که شما قرار دادید شایسته ی تقدیره
    خیر مثالی که karaji333 فرستادند تمیزتره،
    استفاده بیجهت از استاتیک نه تنها تمیز نیست بلکه اشتباه هم هست.

  21. #21
    کاربر دائمی آواتار mahboube
    تاریخ عضویت
    بهمن 1386
    محل زندگی
    شيراز
    سن
    36
    پست
    596

    نقل قول: نحوه حرکت دارن فرمهای ویندوزی بدون Titlebar

    با اين كداساده تر ميشه فرم رو جابجا كرد!!!!!

    privatevoid Form2_MouseDown(object sender, MouseEventArgs e)
    {
    x = e.Location.X;
    y = e.Location.Y;
    }
    privatevoid Form2_MouseMove(object sender, MouseEventArgs e)
    {
    if (e.Button == MouseButtons.Left)
    {
    this.Left += e.X - x;
    this.Top += e.Y - y;
    }
    }

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •