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


Автор: Dmitriy2k 21.11.2006, 13:34
Главное окно программы в windows создается довольно непростым способом:

Код

HWND hWnd;
WNDCLASS WndClass;
MSG msg;

WndClass.style.....
W............................
.............................

RegisterClass(&WndClass)...

hWnd=CreateWindow(.....)

и т.д.
а так же обрабатывающая процедура окна




Я хотел с помощью редактора ресурсов создать DIALOG_BOX(IDD_MAIN), который и будет основным окном.
Код

#include <windows.h>
#include "rec.h"


BOOL CALLBACK MainDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,int nCmdShow)
{    
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), 0, DLGPROC(MainDlgProc));
    return 0;
}



BOOL CALLBACK MainDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
{  
   
   switch(wMsg)                                
   {
        case WM_INITDIALOG: //Событие создания диалога!

            return TRUE;    
         
        case WM_CLOSE:                        
        
            PostQuitMessage(0);
            
            return TRUE;

        case WM_COMMAND:               
           
            return TRUE; 
            
      return FALSE;
   }
   //return FALSE; */
   return FALSE; 
}




Диалог бокс не создается, хотя программа компилится,
а вот если этот DIALOG_BOX (IDD_MAIN) создать поверх главного окна, то он появится.

у меня подозрения, что в строке
Код

 DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), 0, DLGPROC(MainDlgProc));
    return 0;


какая то проблемма с hInstance

Автор: neosapient 21.11.2006, 13:46
Цитата

Диалог бокс не создается, хотя программа компилится,
а вот если этот DIALOG_BOX (IDD_MAIN) создать поверх главного окна, то он появится.


Не совсем понял, что под этой фразой подразумевается.
В листинге, вроде, правильный вызов диалога

Цитата


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,int nCmdShow)
{    
    // у меня подозрения, что в следующей строке, какая то проблемма с hInstance 
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), 0, DLGPROC(MainDlgProc));
    return 0;
}


Пройдись дебагером и ты увидишь, что на вызове этой функции дебагер остановиться и будет стоять пока не закроется диалоговое окно.

Автор: Dmitriy2k 21.11.2006, 20:49
Цитата

Не совсем понял, что под этой фразой подразумевается.
В листинге, вроде, правильный вызов диалога


Диалог бокс не появляется на экране вообще. 
Хотя я протестировал твой пример из темы, связаной с BITMAPOM - там все нормально,
значит я что то не правильно сделал

Автор: neosapient 21.11.2006, 21:09
Возможно, в диалоге использованы дополнительные контролы, типа прогрессбара.
Тогда нужно их подключить 
Код

// подключаем нестандартные контролы
#include <commctrl.h>
#pragma comment(lib,"comctl32.lib")

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,int nCmdShow)
{    
    InitCommonControls (); 
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), 0, DLGPROC(MainDlgProc));
    return 0;
}
...
функция MainDlgProc(...){...}


Покажи свой код, может смогу что-нибудь исправить

Автор: Евгений 22.11.2006, 00:03
Dmitriy2k, ты просмотри в редакторе ресурсов все необходимые стили установил, а то может WS_VISIBLE не установил и оно не показывается. А так код вроде правильный. Или можешь попробовать с помощью функции CreateDialog(). Удачи!

Автор: anwe 22.11.2006, 02:31
Dmitriy2k, по-моему ты смешал два вида дилогов.
Если ты делаешь и RegisterClass(&WndClass)... и hWnd=CreateWindow(.....), то ты используешь в качестве диалогового окна простой диалог. В этом случае надо использовать функцию CreateDialogParam.
Если же ты используешь WM_INITDIALOG и WM_CLOSE, то это имеет отношение к модальному диалогу. В нем вместо WM_CREATE обрабатываеться WM_INITDIALOG, а вместо WM_DESTROY WM_CLOSE. Но тогда совсем не нужен ни цикл сообщений ни процедура окна, а создается окно функцией DialogBoxParam.

Автор: Dmitriy2k 22.11.2006, 14:15
Все. Спасибо, ребят за ответы, это я тормоз.
Я вместо сгенеренного заголовка файла ресурсов "resource.h" подключил свой "rec.h", а там , видимо были разногласия.

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