Привіт, в цій статті хотів би поговорити трохи про «липких» вікнах. Так ефект в додатках досить поширений і найчастіше зустрічається в тих чи інших програвачах, наприклад, Winamp. Так ось, коли я робив свій програвач на основі bass.dll, то у мене виникла така проблема (необхідно було організувати «липке» вікно). Проблему я цю вирішив дуже некрасиво і вийшло дуже не зручно і сильно «глючить». А все це я зробив через TTimer. Тобто поставив Interval в 1 і потім по створенню форми я написав код, який буде до краю головної форми прилипати іншу форму. Тобто я просто на таймері ставив Left новій формі. Зараз цю проблему я вирішив через обробку повідомлень, які посилаються при переміщенні форми, ефект вийшов той же, що і при версії з таймером, але зате не «глючил». Є способи, які роблять «липкі» вікна і інші, може більш кращі, але мені якось свій спосіб і прижився. Давайте ще розглянемо перед тим як робити «липке» вікна по відношенню до іншого, зробимо переміщення форми за будь-який її елемент. Для цього ми будемо використовувати обробку повідомлення WMNCHitTest.
Оголосимо процедуру в специфікаторами доступу private - procedure WMNCHitTest (var M: TWMNCHitTest); message wm_NCHitTest;
Далі встановимо курсор на дану процедуру і натиснемо Ctrl + Shift + C, після чого у нас з'явиться заготовка нашої процедури.
Тепер напишемо наступний код в нашій процедурі
Що ми тут тут робимо, ми просто нашому результату присвоюємо заголовок. Тобто, за яку б область наш курсор на формі не був затиснутий завжди буде думати, що це заголовок і вільно можна переміщати форму за будь-яку її область.
Тепер трохи поговоримо про те, як зробити, щоб наше вікно прилипало до країв екрану. Тут програмувати нам не доведеться, у форми є властивість ScreenSnap, який встановивши в True буде здійснюватися такий ефект. У властивості SnapBuffer встановлюється значення пікселів, починаючи з яких буде відбуватися прилипання до країв екрану.
Тепер про сам «липкому» вікні до іншого вікна. Ну для початку створимо ще одну форму і на подію OnShow TForm1 напишемо код, який буде визначати початкове положення наших форм.
Після цього нам необхідно відстежувати переміщення нашої головної форми і переміщати туди ж таки другорядну форму. Для цього ми будемо обробляти повідомлення WMMoving
У специфікаторами доступу private оголосимо наступну процедуру
procedure WMMoving (var msg: TWMMoving); message WM_MOVING;
Далі встановимо курсор на дану процедуру і натиснемо наступне поєднання клавіш на клавіатурі - Ctrl + Shift + C. після чого з'явиться заготовка для нашої процедури і напишемо наступний код
Ось і все, тут ми тільки стежимо де розташована наша головна форма і за нею вже маємо другорядну. Як бачите нічого складного. Можна доопрацювати і отримати досить непоганий результат, але можна знайти більш ефективний і кращий спосіб, ну а поки тільки так.
До речі, хочу сказати, що вибирати шпалери для робочого столу стоїть тільки кращі і не сильно яскраві, щоб було приємно очам
Исходник статті можна скачати тут