Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2009, 23:06   #1
VladimirVB
Форумчанин
 
Аватар для VladimirVB
 
Регистрация: 12.10.2008
Сообщений: 131
Стрелка Сообщение WM_NCLBUTTONUP

Здравствуйте. Я хочу сделать форму прозрачной при щелчке по заголовке формы. При отпускании кнопки мыши форма восстанавливает свое состояние. Проблема в том, что обработка сообщения WM_NCLBUTTONUP срабатывает только, если форма полноэкранная. А если нет то, сообщение не обрабатывается. КАК ЗАСТАВИТЬ ПРОЦЕДУРУ WMNCLButtonUp СРАБАТЫВАТЬ ПРИ ЛЮБОМ ВИДЕ ОКНА. Спасибо за ответ.

Исходный код:

Код:
private
    { Private declarations }
    procedure WMNCLButtonDown(var Msg: TWMNCLButtonDown); message WM_NCLBUTTONDOWN;
    procedure WMNCLButtonUp(var Msg: TWMNCLButtonUp); message WM_NCLBUTTONUP;
...
procedure TForm1.WMNCLButtonDown(var Msg: TWMNCLButtonDown);
begin
  inherited;
  AlphaBlendValue := 127;
end;

procedure TForm1.WMNCLButtonUp(var Msg: TWMNCLButtonUp);
begin
  inherited;
  AlphaBlendValue := 255;
end;

Последний раз редактировалось rpy3uH; 04.01.2009 в 09:13.
VladimirVB вне форума Ответить с цитированием
Старый 04.01.2009, 03:26   #2
ViktorXP
Форумчанин
 
Аватар для ViktorXP
 
Регистрация: 24.11.2006
Сообщений: 108
По умолчанию

событие WM_NCLBUTTONUP кажись с TWinControl вырублено. в справочной системе об этом тишина но в какомто модуле в коментах очерком написано что это не работает.
Ставь локальный хук, хотя это глупость но походу другого выходя просто нет. (но может другие люди подтянутся и найдут выход)

перехватывай событие WM_NCMOUSEMOVE оно 100% сработает после отпускание кнопки (даже без перемишение самой мыши), но также оно будет срабатывать и до (недостатки есть всегада, нужно главное знать про их), главное оно не срабатывает во время перетаскивания формы
ViktorXP вне форума Ответить с цитированием
Старый 04.01.2009, 10:56   #3
Nester
Форумчанин
 
Аватар для Nester
 
Регистрация: 22.10.2008
Сообщений: 103
Подмигивание

Кривовато но работает
Вложения
Тип файла: rar Alpha.rar (4.2 Кб, 24 просмотров)
Никто не знает больше чем не знаю я
Nester вне форума Ответить с цитированием
Старый 04.01.2009, 14:39   #4
VladimirVB
Форумчанин
 
Аватар для VladimirVB
 
Регистрация: 12.10.2008
Сообщений: 131
По умолчанию

Этот пример я взял из книги "Занимательное программирование на Visual Basic.NET" Александра Климова. И на VB.NET все работает нормально. Правда реализовано через переопределение оконной процедуры WndProc

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
'Если нажата левая кнопка мыши на заголовке формы
If CLng(m.Msg) = WM_NCLBUTTONDOWN Then
'Устанавливаем степень прозрачности формы
If Me.Opacity <> 0.5 Then Me.Opacity = 0.5
'Кнопка отпущена
ElseIf CLng(m.Msg) = WM_NCLBUTTONUP Then
If Me.Opacity <> 1.0 Then Me.Opacity = 1.0
End If
MyBase.WndProc(m)
End Sub

Получается, что Delphi кривоват в этом вопросе.
VladimirVB вне форума Ответить с цитированием
Старый 04.01.2009, 15:35   #5
ViktorXP
Форумчанин
 
Аватар для ViktorXP
 
Регистрация: 24.11.2006
Сообщений: 108
По умолчанию

Тут прикол в самой винде.
Зделал форму через ВинАпи и результат тотже
повторил то что я делал на VC и опять тотже результат
посути дело в стандартной обработке, если ее не обрабатывать то тогда все работает но окно не двигается и игнорируются системные кнопки, а вот если обрабатывать то все реагирует но сообщение о отпускании кнопки не срабатывает. Корявость винды
ViktorXP вне форума Ответить с цитированием
Старый 04.01.2009, 18:05   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Может так сойдёт:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
   procedure WMNCHitTest(var M:TWMNCHitTest);message wm_NCHitTest;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
  inherited;
  if M.Result = htCaption then
   AlphaBlendValue := 127
  else
   AlphaBlendValue := 255;;
end;

end.
Поднимание ЛКМыши нереагирует, поэтому убрал эти процедуры, толку от них при таскании за заголовок.
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Icq сообщение Marsik Помощь студентам 2 10.04.2008 04:22
Звуковое сообщение. Небесный Паскаль, Turbo Pascal, PascalABC.NET 13 17.10.2007 12:24