1 / 1 / 0
Регистрация: 27.01.2016
Сообщений: 45
1

Запрет нажатия левой кнопки мыши на кнопке (C++ Builder 6)

13.03.2016, 18:43. Показов 2208. Ответов 22
Метки нет (Все метки)

Нужно реализовать блокировку нажатия для левой кнопки мыши(если это возможно).
Кроме:
C++
1
if(Button == mbLeft) return;
ничего не знаю, да и он не работает.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2016, 18:43
Ответы с готовыми решениями:

Клики левой кнопки мыши по таймеру, при зажатой левой кнопке мыши (user32.lib)
Уважаемые форумчане, взорвался мозг. Помогите. Есть одна, по мне, невыполнимая, задача, которую я...

При нажати левой кнопки мыши в месте нажатия отображается зеленый кружок, а при нажатии правой кнопки мыши красный квад
При нажати левой кнопки мыши в месте нажатия отображается зеленый кружок, а при нажатии правой...

Имитация нажатия левой кнопки мыши
Нужна имитация нажатия левой кнопки мыши только для конкретного окна/программы, то есть не это: ...

Имитация нажатия левой кнопки мыши
Подскажите, как в Qt сгенерировать событие нажатия левой кнопки мыши?

22
случайный прохожий
2383 / 1600 / 550
Регистрация: 20.07.2013
Сообщений: 4,490
13.03.2016, 18:49 2
Зачем вообще тогда кнопка нужна?
0
1 / 1 / 0
Регистрация: 27.01.2016
Сообщений: 45
13.03.2016, 20:12  [ТС] 3
gunslinger,
Если нет желания помочь, то зачем вообще писать сюда?
Запрет нужен после клика правой кнопкой мыши,(САПЕР КОРОЧЕ).
0
случайный прохожий
2383 / 1600 / 550
Регистрация: 20.07.2013
Сообщений: 4,490
14.03.2016, 01:24 4
А чтобы не было глупых вопросов, нужно сразу максимально подробно проблему обозначать.
Версия сапера на семерке позволяет нажимать ЛКМ после установки метки.
В любом случае, лучше сделать так, чтобы при нажатии ЛКМ на кнопке с меткой просто ничего не происходило (кроме только визуального нажатия) и ячейка не открывалась.
Выкладывание кода также сокращает кол-во общих слов при ответе и позволяет поместить больше "конкретики" в пост.
0
1 / 1 / 0
Регистрация: 27.01.2016
Сообщений: 45
14.03.2016, 13:45  [ТС] 5
gunslinger, Просто подскажите направление в котором капать, и ссылки на подобные темы(если есть).
Наверняка я не первый кто обращается по такому вопросу.
0
Практикантроп
4780 / 2680 / 517
Регистрация: 23.09.2011
Сообщений: 5,734
14.03.2016, 13:55 6
Цитата Сообщение от Chelybey Посмотреть сообщение
ссылки на подобные темы
даже вынесены в начало рубрики: Классы-перехватчики (interceptor classes)
0
188 / 41 / 12
Регистрация: 22.02.2016
Сообщений: 149
14.03.2016, 23:15 7
nick42, обязательно классы-перехватчики? можно проще

Chelybey,

На TApplication можно повесить событие в котором проверять проходящие через приложение сообщения.
C++
1
void __fastcall (__closure *TMessageEvent)(tagMSG &Msg, bool &Handled);
Если встретите WM_LBUTTONDOWN - просто блокируйте его изменяя значение переменной Handled
вот обработчик этого события на Delphi. Это чтобы было проще понять логику ее работы
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
  Handled: Boolean;
begin
  Result := False;
  if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
  begin
    Result := True;
    if Msg.Message <> WM_QUIT then
    begin
      Handled := False;
      if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
      if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
        not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end
    else
      FTerminate := True;
  end;
end;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32488 / 20974 / 8115
Регистрация: 22.10.2011
Сообщений: 36,246
Записей в блоге: 7
14.03.2016, 23:25 8
Зачем это все? Нажал пользователь правой кнопкой - toggle обработчика:

C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::myMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
    if(Button == mbRight)
    {
        TButton *btn = static_cast<TButton*>(Sender);
        // тут же можно на кнопке поменять картинку заодно
        if(btn->OnClick) btn->OnClick = 0;
        else btn->OnClick = myClick; //  - общий для всех обработчик нажатия на кнопку, ибо они там все под копирку
    }
}
2
Практикантроп
4780 / 2680 / 517
Регистрация: 23.09.2011
Сообщений: 5,734
14.03.2016, 23:37 9
Не проверял, но, боюсь, смена обработчика не поможет, кнопка зримо все равно будет "нажиматься". А это, мне кажется, как раз и не нужно. Перехват этого сообщения (нажатия) мне кажется более действенным. (А там анализ внутри: если тэг > 1000 - была отметка правой кнопкой -, то никакого действия; иначе - как обычно).
0
1 / 1 / 0
Регистрация: 27.01.2016
Сообщений: 45
14.03.2016, 23:51  [ТС] 10
И ещё можно 1 вопрос, только он не по этой теме?.
имеется 6 Label, всё надо записать в 1 файл.
Label`s получают значения следующим образом.
C++
1
2
3
4
5
6
switch (Form4->Tag)
{
        case 1: Label7->Caption = Form4->Edit1->Text; Label4->Caption = Form2->StaticText1->Caption + " сек."; break;
        case 2: Label8->Caption = Form4->Edit1->Text; Label5->Caption = Form2->StaticText1->Caption + " сек."; break;
        case 3: Label9->Caption = Form4->Edit1->Text; Label6->Caption = Form2->StaticText1->Caption + " сек."; break;
}
теперь надо всё это записать и прочитать, при закрытии и открытии формы соответственно.
нашёл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
FILE *fp=fopen("yourfile","w");
N=10;
TLabel *Labels=new TLabel[N];
/*
Загоняешь их в массивъ
*/
....
for (int i=0;i<N;i++)
{
fputs(fp,Labels->Caption.c_str());
}
delete [] Labels;
fclose(fp)
но до конца не разобраться.
Миниатюры
Запрет нажатия левой кнопки мыши на кнопке (C++ Builder 6)  
0
188 / 41 / 12
Регистрация: 22.02.2016
Сообщений: 149
14.03.2016, 23:54 11
Цитата Сообщение от Chelybey Посмотреть сообщение
теперь надо всё это записать и прочитать, при закрытии и открытии формы соответственно.
Посмотри в сторону TIniFile
1
1 / 1 / 0
Регистрация: 27.01.2016
Сообщений: 45
15.03.2016, 19:25  [ТС] 12
Цитата Сообщение от dstar Посмотреть сообщение
Посмотри в сторону TIniFile
TIniFile, просто вещь, то что надо. Разобраться было не сложно, хоть и пользуюсь этим методом впервые.

P.S. спс всем кто помогал.
0
1 / 1 / 0
Регистрация: 27.01.2016
Сообщений: 45
15.03.2016, 22:48  [ТС] 13
И снова появилась проблема, в полях размером в 8х8 и 16х16, всё нормально, а вот в 16х30 ошибка, как я понял ошибка ссылается на несуществующий объект. Ошибка происходит только в закоментированном коде.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 int h;
        if(Button == mbLeft)
        {
                for(int i=0;i<O;i++)
                for(int j=0;j<U;j++)
                {
                       if(But[j][i]->Down == true)
                        {       t = t+1; }
 
                                if(But[j][i]->Tag !=1)
                                {
                                        h = 0;
                                        if( But[j-1][i-1])
                                     //           if(But[j-1][i-1]->Tag ==1) h++;
                                        if( But[j-1][i])
                                   //             if(But[j-1][i]->Tag   ==1) h++;
                                        if( But[j-1][i+1])
                                  //              if(But[j-1][i+1]->Tag ==1) h++;
                                        if( But[j][i-1])
                                                if(But[j][i-1]->Tag   ==1) h++;
                                        if( But[j][i+1])
                                                if(But[j][i+1]->Tag   ==1) h++;
                                        if( But[j+1][i-1])
                                                if(But[j+1][i-1]->Tag ==1) h++;
                                        if( But[j+1][i])
                                                if(But[j+1][i]->Tag   ==1) h++;
                                        if( But[j+1][i+1])
                                                if(But[j+1][i+1]->Tag ==1) h++;
 
                                        if(((TSpeedButton *)Sender)->Name == But[j][i]->Name)
                                        {
                                                if((h == 0)||(((TSpeedButton *)Sender)->Spacing == 2))
                                                        ((TSpeedButton *)Sender)->Caption = "";
                                                else
                                                {
                                                        switch(h)
                                                        {
                                                                case 1: ((TSpeedButton *)Sender)->Font->Color = clHotLight; break;
                                                                case 2: ((TSpeedButton *)Sender)->Font->Color = clGreen; break;
                                                                case 3: ((TSpeedButton *)Sender)->Font->Color = clRed; break;
                                                                case 4: ((TSpeedButton *)Sender)->Font->Color = clBlue; break;
                                                                case 5: ((TSpeedButton *)Sender)->Font->Color = clMaroon; break;
                                                                case 6: ((TSpeedButton *)Sender)->Font->Color = clTeal; break;
                                                                case 7: ((TSpeedButton *)Sender)->Font->Color = clPurple; break;
                                                                case 8: ((TSpeedButton *)Sender)->Font->Color = clBlack; break;
                                                        }
                                                        ((TSpeedButton *)Sender)->Caption = h;
                                                }
                                        }
 
                        }
                }
         }
Миниатюры
Запрет нажатия левой кнопки мыши на кнопке (C++ Builder 6)  
0
1 / 1 / 0
Регистрация: 27.01.2016
Сообщений: 45
16.03.2016, 00:25  [ТС] 14
Так же будет ошибка и в полях 8х8 и 16х16 если убрать строки 13, 15, 17, 19, 21, 23, 25, 27.
0
1405 / 568 / 127
Регистрация: 31.10.2011
Сообщений: 1,956
16.03.2016, 12:27 15
Chelybey, при первом проходе цикла i==0 и j==0
But[j-1][i-1] не имеет смысла.

В логику функции не вникал, но тут либо начинать цикл с 1, либо проверять i и j на ноль.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32488 / 20974 / 8115
Регистрация: 22.10.2011
Сообщений: 36,246
Записей в блоге: 7
16.03.2016, 12:32 16
Перед попыткой обращения к элементу массива, неплохо было бы всегда проверять, не вылетают ли индексы за его пределы (и не только при i == 0 и j == 0, при i == O-1 попытка обратиться к ...[i+1] тоже может окончиться плачевно)
0
_Dimon_
16.03.2016, 12:36
  #17

Не по теме:

volvo, как ты в квадратную рамку выделяешь текст? :sorry:

0
volvo
16.03.2016, 12:41
  #18

Не по теме:

Для этого тег INLINE придумали :)

0
1 / 1 / 0
Регистрация: 27.01.2016
Сообщений: 45
16.03.2016, 13:42  [ТС] 19
Цитата Сообщение от volvo Посмотреть сообщение
Перед попыткой обращения к элементу массива, неплохо было бы всегда проверять, не вылетают ли индексы за его пределы (и не только при i == 0 и j == 0, при i == O-1 попытка обратиться к ...[i+1] тоже может окончиться плачевно)
Да проверка идёт. в строках 13, 15, 17, 19, 21, 23, 25, 27. но что-то всё равно не то. Буду проверять массив.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32488 / 20974 / 8115
Регистрация: 22.10.2011
Сообщений: 36,246
Записей в блоге: 7
16.03.2016, 13:51 20
Цитата Сообщение от Chelybey Посмотреть сообщение
Да проверка идёт
Не та проверка там идет. Ты проверяешь, есть ли работоспособный объект в ячейке. Но если индексы выходят за границы массива, то уже при попытке обратиться к этой ячейке (а не проверить ее содержимое) будет проблема (а если включен CodeGuard - то и вылет). Делать нужно как-то так:

C++
1
2
if(j > 1 && i > 1 && But[j-1][i-1]) // сначала проверяем, что ячейка вообще существуют, потом - что в ней не NULL
// if(But[j-1][i-1]->Tag ==1) h++; // а тут уже спокойно обращаемся к полю объекта
Там, где используется "+", нужно сравнивать с верхней границей массива:
C++
1
2
if(i < O-1 && But[j][i+1]) // если i будет равен O-1, то But[j][i+1] эквивалентно But[j][O], а это вылет за границу массива
  if(But[j][i+1]->Tag   ==1) h++;
Идея понятна?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2016, 13:51
Помогаю со студенческими работами здесь

Отлавливание нажатия левой кнопки мыши в Edit
Добрый вечер. Проблема в отлавливании нажатия левой кнопки мыши в Edit. Во всех остальных областях...

Имитация нажатия левой и правой кнопки мыши
Тут на форуме просто свалка из таких тем, и везде мегаметоды для этого писать надо, Подскажите...

Hook для нажатия левой кнопки мыши
Подскажите пожалуйста как отследить нажатие левой кнопки мыши вне модального окна. Я так понимаю...

Симуляция нажатия левой кнопки мыши в другом окне
Есть программа (написана на C# - Windows form app) мне нужно послать нажатие лкм по координатам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru