Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];

Вниз

Передача фокуса   Найти похожие ветки 

 
Piter ©   (2004-05-30 16:00) [0]

Есть несколько Edit"ов на окне. Как реализовать передачу фокуса по [TAB] ?

P.S. И еще такой вопросик в оффтоп - какой стиль надо присвоить Edit"у, чтобы он стал трехмерным, как в VCL? А то у меня плоский, некрасиво выглядит...


 
Гость с юга   (2004-05-30 16:04) [1]

1. TabOrder -> 0,1,2
2. Ctrl3D = True (Default)


 
Piter ©   (2004-05-30 16:11) [2]

Нда... спасибо большое


 
Piter ©   (2004-05-30 16:11) [3]

Рекомендую посмотреть на название конференции


 
GuAV ©   (2004-05-30 16:43) [4]


> какой стиль надо присвоить Edit"у

WS_EX_CLIENTEDGE Specifies that a window has a border with a sunken edge.


 
Piter ©   (2004-05-30 16:45) [5]

GuAV (30.05.04 16:43) [4]

нет, не работает


 
GuAV ©   (2004-05-31 00:28) [6]


> Piter ©   (30.05.04 16:45) [5]
> GuAV (30.05.04 16:43) [4]
>
> нет, не работает

Работает.
юзай CreateWindowEx и шли его первым параметром.


 
Piter ©   (2004-05-31 00:32) [7]

GuAV (31.05.04 00:28) [6]

нда... тормозить не запретишь :)

А как насчет

>Есть несколько Edit"ов на окне. Как реализовать передачу фокуса по [TAB] ?


 
DVM ©   (2004-05-31 01:19) [8]


> Piter ©   (30.05.04 16:00)  
> Есть несколько Edit"ов на окне. Как реализовать передачу
> фокуса по [TAB] ?

Окно и Edit-ы созданы из ресурса или CreateWindowEx?


 
Piter ©   (2004-05-31 01:32) [9]

CreateWindowEx

А что ты подразумеваешь под
>созданы из ресурса
?


 
nikkie ©   (2004-05-31 01:35) [10]

ресурс есть такой DIALOG
и функции соответствующие - DialogBox, DialogBoxParam.


 
DVM ©   (2004-05-31 01:40) [11]


> Piter ©   (31.05.04 01:32) [9]

При программировании интерфейса на WinApi обычно не используют кучу вызовов CreateWindow() для создания диалоговых окон и контролов на них. Вместо этого шаблон окна диалога описывают в файле ресурсов и потом вызывая DialogBoxParam(), например, создают такое окно одим махом, дополнительно получая массу бонусов, например, передача фокуса и т.д.
Подробнее тут:
http://web.ict.nsc.ru/~cancel/delphi/vclfree.html/file3.html
В любом случае передача фокуса будет происходить с помощью SetFocus(). А нажатие TAB - это лишь сообщение WM_KEYDOWN.


 
nikkie ©   (2004-05-31 01:53) [12]

>DVM
>В любом случае передача фокуса будет происходить с помощью SetFocus(). А нажатие TAB - это лишь сообщение WM_KEYDOWN.


это зачем? по приведенной тобой же ссылке написано:

Преимущество такого способа создания диалоговых окон заключается в том, что Windows берет на себя обеспечение интерфейса диалоговых окон, к которому привык пользователь — кнопки по умолчанию (срабатывающия, когда пользователь нажмет <Enter> или <Esc>); возможность переключения между дочерними элементами управления при помощи клавиши <Tab> и т.п.


 
Piter ©   (2004-05-31 02:33) [13]

Что-то не получается ни фига... ресурс создал, подключил.

Вызываю так:

i:=DialogBoxParam(Instance,"DIALOG_1",Handle,@DialogProc,0);

После вызова i=-1

GetLastError дает "Не удается найти класс окна", если DialogBoxParam вообще устанавливает код ошибки...


 
nikkie ©   (2004-05-31 02:35) [14]

DialogBoxParam(Instance,MAKEINTRESOURCE(DIALOG_1),Handle,@DialogProc,0);


 
Piter ©   (2004-05-31 02:40) [15]

Piter (31.05.04 02:33) [13]
MAKEINTRESOURCE(DIALOG_1)


ну тогда уж наверное все таки

MAKEINTRESOURCE("DIALOG_1")

Все равно не работает, тоже самое. Да и вообще MAKEINTRESOURCE это ведь просто приведение к PChar"у.
А Дельфи и так к PChar"у приводит...


 
nikkie ©   (2004-05-31 02:49) [16]

>ну тогда уж наверное все таки
нет. параметром MAKEINTRESOURCE должен быть ID диалога - целое число.


 
Piter ©   (2004-05-31 03:40) [17]

nikkie (31.05.04 02:49) [16]
параметром MAKEINTRESOURCE должен быть ID диалога


а как я узнаю ID диалога? DIALOG_1 естественно неизвестная переменная для дельфи...


 
Piter ©   (2004-05-31 11:05) [18]

вот блин...


 
GuAV ©   (2004-05-31 12:23) [19]


> а как я узнаю ID диалога? DIALOG_1 естественно неизвестная
> переменная для дельфи...

В pедакотре ресурсов обзови его каким-то числом, например 1000, это и будет ID


 
Игорь Шевченко ©   (2004-05-31 12:27) [20]

Piter ©   (31.05.04 11:05)

Петцольда читать. Наизусть. Буду экзамен принимать.


 
Piter ©   (2004-05-31 17:25) [21]

Игорь Шевченко (31.05.04 12:27) [20]

а как полностью книжка называется?


 
Piter ©   (2004-05-31 17:37) [22]

GuAV (31.05.04 12:23) [19]
В pедакотре ресурсов обзови его каким-то числом, например 1000, это и будет ID


обозвал еденичкой. Вызываю:

i:=DialogBoxParam(Instance,MAKEINTRESOURCE(1),Handle,@DialogProc,0);

не пашет :(
"Указанной имя ресурса не найдено в файле образа"


 
DVM ©   (2004-05-31 18:00) [23]


> Piter ©   (31.05.04 17:37) [22]

i:=DialogBoxParam(Instance,PChar(1),Handle,@DialogProc,0);


 
DVM ©   (2004-05-31 18:13) [24]


> nikkie ©   (31.05.04 01:53) [12]
> >DVM
> >В любом случае передача фокуса будет происходить с помощью
> SetFocus(). А нажатие TAB - это лишь сообщение WM_KEYDOWN.
>
> это зачем? по приведенной тобой же ссылке написано:

А если нужно, чтобы по определенному условию фокус установился на некотором поле редактирования? Тогда надо использовать SetFocus()+ GetDlgItem().


 
Piter ©   (2004-05-31 18:31) [25]

DVM (31.05.04 18:00) [23]

ну так MAKEINTRESOURCE это и есть приведение к PChar"у!


 
DVM ©   (2004-05-31 18:48) [26]


> Piter ©   (31.05.04 18:31) [25]

В чем делал ресурс?
Ты ресурс скомпилировал?
К проекту подцепил?
Все должно работать вообще то.


 
Gero ©   (2004-05-31 18:50) [27]

Иногда с ресурсами бывает подобная фигня, попробуй закрыть проект и открыть заново.


 
Piter ©   (2004-05-31 18:51) [28]

DVM (31.05.04 18:48) [26]
В чем делал ресурс?


Resource Workshop

DVM (31.05.04 18:48) [26]
Ты ресурс скомпилировал?


да, с помощью brcc32

DVM (31.05.04 18:48) [26]
К проекту подцепил?


да

DVM (31.05.04 18:48) [26]
Все должно работать вообще то.


ан не работает


 
Piter ©   (2004-05-31 18:52) [29]

Gero (31.05.04 18:50) [27]
Иногда с ресурсами бывает подобная фигня, попробуй закрыть проект и открыть заново


да я чего только не делал


 
DVM ©   (2004-05-31 18:54) [30]


> Piter ©   (31.05.04 18:52) [29]

Нескомпилированный RC файл покажи.


 
Piter ©   (2004-05-31 18:56) [31]

Код программы такой:

program NetSend;

uses
 Windows,
 Messages,
 ns in "ns.pas";

{$R ns.res}
...


Вызов функции:

i:=DialogBoxParam(Instance,MAKEINTRESOURCE(1),Handle,@DialogProc,0);

Кстати, теперь ошибку пишет "Не удается найти класс окна". Уже не ругается, что не может найти в образе ресурс


 
Piter ©   (2004-05-31 18:57) [32]

DVM (31.05.04 18:54) [30]
Нескомпилированный RC файл покажи


/****************************************************************************

ns.rc

produced by Borland Resource Workshop

*****************************************************************************/

1 DIALOG 69, 52, 161, 127
STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
CLASS "MyClass"
CAPTION "Мое окно"
FONT 8, "MS Sans Serif"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
{
}


 
DVM ©   (2004-05-31 18:57) [33]


> Piter ©   (31.05.04 18:52) [29]

Погляди по той ссылке, что я приводил, там можно скачать демо-примеры. Там и с окном из ресурса есть.


 
GuAV ©   (2004-05-31 18:58) [34]


> i:=DialogBoxParam(Instance,PChar(1),Handle,@DialogProc,0);

аж интересно стало - сам опробовал. работает.
build сделай, попробуй .res отдельный, а не project1.res


 
GuAV ©   (2004-05-31 19:01) [35]


> RC файл

зачем? создавай res-файл в res ws
{$R mydialog.res}


 
Piter ©   (2004-05-31 19:05) [36]

GuAV (31.05.04 19:01) [35]

а дельфи тогда ругается, что файл ресурсов 16 битный...


 
Piter ©   (2004-05-31 19:05) [37]

так в чем у меня ошибка? В ДНК что ли ? :)))


 
Piter ©   (2004-05-31 19:08) [38]

