![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Гость_Lex |
|
|||
|
Unregistered |
Вот текст програмки с основным диалоговым окном.Почему не вызывается процедура обработки соообщений?Буду очень благодарен за ответ.
#include "resource.h" #include <windows.h> LRESULT CALLBACK WndProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch (uMsg) { case WM_CREATE: SetFocus(GetDlgItem(hDlg,IDC_EDIT));return 0;break; case WM_DESTROY: PostQuitMessage(0);break; default: return DefWindowProc(hDlg,uMsg,wParam,lParam);break; }; return 0; } int _stdcall WinMain(HINSTANCE hinstance, HINSTANCE hprevinst,LPSTR lpszcmdline,int CmdShow ) { HWND hDlg; WNDCLASSEX wc; MSG msg; wc.cbSize=sizeof(WNDCLASSEX); wc.style=CS_HREDRAW || CS_VREDRAW; wc.lpfnWndProc=&WndProc; wc.cbClsExtra=NULL; wc.cbWndExtra=DLGWINDOWEXTRA; wc.hInstance=hinstance; wc.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1); wc.lpszMenuName=NULL; wc.lpszClassName="ClassName"; wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hIconSm=NULL; RegisterClassEx(&wc); hDlg=CreateDialogParam(hinstance, MAKEINTRESOURCE(IDD_DIALOG),NULL,NULL,NULL); ShowWindow(hDlg,CmdShow); UpdateWindow(hDlg); while (GetMessage(&msg,0,0,0)) { if (!IsDialogMessage(hDlg, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; } void main() { HINSTANCE hInst; hInst=GetModuleHandle(NULL); WinMain(hInst,NULL,NULL,SW_SHOWDEFAULT); } |
|||
|
||||
| srd |
|
||||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 4 Всего: 49 |
Потому что ты путаешь окно и диалог.
Процедура обработки сообщений для диалога имеет сигнатуру следующую:
Она НЕ ДОЛЖНА вызывать DefWindowProc. Вместо этого она должна для обработанных сообщений возвращать TRUE, а для необработанных - FALSE. Вместо WM_CREATE лучше работать с WM_INITDIALOG. Оконный класс регистрировать не надо. Адрес оконной функции передается функции DialogBox или DialogBoxParam.
ShowWindow и UpdateWindow не требуется. IsDialogMessage у тебя фактически выбрасывает все сообщения на свалку. И ещё, зачем тебе WinMain и main сразу? -------------------- Не смей читать мою подпись!!! |
||||
|
|||||
| Guest |
|
|||
|
Unregistered |
Диалог с помощью DialogBoxParam() я уже создавал и все нормально работало.Теперь я хочу создать диалог такого типа(Это вырезка из тьюториала):
Вы можете использовать шаблон диалогового окна как шаблон класса, который вы регистрируете с помощью функции RegisterClassEx. В этом случае, диалоговое окно ведет себя как "нормальное": оно получает сообщения через процедуру окна, на которую ссылается lрfnWndProc, а не через процедуру диалогового окна. Выгода данного подхода состоит в том, что вы не должны самостоятельно создавать дочерние элементы управления, Windows создает их во время создания диалогового окна. Также Windows берет на себя логику нажатий на клавиши (Tab и т.д.). Плюс вы можете указать курсор и иконку вашего окна в структуре класса окна. Диалог такого типа на макроассемблере работает а вот на С не получается.Диалог на экране есть ,но сообщения не обрабатываются. |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 4 Всего: 49 |
А где можно посмотреть на этот туториал? На сколько я знаю, даже в случае подмены оконного класса для диалогового окна всё равно используется DefDlgProc. Кроме того, имя оконного класса следует указать в ресурсе диалога.
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
Если хочешь, Я могу переслать тебе его по электронной почте.
А где в редакторе диалогов нужно указывать имя класса?(я думаю по этой причине не работает) И еще один нескромный вопрос: В чем будут выражены недостатки моей программы(например текстовый редактор), если в качестве главного окна я буду использовать диалог? |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 4 Всего: 49 |
Вышли его мне на мыло (адрес в профиле), либо в ПМ.
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 4 Всего: 49 |
Всё, письмо получил, буду разбираться.
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 4 Всего: 49 |
Я дословно перевёл код примера в туториале с ассемблера на Си, и оно работало. Приведенный тобой код правильный, видимо в самом деле забыл указать оконный класс в ресурсе диалога.
MyDialog DIALOG 10, 10, 205, 60 STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK CAPTION "Our First Dialog Box" CLASS "ClassName" BEGIN // ... // здест написано много всякого // ... END Строчку, на которую следует обратить внимание, я выделил жирным. Кстати, MSDN настоятельно рекомендует использовать DefDlgProc, а не DefWindowProc даже если используешь собственный оконный класс вместо стандартного диалогового. Впрочем, с DefWindowProc он тоже работает. -------------------- Не смей читать мою подпись!!! |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
Спасибо Огромное за помощь!!!
Respect srd. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |