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


Автор: knut 31.10.2006, 16:51
Ппивет Всем
вот под WinCE делаю диалог но он не отображается подскажите почему?
Код

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPTSTR    lpCmdLine,
                   int       nCmdShow)
{
     wc1.style = CS_HREDRAW | CS_VREDRAW;
     wc1.lpfnWndProc = (WNDPROC)WndProc;
     wc1.cbClsExtra = 0;
     wc1.cbWndExtra = DLGWINDOWEXTRA;
     wc1.hInstance = hInstance;
     wc1.hCursor = LoadCursor(NULL,IDC_ARROW);
     wc1.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
     wc1.lpszMenuName = NULL;
         
       RegisterClass(&wc1);
       hwnd = CreateDialog(hInstance,MAKEINTRESOURCE(129),0,0);
       UpdateWindow(hwnd);
       ShowWindow(hwnd,SW_SHOW); 
}

Автор: Nastya 31.10.2006, 17:41
Не совсем поняла, что за сласс ты регистришь и зачем.
И где твоя DlgProc

И не стоит забывать про GetLastError smile

Автор: neosapient 31.10.2006, 18:04
Я так понимаю, что класс, который вы не указали, здесь совсем не нужен.
Далее вы используетеъ
hwnd = CreateDialog(hInstance,MAKEINTRESOURCE(129),0,0);
Последним 4-ым параметром должена быть функция обработки сообщений WndProc.
Затем надо отобразить окно ShowWindow(hwnd,SW_SHOW);
И еще добавляем цикл обработки сообщений
Резюмирую
Код

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

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPTSTR    lpCmdLine,
                   int       nCmdShow)
{
    hwnd = CreateDialog(hInstance,MAKEINTRESOURCE(129),0,WndProc);
    ShowWindow(hwnd,SW_SHOW); 
    MSG msg;
    while( GetMessage( &msg, 0,0,0 ) )
    {
        if(! IsDialogMessage( hwnd , &msg) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }
}


Но проще так.
Код

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

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPTSTR    lpCmdLine,
                   int       nCmdShow)
{
    hwnd = DialogBox(hInstance,MAKEINTRESOURCE(129),0,WndProc);
}


Надеюсь помог.

Автор: Gwendolen 31.10.2006, 23:07
Была недавно моя тема по зтому поводу воспользуйся поиском там про главные окна из ресурсов с классом и без класов.
Если без класса надо в ресурсе удалить строку например CLASS "MY_EXCLUSIVE_CLASS"
Во вторых мой компилятор С требует полного заполнения WNDCLASSEX.
Но на всякий случай повторюсь:
res.rc:
Код

#include "apptype.h"
1000 DIALOGEX 6,6,194,102
CAPTION "FORM"
FONT 8,"MS Sans Serif",0,0
#ifdef MAIN_CLASS
CLASS "MY_EXCLUSIVE_CLASS"
#endif
STYLE 0x10CF0000
BEGIN
  CONTROL "Cld Wnd",1001,"Button",0x50010000,38,16,114,63
END
2000 DIALOGEX 0,0,239,87
CAPTION "CLD FORM"
FONT 8,"MS Sans Serif",0,0
STYLE 0xD0CF0040
BEGIN
  CONTROL "Get Cld",2001,"Button",0x50010F01,74,32,50,14
END


apptype.h:
Код

#define MAIN_CLASS

main.c:
Код

#include <windows.h>

#include "apptype.h"

BOOL CALLBACK ChDlgProc( HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    static HWND hWndPrnt; 
     switch( msg )
      {
         case WM_DESTROY :
             //PostQuitMessage(0);
             return TRUE;
         break;
     case WM_CLOSE://WM_SYSCOMMAND:
            //if (wParam == SC_CLOSE)
              {
                 EndDialog(wnd, 0);
                 return TRUE;
              }
         break;
        case WM_COMMAND:
        if (LOWORD(wParam) == 2001)
            {
                SetWindowText (GetParent((HWND) lParam), __TEXT("Caption: Child"));
                hWndPrnt    = GetParent (wnd);
                SetWindowText (hWndPrnt, __TEXT("Caption: GetParent"));
                return TRUE;
              }
         break;
      }
     return FALSE;
  }


