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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> НЕсколько диалогових окон 
V
    Опции темы
Zorak
Дата 27.1.2009, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот написал код, которий создает самое просто окно с меню... в меню 4 пункта, три из которых визивает свой диалог. Тоесть грубо говоря, в программе есть 3 диалога со своими функциями:
BOOL ForDlgOnInitDialog(HWND,HWND,LPARAM);
BOOL HelpDlgOnInitDialog(HWND,HWND,LPARAM);
BOOL OptionsDlgOnInitDialog(HWND,HWND,LPARAM);

void ForDlgOnCommand(HWND,int,HWND,UINT);
void HelpDlgOnCommand(HWND,int,HWND,UINT);
void OptionsDlgOnCommand(HWND,int,HWND,UINT);

... Вот...
вообще полний код програми следующий:
Код

#include "windows.h"
#include "windowsx.h"
#include "resource.h"

#define XSIZE 500
#define YSIZE 500

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK ForDlgProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK HelpDlgProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK OptionsDlgProc(HWND,UINT,WPARAM,LPARAM);
BOOL ForDlgOnInitDialog(HWND,HWND,LPARAM);
BOOL HelpDlgOnInitDialog(HWND,HWND,LPARAM);
BOOL OptionsDlgOnInitDialog(HWND,HWND,LPARAM);

void onDestroy(HWND);
void OnPaint(HWND);
void OnCommand(HWND,int,HWND,UINT);
void ForDlgOnCommand(HWND,int,HWND,UINT);
void HelpDlgOnCommand(HWND,int,HWND,UINT);
void OptionsDlgOnCommand(HWND,int,HWND,UINT);

HWND hOptions;
HINSTANCE hInst;

                   
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)
{
    char szClassName[] = "MainWindow";
    char szTitle[] = "Create by Terrian";
    MSG msg;
    WNDCLASS Moroz;
    ZeroMemory(&Moroz, sizeof(Moroz));

    Moroz.lpfnWndProc = WndProc;
    Moroz.hInstance = hInst;
    Moroz.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    Moroz.hCursor = LoadCursor(NULL,IDC_ARROW);
    Moroz.hbrBackground = GetStockBrush(LTGRAY_BRUSH);
    Moroz.lpszClassName = szClassName;
    Moroz.lpszMenuName = "MainMenu";
    
    RegisterClass(&Moroz);

    HWND hwnd = CreateWindow(szClassName,szTitle,WS_OVERLAPPEDWINDOW,500,300,XSIZE,YSIZE,HWND_DESKTOP,NULL,hInst,NULL);
    ShowWindow(hwnd,SW_SHOWNORMAL);

    while (GetMessage(&msg,NULL,0,0))
        DispatchMessage(&msg);
    return 0;

    

}

LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        HANDLE_MSG(hWnd,WM_DESTROY,onDestroy);
        HANDLE_MSG(hWnd,WM_COMMAND,OnCommand);
        HANDLE_MSG(hWnd,WM_PAINT,OnPaint);
    default:return(DefWindowProc(hWnd,msg,wParam,lParam));
    }
}

void onDestroy(HWND)
{
    PostQuitMessage(0);
}

void OnPaint(HWND hWnd)
{

}

void OnCommand(HWND hWnd,int id, HWND, UINT)
{
    switch (id)
    {
    case MI_EXIT: 
        DestroyWindow(hWnd);
        break;
    case MI_FOR:
        DialogBox(hInst,"ForProgram",NULL,ForDlgProc);
        break;
    case MI_HELP:
        DialogBox(hInst,"Help",NULL,HelpDlgProc);
        break;
    case MI_OPTIONS:
        if(hOptions == NULL)
        hOptions = CreateDialog(hInst,"Options",GetParent(hWnd),OptionsDlgProc);
        //else MessageBox(hWnd,"Dialog is already exist","Info",IDOK);
        break;
    }
}

BOOL CALLBACK ForDlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    {
        HANDLE_MSG(hWnd,WM_INITDIALOG,ForDlgOnInitDialog);
        HANDLE_MSG(hWnd,WM_COMMAND,ForDlgOnCommand);
    default:return FALSE;
    }
    return TRUE;
}

ForDlgOnInitDialog(HWND hWnd,HWND,LPARAM)
{
    return TRUE;
}

