Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите найти ошибку... Буду очень благодарен за ответ. 
:(
    Опции темы
Гость_Lex
Дата 12.12.2004, 11:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 12.12.2004, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 4
Всего: 49



Потому что ты путаешь окно и диалог.
Процедура обработки сообщений для диалога имеет сигнатуру следующую:
Код

INT_PTR CALLBACK DialogBox(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);

Она НЕ ДОЛЖНА вызывать DefWindowProc. Вместо этого она должна для обработанных сообщений возвращать TRUE, а для необработанных - FALSE.
Вместо WM_CREATE лучше работать с WM_INITDIALOG.
Оконный класс регистрировать не надо. Адрес оконной функции передается функции DialogBox или DialogBoxParam.
Код

INT_PTR DialogBox(          HINSTANCE hInstance,  // хэндл процесса
   LPCTSTR lpTemplate, // ресурс диалога
   HWND hWndParent, // родитель
   DLGPROC lpDialogFunc // адрес диалоговой функции
);

ShowWindow и UpdateWindow не требуется.
IsDialogMessage у тебя фактически выбрасывает все сообщения на свалку.
И ещё, зачем тебе WinMain и main сразу?


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Guest
Дата 12.12.2004, 15:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Диалог с помощью DialogBoxParam() я уже создавал и все нормально работало.Теперь я хочу создать диалог такого типа(Это вырезка из тьюториала):
Вы можете использовать шаблон диалогового окна как шаблон класса, который вы регистрируете с помощью функции RegisterClassEx. В этом случае, диалоговое окно ведет себя как "нормальное": оно получает сообщения через процедуру окна, на которую ссылается lрfnWndProc, а не через процедуру диалогового окна. Выгода данного подхода состоит в том, что вы не должны самостоятельно создавать дочерние элементы управления, Windows создает их во время создания диалогового окна. Также Windows берет на себя логику нажатий на клавиши (Tab и т.д.). Плюс вы можете указать курсор и иконку вашего окна в структуре класса окна.
Диалог такого типа на макроассемблере работает а вот на С не получается.Диалог на экране есть ,но сообщения не обрабатываются.
  Вверх
srd
Дата 13.12.2004, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 4
Всего: 49



А где можно посмотреть на этот туториал? На сколько я знаю, даже в случае подмены оконного класса для диалогового окна всё равно используется DefDlgProc. Кроме того, имя оконного класса следует указать в ресурсе диалога.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Leksey
Дата 13.12.2004, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Если хочешь, Я могу переслать тебе его по электронной почте.
А где в редакторе диалогов нужно указывать имя класса?(я думаю по этой причине не работает)
И еще один нескромный вопрос:
В чем будут выражены недостатки моей программы(например текстовый редактор), если в качестве главного окна я буду использовать диалог?
PM MAIL   Вверх
srd
Дата 14.12.2004, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 4
Всего: 49



Вышли его мне на мыло (адрес в профиле), либо в ПМ.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
srd
Дата 15.12.2004, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 4
Всего: 49



Всё, письмо получил, буду разбираться.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
srd
Дата 15.12.2004, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 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 он тоже работает.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Leksey
Дата 15.12.2004, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Спасибо Огромное за помощь!!!
Respect srd.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.