Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли в диалоге создать кнопку, Продолжаю мучать диалоги 
V
    Опции темы
neosapient
Дата 9.10.2006, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Есть не которое диалоговое окно, которое я подгружаю из ресурсов.
Я хочу создать в нем кнопку, по известным мне координатам, определенного размера и уникальным индентификатором (в перспективе это порядка ста кнопок).
Могу ли я это сделать не из ресурсов, а скажем в момент инициализации диалога.
Короче вот текст
Код

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

HINSTANCE hInst;                                // current instance

LRESULT CALLBACK PlayBox(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

#define MY_ID_BUTTON 1

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    hInst = hInstance;
    return    (int)DialogBox(hInst, (LPCTSTR)IDD_PLAYBOX, NULL, (DLGPROC)PlayBox);
}

LRESULT CALLBACK PlayBox(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    int i;
    HWND hButton;
    switch (message)
    {
    case WM_INITDIALOG:
        hButton = CreateWindow("button", "Test", WS_VISIBLE | WS_CHILD, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, hDlg, NULL, hInst, NULL);
        i = GetLastError();
        if(i==ERROR_INVALID_MENU_HANDLE)
            MessageBox(NULL,"Invalid menu handle.","title",MB_OK);
        ShowWindow(hButton,SW_SHOW);
        i = GetLastError();
        break;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDCANCEL:
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return FALSE;
}


Значит, кнопка не появляется.
Если стиль в CreateWindow сменить с WS_VISIBLE | WS_CHILD на WS_OVERLAPPEDWINDOW | WS_CHILD, то что-то появляется, но не то.

И еще если говорить об индентификаторе. Раньше я его вставлял 9-ым параметром, вместо меню, например, (HMENU) MY_ID_BUTTON.
Но счас что-то не срабатывает.

Надеюсь, всю ситуацию объяснил
PM MAIL   Вверх
GremlinProg
Дата 9.10.2006, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Выставь нормальные координаты и все будет ок
Код

HWND hButton = CreateWindow("button", "Test", WS_VISIBLE | WS_CHILD, 0, 0, 100, 20, hDlg, NULL, hInst, NULL);



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
neosapient
Дата 9.10.2006, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Хорошо, это работает.

А как насчет индентификатора.
Цитата

Раньше я его вставлял 9-ым параметром, вместо меню, например, (HMENU) MY_ID_BUTTON.


То есть, чтобы я мог затем использовать 
Код

HWND GetDlgItem(
    HWND hDlg,
    int nIDDlgItem
);

BOOL SetDlgItemInt(
    HWND hDlg,
    int nIDDlgItem,
    UINT uValue,
    BOOL bSigned
);

LRESULT SendDlgItemMessage(
    HWND hDlg,
    int nIDDlgItem,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
);

PM MAIL   Вверх
GremlinProg
Дата 9.10.2006, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



вставляй, только проверь, что идентификатор не совпадает с тем, что уже лежит на диалоге. Ну, не 1, конечно, возьми хотя бы 100.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
neosapient
Дата 10.10.2006, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Спасибо, все заработало.
Интерестно, а почему нельзя в качестве индентификатора передать 1.
PM MAIL   Вверх
Earnest
Дата 10.10.2006, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Потому что такой идентификатор у стандартной кнопки OK, которая у тебя наверняка есть.


--------------------
...
PM   Вверх
neosapient
Дата 10.10.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



OK - 1
CANCEL - 2
Понял.

Только не понял почему их ID не прописаны в resource.h
Хотя ID самого диалога там прописано.

Вопрос, на сладкое, где (в MSDN) подсмотреть ID, для всех "встроеных" в диалог контролов, типа этих OK и CANCEL, и есть ли таковые еще в принцыпе.
PM MAIL   Вверх
Earnest
Дата 10.10.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Кое-что есть в winuser.h


--------------------
...
PM   Вверх
neosapient
Дата 10.10.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Действительно нашел в winuser.h 

Код

/*
 * Dialog Box Command IDs
 */
#define IDOK                1
#define IDCANCEL            2
#define IDABORT             3
#define IDRETRY             4
#define IDIGNORE            5
#define IDYES               6
#define IDNO                7
#if(WINVER >= 0x0400)
#define IDCLOSE         8
#define IDHELP          9
#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0500)
#define IDTRYAGAIN      10
#define IDCONTINUE      11
#endif /* WINVER >= 0x0500 */

#if(WINVER >= 0x0501)
#ifndef IDTIMEOUT
#define IDTIMEOUT 32000
#endif
#endif /* WINVER >= 0x0501 */


Добавлено @ 14:42 
Всем спасибо, вопросов более по этой теме нет
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.