/*
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  {
     MSG msg;    
     HWND MainWnd;
     
     MainWnd=CreateDialog(hInstance, MAKEINTRESOURCE(1000), 0, MainDlgProc);
     ShowWindow(MainWnd, SW_SHOW );
     
     while (GetMessage(&msg,0,0,0) )
        {
         if (MainWnd!=0)
            {
             if (IsDialogMessage(MainWnd, &msg))
               {continue;}
            }
         TranslateMessage(&msg);
         DispatchMessage(&msg);
        }
     return msg.wParam;
  }
*/

#ifdef MAIN_CLASS
LRESULT CALLBACK WindowProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam)
  {
      switch( msg )
      {
         case WM_DESTROY :
             PostQuitMessage(0);
             return 0;
         break;   
        case WM_COMMAND:
        if (LOWORD(wParam) == 1001)
            {
                 DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(2000), wnd, ChDlgProc);
                 return 0;
              }
         break;         
      }    
      return DefWindowProc(wnd,msg,wParam,lParam);
  }    
#else
BOOL CALLBACK MainDlgProc( HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam )
  {
     switch( msg )
      {
         case WM_DESTROY :
             PostQuitMessage(0);
             return TRUE;
         break;
     case WM_CLOSE://WM_SYSCOMMAND:
            //if (wParam == SC_CLOSE)
              {
                 //EndDialog(wnd, 0);
                 //PostQuitMessage(0);
                 DestroyWindow(wnd);
                 return TRUE;
              }
         break;
        case WM_COMMAND:
        if (LOWORD(wParam) == 1001)
            {
                 DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(2000), wnd, ChDlgProc);
                 return TRUE;
              }
         break;
      }
     return FALSE;
  } 
#endif
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  {
     MSG msg;    
     HWND MainWnd;
#ifdef MAIN_CLASS     
     WNDCLASSEXA wc;
     
     wc.cbSize = sizeof(WNDCLASSEXA);
     wc.style = CS_HREDRAW | CS_VREDRAW;
     wc.lpfnWndProc = (WNDPROC)WindowProc;
     wc.cbClsExtra = 0;
     wc.cbWndExtra = DLGWINDOWEXTRA;
     wc.hInstance = hInstance;
     wc.hIcon = LoadIcon(NULL, IDI_QUESTION);
     wc.hCursor = LoadCursor(NULL,IDC_ARROW);
     wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
     wc.lpszMenuName = NULL;
     wc.lpszClassName = "MY_EXCLUSIVE_CLASS";
     wc.hIconSm = NULL;
     
     RegisterClassEx(&wc);
     MainWnd=CreateDialog(hInstance, MAKEINTRESOURCE(1000), 0, NULL);
#else
    MainWnd=CreateDialog(hInstance, MAKEINTRESOURCE(1000), 0, MainDlgProc);
#endif
    ShowWindow(MainWnd, SW_SHOW ); 
     
     while (GetMessage(&msg,0,0,0) )
        {
         if (MainWnd!=0 )
            {
             if (IsDialogMessage(MainWnd, &msg))
               {continue;}
            }
         TranslateMessage(&msg);
         DispatchMessage(&msg);
        }
     return msg.wParam;
  }


Добавлено @ 23:20 
Кстати
Цитата(neosapient @  31.10.2006,  18:04 Найти цитируемый пост)
// подключаем нестандартные контролы
#include <commctrl.h>
#pragma comment(lib,"comctl32.lib")

и InitCommonControls (); забывать не надо, малоли что...

Автор: neosapient 1.11.2006, 20:40
Цитата

и InitCommonControls (); забывать не надо, малоли что...

действительно не надо
Код

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

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPTSTR    lpCmdLine,
                   int       nCmdShow)
{
    InitCommonControls (); 
    hwnd = DialogBox(hInstance,MAKEINTRESOURCE(129),0,WndProc);
}

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