GuAV (31.05.04 18:58) [34]
попробуй .res отдельный, а не project1.res


конечно, отдельный!!! Кто же ресурсы в главном ресурсном файле создает...


 
DVM ©   (2004-05-31 21:02) [39]


> Piter ©   (31.05.04 19:08) [38]

давай весь код и файла ресурсов и код программы включая циклы сообщений и оконные процедуры.


 
DVM ©   (2004-05-31 21:08) [40]


> Piter ©   (31.05.04 19:08) [38]

Кстати, у тебя есть в программе хоть одно не диалоговое окно. Т.е. созданное нормально и имеющее обычного вида оконную процедуру? Должно быть (пусть даже невидимое). Можно, конечно обойтись и без него, но с ним удобнее.


 
Piter ©   (2004-05-31 21:47) [41]

Файл с ресурсами я привел...
Код весь я привести не могу, программа не такая и маленькая, буду вырезать ненужные части:

program NetSend;

uses
 Windows,
 Messages,
 ns in "ns.pas";

{$R ns.res}

var
 Instance, Handle: HWND;
 EditSource, EditDestination, EditText, Button: HWND ;
 msg: TMsg;
 WindowClass: TWNDClass;
 Width, Height: integer;
 nHeight, nWidth: integer;
 i:integer;

procedure ExitProgram;
begin
 Halt;
end;

function DialogProc(hWnd: THandle; Msg: Integer; wParam, lParam : Integer): Bool; stdcall;
begin
beep(500,500);
end;

function WndProc(Hwn,msg,wpr,lpr:HWND):longint;stdcall;
begin
 if msg=wm_destroy then ExitProgram;
 result:=defwindowproc(hwn,msg,wpr,lpr);
end;

BEGIN

instance:=GetModuleHandle(nil);

Windowclass.style:=CS_HRedraw or CS_VRedraw;
WindowClass.lpfnWndProc :=  @WndProc;
WindowClass.hInstance :=instance;
Windowclass.hbrBackground:=COLOR_BACKGROUND;
WindowClass.lpszClassName:= "NetSend";
Windowclass.hCursor :=LoadCursor(0,IDC_ARROW);
RegisterClass(WindowClass);

Width:= 300;
Height := 180;

nWidth:=(GetSystemMetrics(SM_CXSCREEN) div 2)-(Width div 2);
nHeight:=(GetSystemMetrics(SM_CYSCREEN) div 2)-(Height div 2);

Handle:=CreateWindowEx(0,WindowClass.lpszClassName,PChar("NetSend"),WS_SYSMENU or WS_MINIMIZEBOX, nWidth,nHeight,Width,Height,0,0,WindowClass.hInstance,nil);

i:=DialogBoxParam(Instance,MAKEINTRESOURCE(1),Handle,@DialogProc,0);

while (GetMessage(msg,0,0,0)) do
 begin
   translatemessage(msg);
   dispatchmessage(msg);
 end;

END.


 
nikkie ©   (2004-05-31 23:05) [42]

>DVM
А если нужно, чтобы по определенному условию фокус установился на некотором поле редактирования? Тогда надо использовать SetFocus()+ GetDlgItem().

тогда причем здесь TAB и WM_KEYDOWN?

Кстати, у тебя есть в программе хоть одно не диалоговое окно. Т.е. созданное нормально и имеющее обычного вида оконную процедуру? Должно быть (пусть даже невидимое).
абсолютно не должно.

Можно, конечно обойтись и без него, но с ним удобнее.
чем же это удобнее?

>Piter
Код весь я привести не могу, программа не такая и маленькая, буду вырезать ненужные части:

можешь все сразу выкидывать. оставь вызов DialogBoxParam и DialogProc. в DialogProc поставь
Result := False;
все остальное для диалогового приложения не нужно.


 
Piter ©   (2004-05-31 23:32) [43]

nikkie (31.05.04 23:05) [42]

да код я уже выложи более часа назал до твоего поста :)


 
nikkie ©   (2004-05-31 23:47) [44]

>да код я уже выложи более часа назал до твоего поста :)
я твой пост видел. потрудись и ты мой прочитать.


 
Piter ©   (2004-05-31 23:54) [45]

nikkie (31.05.04 23:47) [44]
потрудись и ты мой прочитать


слушай, а я твой тоже прочитал... с чего ты решил, что я его не читал?

nikkie (31.05.04 23:05) [42]
оставь вызов DialogBoxParam


оставил

nikkie (31.05.04 23:05) [42]
и DialogProc


оставил

nikkie (31.05.04 23:05) [42]
в DialogProc поставь
Result := False;


а зачем? Все равно DialogProc НИ РАЗУ не вызывается.
DialogBoxParam возвращает -1


 
nikkie ©   (2004-06-01 00:20) [46]

program Project2;

uses Messages, SysUtils, Windows;

{$R ns.res}

function DialogProc(hWnd: THandle; Msg: Integer; wParam, lParam : Integer): Bool; stdcall;
begin
 case Msg of
 WM_COMMAND:
   case LoWord(wParam) of
   IDOK:
     EndDialog(hWnd, 1);
   IDCANCEL:
     EndDialog(hWnd, 0);
   end;
 end;
 Result := False;
end;

begin
 DialogBoxParam(HInstance, MAKEINTRESOURCE(1), 0, @DialogProc, 0)
end.


 
nikkie ©   (2004-06-01 00:21) [47]

1 DIALOG DISCARDABLE  0, 0, 194, 79
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Believe me that is easy"
FONT 8, "MS Sans Serif"
BEGIN
   DEFPUSHBUTTON   "OK",IDOK,136,7,50,14
   PUSHBUTTON      "Cancel",IDCANCEL,136,24,50,14
END


 
Piter ©   (2004-06-01 00:28) [48]

nikkie (01.06.04 00:21) [47]
PUSHBUTTON &ogProc, 0)


ругается на это


 
DVM ©   (2004-06-01 00:28) [49]

Убери из файла ресурса  название класса окна. Строка с указанием класса окна нужна только если для диалога будет использоваться своя настоящая оконная процедура.


 
Piter ©   (2004-06-01 00:29) [50]

nikkie (01.06.04 00:21) [47]

и вообще, к чему ты это привел?

DialogProc у меня все равно не вызывается пока...

а ресурс твой не открывается... свой ресурс я уже приводил...


 
Piter ©   (2004-06-01 00:33) [51]

DVM (01.06.04 00:28) [49]

блин... заработало :)


 
Piter ©   (2004-06-01 00:35) [52]

DVM (01.06.04 00:28) [49]

только заголовк формы кракозябрами


 
nikkie ©   (2004-06-01 00:40) [53]

>и вообще, к чему ты это привел?
все. я сдаюсь.


 
DVM ©   (2004-06-01 00:42) [54]

>только заголовк формы кракозябрами
выкинь из файла ресурсов все что после шрифта.


 
Piter ©   (2004-06-01 01:02) [55]

nikkie (01.06.04 00:40) [53]
все. я сдаюсь.


ну я понимаю, что считаешь меня тупым и не было бы по фигу, если бы это был не ты. Но так как это ты, то попытаюсь оправдаться:

ты привел код DialogProc - спасибо, конечно. Но на кой он мне нужен был, если он все равно не вызывается?

еще ты привел файл своих ресурсов, как я понял. Но я тебе уже сказал, что они у меня не открываются... в чем я не прав?

DVM (01.06.04 00:42) [54]

это правильный путь? Может, в RW надо что настроить? А то так каждый раз выкидывать...
Кстати, а какая у вас версия этого воркшопа? У меня 4.5, чуть ли не 1994 года, хотя это очень странно...


 
nikkie ©   (2004-06-01 01:15) [56]

ты привел код DialogProc - спасибо, конечно. Но на кой он мне нужен был, если он все равно не вызывается?
я привел не код функции, а полностью работоспособную программу - dpr и rc файлы. привел ее потому, что ты проигнорировал мои слова о том, что у тебя осталась еще уйма кода, ненужного для диалогового приложения.

Но я тебе уже сказал, что они у меня не открываются... в чем я не прав?
не надо пытаться ресурс левыми программами открывать. brcc32 ns.rc - из предыдущего разговора мне казалось, что ты умеешь ресурсы компилировать.

У меня 4.5, чуть ли не 1994 года
видимо 16-bit и сохраняет русский текст в дос-кодировке? не пробовал в текстовом редакторе rc открыть?


 
DVM ©   (2004-06-01 01:37) [57]