void ForDlgOnCommand(HWND hWnd,int id,HWND hWndCtrl,UINT CodeNotify)
{
    switch(id)
    {
    case IDOK:
        DestroyWindow(hWnd);
        break;
    }
}

BOOL CALLBACK HelpDlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    {
        HANDLE_MSG(hWnd,WM_INITDIALOG,HelpDlgOnInitDialog);
        HANDLE_MSG(hWnd,WM_COMMAND,HelpDlgOnCommand);
    default:return FALSE;
    }
    return TRUE;
}

HelpDlgOnInitDialog(HWND hWnd,HWND,LPARAM)
{
    return TRUE;
}

void HelpDlgOnCommand(HWND hWnd,int id,HWND hWndCtrl,UINT CodeNotify)
{
    switch(id)
    {
    case IDOK:
        DestroyWindow(hWnd);
        break;
    }
}

BOOL CALLBACK OptionsDlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    {
        HANDLE_MSG(hWnd,WM_INITDIALOG,OptionsDlgOnInitDialog);
        HANDLE_MSG(hWnd,WM_COMMAND,OptionsDlgOnCommand);
    default:return FALSE;
    }
    return TRUE;
}

OptionsDlgOnInitDialog(HWND hWnd,HWND,LPARAM)
{
    return TRUE;
}

void OptionsDlgOnCommand(HWND hWnd,int id,HWND hWndCtrl,UINT CodeNotify)
{
    switch(id)
    {
    case IDOK:
        DestroyWindow(hWnd);
        break;
    }
}

Проблема состои в том, что все диалоги я создавал с помощю DialogBox, кроме одного...что само по себе означает модальное окно... но оно НЕ стает модальним... я немогу понять почему так... я подозреваю что ето изза дескрипторов окна.. я везде использовал hWnd или же изза параметра HINSTANCE, его я таже использовал одно и тоже....
Кто знает в чом проблема ?....
Вообщем говоря, мне надо сделать ети окна модальними.... а одно не модальним.....(


--------------------
Знание - сила. А сила есть, ума не надо...
Занимаюсь интернет бизнесом и ищу новых партнеров. Кому интересно - обращайтесь в ЛС, скайп или мыло.
PM MAIL ICQ   Вверх
586
Дата 27.1.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(Zorak @  27.1.2009,  22:12 Найти цитируемый пост)
Проблема состои в том, что все диалоги я создавал с помощю DialogBox, кроме одного...что само по себе означает модальное окно... но оно НЕ стает модальним...

Цитата(Zorak @  27.1.2009,  22:12 Найти цитируемый пост)
void OnCommand(HWND hWnd,int id, HWND, UINT)
{
    switch (id)
    {
    case MI_EXIT: 
        DestroyWindow(hWnd);
        break;
    case MI_FOR:
        DialogBox(hInst,"ForProgram",NULL,ForDlgProc);
        break;
    case MI_HELP:
        DialogBox(hInst,"Help",NULL,HelpDlgProc);
        break;
    case MI_OPTIONS:
        if(hOptions == NULL)
        hOptions = CreateDialog(hInst,"Options",GetParent(hWnd),OptionsDlgProc);
        //else MessageBox(hWnd,"Dialog is already exist","Info",IDOK);
        break;
    }
}

Исправь NULL на hWnd.
PM   Вверх
Zorak
Дата 27.1.2009, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



586  Да, помогло, спасибо, теперь вот только когда я визиваю любое модальное окно, то после его закрития (фактически после визова функции DestroyWindow) основное окно стает недоступним, тоесть просто пропадает фокус с окна, а потом не реагирует на никакие сообщения.. (


--------------------
Знание - сила. А сила есть, ума не надо...
Занимаюсь интернет бизнесом и ищу новых партнеров. Кому интересно - обращайтесь в ЛС, скайп или мыло.
PM MAIL ICQ   Вверх
GremlinProg
Дата 28.1.2009, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



модальные диалоги нужно закрывать не с помощью DestroyWindow, а с помощью EndDialod


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Zorak
Дата 28.1.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



блин, точно.. спасибо GremlinProg)...


--------------------
Знание - сила. А сила есть, ума не надо...
Занимаюсь интернет бизнесом и ищу новых партнеров. Кому интересно - обращайтесь в ЛС, скайп или мыло.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0709 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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