Диалог как основное окно

Тема в разделе "LANGS.C", создана пользователем Rito, 22 июл 2008.

  1. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Помогите кто знает.
    До этого я не писал на C++ диалоговое приложение. Есть программа на асме, я попробовал перевести с асма на С++, но возникла проблема. Не работают кнопки в окне.
    Не батоны, а кнопки сворачивания, закрытия.
    Код (Text):
    1. HWND hWnd;
    2. /***********************************************************************************
    3. * Имя: WindowFunc                                                                  *
    4. *                                      *
    5. ***********************************************************************************/
    6. LRESULT CALLBACK WindowFunc (HWND hwnd,
    7.                              UINT message,
    8.                              WPARAM wParam,
    9.                              LPARAM lParam)
    10. {
    11.     //--------------------------------------------------------------------------//
    12.     //Локальные переменные
    13.     //--------------------------------------------------------------------------//
    14. static HINSTANCE hinstance = GetModuleHandle(0);
    15.     switch(message)
    16.     {
    17.     case WM_CREATE:
    18.         break;
    19.     case WM_DESTROY:   
    20.         PostQuitMessage(0);
    21.         break;
    22.     default:
    23.         return DefWindowProc(hwnd,message,wParam,lParam);
    24.     }
    25.  
    26.     return 0;
    27. }
    28. /***********************************************************************************
    29. * Имя: Initialization                                                              *
    30. *                                            *
    31. ***********************************************************************************/
    32. int Initialization()
    33. {
    34.     //--------------------------------------------------------------------------//
    35.     //Локальные переменные
    36.     char ProcessName[] = "Kybik";                           //Имя процесса
    37.     char WindowsName[] = "Kybik";               //Имя окна
    38.     WNDCLASSEX wcl;                                     //Структура для Win-окна
    39.     HINSTANCE hinstance;                                //Хинстанс для окна
    40.     //--------------------------------------------------------------------------//
    41.  
    42.     //Берём текущий хинстанс
    43.     hinstance = GetModuleHandle(NULL);                 
    44.  
    45.     //Заполняем структуру для будущего окна
    46.     wcl.hInstance=hinstance;                                           
    47.     wcl.lpszClassName=ProcessName;                         
    48.     wcl.lpfnWndProc=(WNDPROC) WindowFunc;                          
    49.     wcl.style=CS_HREDRAW | CS_VREDRAW;                     
    50.     wcl.cbSize=sizeof(WNDCLASSEX);                         
    51.     wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);              
    52.     wcl.hIconSm=LoadIcon(NULL,IDI_WINLOGO);                
    53.     wcl.hCursor=LoadCursor(NULL,IDC_ARROW);                
    54.     wcl.lpszMenuName=NULL;                                 
    55.     wcl.cbClsExtra=0;                                  
    56.     wcl.cbWndExtra=DLGWINDOWEXTRA;                                     
    57.     wcl.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    58.  
    59.     //Регистрируем наш класс
    60.     if (!RegisterClassEx(&wcl))                            
    61.     {
    62.         MessageBox(NULL,"Failed To Register The Window Class.","-ERROR-",MB_OK|MB_ICONEXCLAMATION);
    63.         return 0;
    64.     }
    65.  
    66.     //Создаём окно
    67.     /*if (!(hWnd=CreateWindowEx(    WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,                    
    68.                                 ProcessName,                       
    69.                                 WindowsName,                       
    70.                                 WS_OVERLAPPEDWINDOW |                      
    71.                                 WS_CLIPSIBLINGS |                  
    72.                                 WS_CLIPCHILDREN,                   
    73.                                 0, 0,                          
    74.                                 800,   
    75.                                 600,   
    76.                                 NULL,                              
    77.                                 NULL,                  
    78.                                 hinstance,                 
    79.                                 NULL)))                
    80.     {
    81.         MessageBox(NULL,"Window Creation Error.","-ERROR-",MB_OK|MB_ICONEXCLAMATION);
    82.         return 0;
    83.     }*/
    84.     hWnd = CreateDialogParam(hinstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,NULL,50);
    85.  
    86.     //hWnd = CreateDialogParam(hinstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)WindowFunc,50);
    87.  
    88.     return 1;
    89. }
    90. /***********************************************************************************
    91. * Имя: WinMain                                                                     *
    92. *                                           *
    93. ***********************************************************************************/
    94. int WINAPI WinMain( HINSTANCE hThisInst,
    95.                     HINSTANCE hPrevInst,
    96.                     LPSTR lpszArgs,
    97.                     int nWinMode)
    98. {
    99.     //--------------------------------------------------------------------------//
    100.     //Локальные переменные
    101.     MSG msg;                                            //Сообщения
    102.     //--------------------------------------------------------------------------//
    103.  
    104.     if(!Initialization()) return 0;
    105.  
    106.     ShowWindow(hWnd,SW_SHOW);
    107.  
    108.     while (GetMessage(&msg,NULL,0,0))
    109.     {
    110.         if(!IsDialogMessage(hWnd,&msg))
    111.         TranslateMessage(&msg);
    112.         DispatchMessage(&msg);
    113.     }
    114.  
    115.     return 0;
    116. }
    Т.е. приложение создаётся, всё нормально работает, кроме кнопок.
    Заранее благодарю
     
  2. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Код (Text):
    1. HWND CreateDialogParam(
    2.  
    3.     HINSTANCE hInstance,    // handle to application instance
    4.     LPCTSTR lpTemplateName, // identifies dialog box template
    5.     HWND hWndParent,    // handle to owner window
    6.     DLGPROC lpDialogFunc,   // pointer to dialog box procedure  
    7.     LPARAM dwInitParam  // initialization value
    8.    );
    lpDialogFunc у тебя установлен в NULL, а должен передаваться адрес процедуры обработки сообщений, кнопок.

    Код (Text):
    1. hWnd = CreateDialogParam(hinstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,NULL,50);
     
  3. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Код (Text):
    1. BOOL CALLBACK MainDlgProc (HWND hDlg, UINT uiMsg, WPARAM wp, LPARAM lp)
    2. {
    3.     switch (uiMsg)
    4.     {
    5.         case WM_INITDIALOG:
    6.             // Do whatever needed for WM_CREATE...
    7.             break;
    8.  
    9.         case WM_COMMAND:
    10.             // Any command or button click comes here
    11.             break;
    12.  
    13.         default:
    14.             return FALSE; // Message was not processed
    15.     }
    16.     return TRUE; // Message was processed
    17. }
    18.  
    19. int WINAPI WinMain (HINSTANCE hInst, ...)
    20. {
    21.     DialogBox (hInst, MAKEINTRESOURCE (IDD_DIALOG1), NULL, (DLGPROC) MainDlgProc);
    22.     return 0;
    23. }
     
  4. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    jCronuz
    Я так сделал потому что у меня есть асм код. Вот он
    Код (Text):
    1. invoke  GetModuleHandle,0
    2.     mov hInstance,eax
    3.     mov     stWNDCLASSEX.cbSize,SIZEOF WNDCLASSEX
    4.     mov     stWNDCLASSEX.style, CS_HREDRAW or CS_VREDRAW
    5.         mov     stWNDCLASSEX.lpfnWndProc, OFFSET WindowProc
    6.         mov     stWNDCLASSEX.cbClsExtra,NULL
    7.         mov     stWNDCLASSEX.cbWndExtra,DLGWINDOWEXTRA
    8.         push    hInstance
    9.         pop     stWNDCLASSEX.hInstance
    10.         mov     stWNDCLASSEX.hbrBackground,COLOR_BTNFACE+1
    11.         mov     stWNDCLASSEX.lpszMenuName, OFFSET strMenu  
    12.         mov     stWNDCLASSEX.lpszClassName,OFFSET strClassName
    13.         invoke  LoadIcon,NULL,IDI_APPLICATION
    14.         mov     stWNDCLASSEX.hIcon,eax
    15.         mov     stWNDCLASSEX.hIconSm,eax
    16.         invoke  LoadCursor,NULL,IDC_CROSS
    17.         mov stWNDCLASSEX.hCursor, eax  
    18.  
    19.     ;***********************************************************************
    20.     ;Регистрируем класс и создаём окно
    21.     ;***********************************************************************
    22.     invoke  RegisterClassEx, addr stWNDCLASSEX
    23.     invoke  CreateDialogParam,hInstance,ADDR strWindowName,NULL,NULL,50
    24.     mov hDlg,eax
    И это работает. Кстати у Iczelion'а точно так же. Собственно я по нему и делал асм программу.
    AsmGuru62
    Сделал как написано. Всё равно диалог работает, но не закрывается.
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    в callback не поступают сообщения, надо сначала найти почему, а потом уже разруливать сообщения.
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Я не привёл код обработчика для WM_COMMAND - естественно, надо ответить на это стандартным EndDialog(...). Можно также по ESC минимизировать диалог, вместо его закрытия (если это главное окно). При нажатии [Х] приходит WM_CLOSE, а при нажатии ESC - нет.
     
  7. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Всё получилось. Благодарю. Ещё один вопрос. Делаю List Control. Сделал column. Теперь пытаюсь впихнуть в этот лист какие то данные. У меня данные вставляются только почему то в первый column. Т.е. первый столбец заполняется, остальные нет.
    Посмотрел MSDN вроде всё тоже самое. Только там используют макрос ListView_InsertItem, но результата с ним тоже нет. Как мне заполнить остальные столбцы.

    Код (Text):
    1. lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
    2. lvc.pszText = "1";
    3. lvc.cx = 150;
    4. SendMessage(hList, LVM_INSERTCOLUMN, 0, (LPARAM)&lvc);
    5.  
    6. lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
    7. //lvc.fmt = LVCFMT_RIGHT;
    8. lvc.pszText = "2";
    9. lvc.cx = 150;
    10. SendMessage(hList, LVM_INSERTCOLUMN, 1, (LPARAM)&lvc);,
    11.  
    12. lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
    13. lvi.state = 0;
    14. lvi.stateMask = 0;
    15. lvi.pszText = "Текст1";
    16. lvi.iSubItem  = 0;
    17. lvi.iItem = 0;
    18. //lvi.lParam = (LPARAM) &rgPetInfo[1];
    19. //lvi.pszText = LPSTR_TEXTCALLBACK;
    20. //SendMessage(hList, LVM_INSERTITEM,0, (LPARAM)&lvi);
    21. ListView_InsertItem(hList, &lvi);
    22.  
    23. lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
    24. lvi.state = 0;
    25. lvi.stateMask = 0;
    26. lvi.pszText = "Текст2";
    27. lvi.iSubItem  = 0;
    28. lvi.iItem = 0;
    29. //lvi.puColumns = 1;
    30. //lvi.lParam = (LPARAM) &rgPetInfo[1];
    31. //lvi.pszText = LPSTR_TEXTCALLBACK;
    32. //SendMessage(hList, LVM_INSERTITEM,0, (LPARAM)&lvi);
    33. ListView_InsertItem(hList, &lvi);
     
  8. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    LVM_INSERTITEM для добавления новой строки в ListView. Для изменения текста в колонках нужен LVM_SETITEMTEXT.
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    LVM_INSERTITEM добавляет новый итем и устанавливает текст первой колонки. Для второй и последующих колонок добавление текста производится через LVM_SETITEM. Или же использовать макрос ListView_SetItemText.