>Кстати, а какая у вас версия этого воркшопа?

BC++5.0
он там встроенный
и еще MS VC6 - этот получше будет.
А свой редактор выкинь - больно старый.


 
DVM ©   (2004-06-01 02:14) [58]

>nikkie
>тогда причем здесь TAB и WM_KEYDOWN?
как я уже сказал передача фокуса в диалоговом окне происходит функцией SetFocus(), которую вызываетдефолтовая настоящая оконная процедура диалога, скрытая в недрах Windows по приходу WM_KEYDOWN с клавишей TAB.
Т.е как ни крути - одно и то же.

>чем же это удобнее?

Обычная практика так делать. Тот же Петзольд так делает в книге.


 
nikkie ©   (2004-06-01 02:48) [59]

>скрытая в недрах Windows
ок. просто изначальная формулировка могла наводить на мысль, что SetFocus нужно будет вызывать руками.

>Обычная практика так делать
я так не делаю. пример диалогового приложения я привел выше - код простейший, зачем лишнее окно создавать непонятно.


 
nikkie ©   (2004-06-01 03:21) [60]

по поводу Петцольда - посмотри пример /chap12/ctlmacro.c


 
Игорь Шевченко ©   (2004-06-01 11:47) [61]

Книга Петцольда называется, как ни странно, "Программирование для Windows"


 
Piter ©   (2004-06-01 18:30) [62]

nikkie (01.06.04 01:15) [56]
не надо пытаться ресурс левыми программами открывать


Resource Workshop очень левая программа?
Так какая ее последняя версия?

Игорь Шевченко (01.06.04 11:47) [61]
Книга Петцольда называется, как ни странно, "Программирование для Windows"


примеры на VC?


 
Gero ©   (2004-06-01 21:56) [63]


> Книга Петцольда называется, как ни странно, "Программирование
> для Windows"

Немного оффтопа.
Вот интересно, существуют ли в природе нормальные книги по программированию с примерами на Delphi?


 
DVM ©   (2004-06-01 23:43) [64]

Какая разница какой язык - все равно все программирование сводится к вызовам одних и тех же функций winapi.


 
Gero ©   (2004-06-01 23:52) [65]


> DVM ©   (01.06.04 23:43)

Ты конечно прав, но можешь ли ты ответить на мой вопрос?


 
DVM ©   (2004-06-02 00:08) [66]

Чтобы исключительно WinApi и Delphi я не встречал. Специфика Delphi вероятно. Среда быстрой разработки однако.


 
Gero ©   (2004-06-02 00:14) [67]


> Среда быстрой разработки однако.

Ага, батонов на форму накидал и делов-то.


 
Игорь Шевченко ©   (2004-06-02 00:35) [68]


> Вот интересно, существуют ли в природе нормальные книги
> по программированию с примерами на Delphi?


Тейксейра и Пачеко.
Бакнелл.

#ifdef FLAME

Люди, вам лень книжку купить и заглянуть в нее ? Ладно, купить, но поискать по инету, скачать и ПРОЧИТАТЬ!
Получается какое-то несправедливое расслоение - кто-то книжки покупает(скачивает) читает, а кто-то считает, что теперь прочитавшие ему на блюдце должны выкладывать готовые рецепты, так как они ни с языком другим не могут примеры разобрать, ни еще чего. Почему за них должен делать добрый дядя ?

#endif


 
Gero ©   (2004-06-02 00:49) [69]


Игорь Шевченко ©   (02.06.04 00:35)
> а кто-то считает, что теперь прочитавшие ему на блюдце должны
> выкладывать готовые рецепты, так как они ни с языком другим
> не могут примеры разобрать

Как я понял, мне это тоже адресуется.
А кто говорит, что "с языком другим не может примеры разобрать"?
Если я спросил, существуют ли в природе нормальные книги по программированию с примерами на Delphi, это значит что я на си не в состоянии разобрать пример или как??



Страницы: 1 2 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.63 MB
Время: 0.025 c
1-1088179756
Lampa
2004-06-25 20:09
2004.07.11
Синхронизация


3-1087435598
alex_pv
2004-06-17 05:26
2004.07.11
Access и ADO, блокировка таблицы


1-1088164102
Aleksandr.
2004-06-25 15:48
2004.07.11
Что может вызывать тормоза в Делфи при трассировке?


3-1087308867
Ross
2004-06-15 18:14
2004.07.11
Дата


4-1085648572
osama
2004-05-27 13:02
2004.07.11
Вопрос по консоли





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский