Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2011, 11:10   #1
БалаШагаЛ
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 131
По умолчанию Элементы диалога в обычном (не диалоговом!) окне

Здравствуйте, товарищи программисты!
Начал недавно изучать WinApi на C++. Научился создавать структуру окна, прорисовывать битмэпы и графические примитивы и прочее. Только вот не знаю как данные от пользователя брать. Вернее читал я про диалоговые окна, но это неудобно, потому что тогда для каждого ввода открывается новое окно. Можно ли как-то добавить в обычное окно кнопки и поля ввода?
БалаШагаЛ вне форума Ответить с цитированием
Старый 03.11.2011, 11:24   #2
Ang15
Пользователь
 
Регистрация: 02.07.2011
Сообщений: 38
По умолчанию

Вроде можно. Создать окно верхнего уровня. На него наставить дочерние окна (кнопки, окна редактироваия, др.).
Ang15 вне форума Ответить с цитированием
Старый 03.11.2011, 11:49   #3
БалаШагаЛ
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 131
По умолчанию

Можете кинуть ссылки на какие-то материалы по этой теме? Пожалуйста.
БалаШагаЛ вне форума Ответить с цитированием
Старый 03.11.2011, 11:59   #4
Ang15
Пользователь
 
Регистрация: 02.07.2011
Сообщений: 38
По умолчанию

Ссылки дать, к сожалению, не могу.
Ang15 вне форума Ответить с цитированием
Старый 03.11.2011, 13:45   #5
flance
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 184
По умолчанию

Windows считает все объекты - окнами (что неудивительно, учитывая название =) ).

Вы ведь создаете главное окно CreateWindowEx.
Этой же функцией создаются кнопки и т.п.
Разницы в общем две
1) главное окно является дочерним к рабочему столу (hWndParent = 0), а элементы управления дочерние к этому окну.
2) у элементов управления есть свои классы- "button", "edit" и т.д. класс вашего окна скорее всего зарегистрирован вами "вручную" (через RegisterClass)

за дополнительной инфой msdn.com
Программист-фрилансер, готовый рассмотреть предложения на постоянную удаленную работу... Ответственный, трудолюбивый
telegram: flancejob
flance вне форума Ответить с цитированием
Старый 03.11.2011, 14:26   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Интересно, а что такое элементы диалога?
Диалоги то по сути просто удобный метод создания форм.

Берете и создаете например EDIT, и потом берете текст с него (GetWindowText)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.11.2011, 00:36   #7
Ang15
Пользователь
 
Регистрация: 02.07.2011
Сообщений: 38
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Интересно, а что такое элементы диалога?
Диалоги то по сути просто удобный метод создания форм.

Берете и создаете например EDIT, и потом берете текст с него (GetWindowText)
Раз на то пошло, то можно ещё послать сообщение WM_GETTEXT функцией SendMessage.
Ang15 вне форума Ответить с цитированием
Старый 04.11.2011, 01:08   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я знаю, но GetWindowText удобнее
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.11.2011, 23:26   #9
БалаШагаЛ
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 131
По умолчанию

Спасибо всем за помощь. Я понял, но не до конца. Вот код:
Код:
#include "windows.h"

LRESULT CALLBACK WindowFunc(HWND,UINT,UINT,LONG);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdParam,int nCmdShow)
{
    WNDCLASS WndClass;
    HWND hWnd;
    HWND ButWnd;
    MSG Msg;
    WndClass.style=CS_HREDRAW|CS_VREDRAW;
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hInstance=hInstance;
    WndClass.hbrBackground=(HBRUSH)(LTGRAY_BRUSH);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.lpszClassName="WndClass";
    WndClass.lpszMenuName=NULL;
    WndClass.lpfnWndProc=WindowFunc;

    if (!RegisterClass(&WndClass))
    {
        MessageBox(NULL,"Window class error!","ERROR",MB_OK);
        return 0;
    }
    hWnd=CreateWindow("WndClass","Кнопка",WS_OVERLAPPEDWINDOW,
                      CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
                      NULL,NULL,hInstance,NULL);
    ButWnd=CreateWindow("BUTTON","Кнопка",WS_POPUP,
                      0,50,150,200,
                      hWnd,NULL,hInstance,NULL);
    if ((!hWnd)||(!ButWnd))
    {
        MessageBox(NULL,"Create window error!","ERROR",MB_OK);
        return 0;
    }
    ShowWindow(hWnd,SW_SHOWMAXIMIZED);
    ShowWindow(ButWnd,SW_SHOW);
    UpdateWindow(hWnd);
    UpdateWindow(ButWnd);
    while(GetMessage(&Msg,NULL,0,0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

LRESULT CALLBACK WindowFunc(HWND hWnd,UINT Message,UINT wParam,LONG IParam)
{
    switch(Message)
    {
        case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd,Message,wParam,IParam);
}
Здесь получилось создать кнопку, но как перехватить нажатие на неё?
БалаШагаЛ вне форума Ответить с цитированием
Старый 05.11.2011, 23:51   #10
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

В самом начале пропишем идентификатор для кнопки:
Код:
 #define myButton 1	// Устанавливаем идентификатор для кнопки
Код:
  ButWnd=CreateWindow("BUTTON","Кнопка",BS_PUSHBUTTON |WS_CHILD |WS_VISIBLE, 0,50,150,200, hWnd,(HMENU)myButton,hInstance,NULL);// создание кнопки
Здесь мы создали кнопку, кстате, если использовали стиль WS_VISIBLE, то следующий код не нужен, так как кнопка и так будет видима:
Код:
 ShowWindow(ButWnd,SW_SHOW); // этот код уже не нужен, если использовали стиль WS_VISIBLE
 UpdateWindow(ButWnd); // этот код уже не нужен, если использовали стиль WS_VISIBLE
Ну и обработчик сообщений:
Код:
LRESULT CALLBACK WindowFunc(HWND hWnd,UINT Message,UINT wParam,LONG IParam)
{
   switch(Message)
   {
      case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
      case WM_COMMAND:
         switch( wParam)   // Переключатель на случай, если много объектов будет
         {
             case myButton:  // Если кнопка была нажата
                MessageBoxA( hWnd,"кнопка нажата","message",0);
                return 0;
         }
   }
   return DefWindowProc(hWnd,Message,wParam,IParam);
}

Последний раз редактировалось An1ka; 06.11.2011 в 00:01.
An1ka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод матрицы в диалоговом окне stas135642 Общие вопросы по Java, Java SE, Kotlin 2 24.10.2011 00:11
Как отловить сообщения с EditBox в диалоговом окне WinApi Gillian Foster Visual C++ 5 19.04.2011 20:52
Рисунок на диалоговом окне!! HunterMan Win Api 4 10.06.2008 12:25
Рисование в диалоговом окне (Си++) molo4nik Помощь студентам 1 06.05.2008 18:27
изменить цвет в диалоговом окне MessageDlg Михаил Юрьевич Общие вопросы Delphi 8 27.04.2008 18:20