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


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

#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.
Но счас что-то не срабатывает.

Надеюсь, всю ситуацию объяснил

Автор: GremlinProg 9.10.2006, 21:59
Выставь нормальные координаты и все будет ок
Код

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

Автор: neosapient 9.10.2006, 22:16
Хорошо, это работает.

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

Раньше я его вставлял 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
);

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

Автор: neosapient 10.10.2006, 07:52
Спасибо, все заработало.
Интерестно, а почему нельзя в качестве индентификатора передать 1.

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

Автор: neosapient 10.10.2006, 12:50
OK - 1
CANCEL - 2
Понял.

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

Вопрос, на сладкое, где (в MSDN) подсмотреть ID, для всех "встроеных" в диалог контролов, типа этих OK и CANCEL, и есть ли таковые еще в принцыпе.

Автор: Earnest 10.10.2006, 14:34
Кое-что есть в winuser.h

Автор: neosapient 10.10.2006, 14:40
Действительно нашел в 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 
Всем спасибо, вопросов более по этой теме нет

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