Форум: "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