Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 21.11.2008, 23:27   #1
rumil
Пользователь
 
Регистрация: 25.08.2008
Сообщений: 10
По умолчанию Переход фокуса на контролах по Tab

Когда столкнулся, здесь на форуме не нашел, тому кто не знает может пригодиться

OD> Есть окно на WinApi(не диалоговое), на нем 6 Еditов. Hyжно
OD> сделать, чтобы по нажатию клавиши TAB фокyс ввода пеpеходил от
OD> одного к дpyгомy полю ввода.


Вообще идея такова:
Едитам ставится стиль WS_TABSTOP

Edit1 := CreateWindowEx( WS_EX_CLIENTEDGE, 'Edit', '', WS_CHILD or ES_AUTOHSCROLL or WS_VISIBLE or WS_TABSTOP, 50, 38, 128, 21, Wnd, Ed_2, hInstance, nil );

Родительскому окну ставится стиль WS_EX_CONTROLPARENT.

Wnd := CreateWindowEx ( WS_EX_CONTROLPARENT, WndClass, WndCaption,WS_BORDER, 500, 392,ClientWidth, ClientHeight, 0, 0, hInstance, nil);

И видоизменяется петля сообщений (message loop) на следующее:
=========Beginning of the citation==============
while (GetMessage (msg, 0, 0, 0)) do
if (not IsDialogMessage(hwndParent, msg)) then
begin
TranslateMessage (msg);
DispatchMessage (msg);
end;

=========The end of the citation================

После этого клавиша таб, будет обрабатываться сама.
rumil вне форума Ответить с цитированием
Старый 29.09.2009, 06:50   #2
jungle
Пользователь
 
Аватар для jungle
 
Регистрация: 22.11.2008
Сообщений: 65
По умолчанию

Спасибо, пригодилось.

Код:
Wnd := CreateWindowEx($00000000, WindowClassName, 'Заголовок', $80800840,
    400, 300, 217, 130, 0, 0, Instance, nil);
    ShowWindow(Wnd, SW_SHOWNORMAL);


Edit[i] := CreateWindowEx($00000000, 'Edit', EditText[i], $50810000,
      EditLeft[i], EditTop[i], 25, 15, parent, 4000+i, Instance, nil);

function message_loop: integer;
var
  message: TMSG;
begin
  while GetMessage(message, 0, 0, 0) do
  begin
    if not IsDialogMessage(Wnd, message) then
    begin
      TranslateMessage(message);
      DispatchMessage(message);
    end;
  end;
  message_loop := message.wParam;
end;
После изменения цикла сообщений при нажатии на кнопку стал изменяться ее стиль. Решил это так:
Код:
WM_COMMAND:
. . . . . . . . . . .
SetWindowLong(Button1, GWL_STYLE, WS_CHILD or WS_VISIBLE);

Последний раз редактировалось jungle; 29.09.2009 в 07:40. Причина: После изменения цикла сообщений при нажатии на кнопку стал изменяться ее стиль
jungle вне форума Ответить с цитированием
Старый 02.10.2009, 23:13   #3
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

А вообще лучше использовать диалоги и не е...ть мозги себе.
Д'якон вне форума Ответить с цитированием
Старый 06.10.2012, 23:12   #4
kovalev
 
Аватар для kovalev
 
Регистрация: 06.10.2012
Сообщений: 5
Сообщение

Вот так еще можно:

Код:
function Filter(var Msg: TMsg): Boolean;
var
//  S: string;
  I: Integer;
begin
  Result := True;

  for I := 1 to 4 do
  begin
    if (Msg.hwnd = Edit[I]) and (Msg.wParam = 9) then
    begin
      if Msg.message = 258 then
      begin
        SetFocus(Edit[I+1]);
        SendMessage(Edit[I+1], EM_SETSEL, 0, 10)
      end
    end
  end;
  if (Msg.hwnd = Edit[5]) and (Msg.wParam = 9) then
  begin
    if Msg.message = 258 then
    begin
      SetFocus(Edit[1]);
      SendMessage(Edit[1], EM_SETSEL, 0, 10)
    end
  end;
  for I := 2 to 5 do
  begin
    if (Msg.hwnd = Edit[I]) and (Msg.wParam = 16) then
    begin
      if Msg.message = 256 then
      begin
        SetFocus(Edit[I-1]);
        SendMessage(Edit[I-1], EM_SETSEL, 0, 10)
      end
    end
  end;
  if (Msg.hwnd = Edit[1]) and (Msg.wParam = 16) then
  begin
    if Msg.message = 256 then
    begin
      SetFocus(Edit[5]);
      SendMessage(Edit[5], EM_SETSEL, 0, 10)
    end
  end

   { then  begin
       Str(Msg.message, S);        // и ещё Msg.wParam
    SetWindowText(hWin, PChar(S))  // Узнаём код клавиши
    end  }

end;


  while GetMessage(Msg, 0, 0, 0) do
  if Filter(Msg) then
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg)
  end;

Последний раз редактировалось kovalev; 07.10.2012 в 17:03.
kovalev вне форума Ответить с цитированием
Старый 27.10.2012, 18:46   #5
mishka1
 
Регистрация: 05.12.2010
Сообщений: 3
По умолчанию

rumil, большое спасибо, всё работает!
mishka1 вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Окно без фокуса Олвин Общие вопросы Delphi 4 13.10.2008 23:36
Alt + Tab Черничный Общие вопросы Delphi 2 16.06.2008 15:38
какое событие отвечает за получени/потерю фокуса у формы? Paul Hindenburg Общие вопросы Delphi 4 10.06.2008 14:47
Ресурсы в .dpk - контролах darkstarx Компоненты Delphi 0 19.02.2008 22:23
alt+tab в win XP mishel Общие вопросы Delphi 5 17.07.2007 10:52


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS