Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > НЕсколько диалогових окон


Автор: Zorak 27.1.2009, 22:12
Вот написал код, которий создает самое просто окно с меню... в меню 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, его я таже использовал одно и тоже....
Кто знает в чом проблема ?....
Вообщем говоря, мне надо сделать ети окна модальними.... а одно не модальним.....(

Автор: 586 27.1.2009, 22:45
Цитата(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.

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

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

Автор: Zorak 28.1.2009, 11:13
блин, точно.. спасибо GremlinProg)...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)