Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавить в DLL окошко 
:(
    Опции темы
VSB
Дата 18.7.2010, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Нужно в DLL добавить окошко с двумя GroupBox  в которых расположены независящие друг от друга группы RadioButton (в левом - 4 переключателя, в правом - 3). Ну и кнопки OK и Cancel.
И показывать это окно при вызове в процессе работы одной из функций DLL

Как это сделать в студии?
PM MAIL   Вверх
586
Дата 18.7.2010, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 6
Всего: 146



Какой фреймворк используете? WindowsForms, MFC, Qt? Или просто WinAPI?

Это сообщение отредактировал(а) 586 - 18.7.2010, 23:24
PM   Вверх
VSB
Дата 19.7.2010, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Просто WinAPI.

Надо получить примерно такое окно (в DLL)? но только чтобы еще группы RadioButton в разных GroupBox работали независимо
Код

/*
    wcx_linker.cpp
    
    02:46:25 19-07-2010
    
    Generated by VISG v.0.951
    
    VISG: visual and smart GUI builder
    Get the latest version of VISG at
    http://mrhx.clan.su/
    http://mrhx.ucoz.com/
    
    Tested on Visual C++ 6.0 and devcpp
*/

#include <windows.h>
#include <commctrl.h>        // INCLUDE LIBRARY comctl32.lib INTO YOUR PROJECT!
//#include "resource.h"        // UNCOMMENT THIS IF YOU USE RESOURCES.

// names of window classes.
#define WND_CLASS_NAME0 "my_wnd_class_name_0"

// identifiers.
#define IDC_BUTTON_CANCEL   2000
#define IDC_BUTTON_OK       2001
#define IDC_RADIO7          2002
#define IDC_RADIO6          2003
#define IDC_RADIO5          2004
#define IDC_RADIO4          2005
#define IDC_RADIO3          2006
#define IDC_RADIO2          2007
#define IDC_RADIO1          2008
#define IDC_RADIO0          2009
#define IDC_GROUP_FILE      2010
#define IDC_GROUP_DIRECTORY 2011

// function prototypes.
void register_classes();
int message_loop();
HWND create_wnd0();
void create_wnd_content0(HWND parent);
LRESULT CALLBACK wnd_proc0(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);

// global data.
HINSTANCE instance;
HFONT h_font;

// main function.
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinst, LPSTR cmdline, int show)
{
    instance = hinstance;
    InitCommonControls();
    register_classes();
    h_font = CreateFont(-13, 0, 0, 0, FW_NORMAL, 0,
                0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Times New Roman");
    create_wnd0();
    return message_loop();
}

// window procedure #0 [NTFS Linker].
LRESULT CALLBACK wnd_proc0(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch (msg)
    {
    case WM_COMMAND:
        switch (LOWORD(wparam))
        {
        case IDC_BUTTON_CANCEL:    // button "Cancel"
            MessageBox(hwnd, "the button IDC_BUTTON_CANCEL is clicked.", "Event", MB_OK|MB_ICONINFORMATION);
            break;

        case IDC_BUTTON_OK:    // button "OK"
            MessageBox(hwnd, "the button IDC_BUTTON_OK is clicked.", "Event", MB_OK|MB_ICONINFORMATION);
            break;

        }
        break;

    case WM_CREATE:
        create_wnd_content0(hwnd);
        break;

    case WM_CLOSE:
        if (IDYES == MessageBox(hwnd, "Quit?", "Event", MB_YESNO|MB_ICONQUESTION)) DestroyWindow(hwnd);
        break;

    case WM_DESTROY:
        PostQuitMessage(0);    // PostQuitMessage(return_code) quits the message loop.
        break;

    default:
        return DefWindowProc(hwnd, msg, wparam, lparam);
    }
    return FALSE;
}

// create window #0 [NTFS Linker].
HWND create_wnd0()
{
    HWND wnd;
    wnd = CreateWindowEx(0x00000100, WND_CLASS_NAME0, "NTFS Linker", 0x14CF0000, CW_USEDEFAULT, CW_USEDEFAULT, 416, 206, NULL, NULL, instance, NULL);
    ShowWindow(wnd, SW_SHOWNORMAL);
    UpdateWindow(wnd);
    return wnd;
}

// create window content #0 [NTFS Linker].
void create_wnd_content0(HWND parent)
{
    HWND wnd;
    wnd = CreateWindowEx(0x00000000, "Button", "Nothing", 0x50000009, 16, 96, 176, 24, parent, (HMENU) IDC_RADIO3, instance, NULL);
    SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
    wnd = CreateWindowEx(0x00010000, "Button", "File", 0x50020007, 208, 8, 192, 120, parent, (HMENU) IDC_GROUP_FILE, instance, NULL);
    SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
    wnd = CreateWindowEx(0x00000000, "Button", "Nothing", 0x50000009, 216, 96, 176, 24, parent, (HMENU) IDC_RADIO7, instance, NULL);
    SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
    wnd = CreateWindowEx(0x00000000, "Button", "Copy", 0x50000009, 216, 72, 176, 24, parent, (HMENU) IDC_RADIO6, instance, NULL);
    SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
    wnd = CreateWindowEx(0x00000000, "Button", "Cancel", 0x50012F00, 112, 144, 96, 24, parent, (HMENU) IDC_BUTTON_CANCEL, instance, NULL);
    SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
    wnd = CreateWindowEx(0x00000000, "Button", "OK", 0x50012F00, 8, 144, 96, 24, parent, (HMENU) IDC_BUTTON_OK, instance, NULL);
    SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
    wnd = CreateWindowEx(0x00000000, "Button", "Directory", 0x50020007, 8, 8, 192, 120, parent, (HMENU) IDC_GROUP_DIRECTORY, instance, NULL);
    SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
    wnd = CreateWindowEx(0x00000000, "Button", "Create Hard Link", 0x50000009, 216, 24, 176, 24, parent, (HMENU) IDC_RADIO4, instance, NULL);
    SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
    wnd = CreateWindowEx(0x00000000, "Button", "Create Symbolic Link(NT 6+)", 0x50000009, 216, 48, 176, 24, parent, (HMENU) IDC_RADIO5, instance, NULL);
    SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
    wnd = CreateWindowEx(0x00000000, "Button", "Repeat Structure", 0x50000009, 16, 72, 176, 24, parent, (HMENU) IDC_RADIO2, instance, NULL);
    SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
    wnd = CreateWindowEx(0x00000000, "Button", "Create Junction", 0x50000009, 16, 24, 176, 24, parent, (HMENU) IDC_RADIO0, instance, NULL);
    SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
    wnd = CreateWindowEx(0x00000000, "Button", "Create Symbolic Link(NT 6+)", 0x50010009, 16, 48, 176, 24, parent, (HMENU) IDC_RADIO1, instance, NULL);
    SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
}

// register all the window classes.
void register_classes()
{
    WNDCLASS wc;

    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hInstance     = instance;
    wc.lpszMenuName  = NULL;
    wc.style         = CS_PARENTDC | CS_DBLCLKS;

    wc.lpfnWndProc   = wnd_proc0;
    wc.lpszClassName = WND_CLASS_NAME0;

    RegisterClass(&wc);
}

// message loop.
int message_loop()
{
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    DeleteObject(h_font);
    return msg.wParam;
}

/* End of file */

PM MAIL   Вверх
586
Дата 19.7.2010, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 6
Всего: 146



Примерно, так:
Код
HINSTANCE hInstance;

DWORD APIENTRY DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID)
{
    switch(dwReason)
    {
    case DLL_PROCESS_ATTACH:
        hInstance = hinst;
        InitCommonControls();
        register_classes();
        break;
    }
    return TRUE;
}

int message_loop()
{
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    //DeleteObject(h_font);   // вызов будет в функции ShowTheWindow()
    return msg.wParam;
}

int ShowTheWindow()
{
    h_font = CreateFont(-13, 0, 0, 0, FW_NORMAL, 0,
                0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Times New Roman");
    create_wnd0();
    int res = message_loop();
    DeleteObject(h_font);
    return res;
}

__declspec(dllexport) void ExportedFunction1()
{
    //...
    //...
    ShowTheWindow();
    //...
    //...
}

__declspec(dllexport) void ExportedFunction2()
{
    //...
    //...
    ShowTheWindow();
    //...
    //...
}

PM   Вверх
VSB
Дата 19.7.2010, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Функция DllMain не вызывается (проверил отладчиком).
А вообще, вопрос пожалуй даже не об окне (чистым WinAPI оно успешно делается) а о том, как в нем сделать две независимые группы RadioButton'ов, желательно помещенные в GroupBox.
Сначала хотел добавить диалог в ресурсы, но не понял как на нём разделить RadioButton в независимые группы.
PM MAIL   Вверх
Dem_max
Дата 19.7.2010, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 1
Всего: 39



Цитата

Функция DllMain не вызывается (проверил отладчиком).

Если не вызываются то:
1.  DLL не загружается
2. DLL загружается как LoadLibraryEx с флагом LOAD_LIBRARY_AS_IMAGE_RESOURCE


Если любой из 2 вариантов то показать диалог тебе ни как не удастся.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Earnest
Дата 19.7.2010, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(VSB @  19.7.2010,  03:48 Найти цитируемый пост)
как в нем сделать две независимые группы RadioButton'ов, желательно помещенные в GroupBox.

Там весь фокус в стилях. Во-первых, все кнопки группы должны быть расположены по-порядку, между ними - групбокс (что-раньше, групбокс или кнопки - в твоем случае неважно, но я обычно ставлю групбоксы ЗА содержащимися в них контролами). Во-вторых, первая кнопка группы должна иметь стиль WS_GROUP, а остальные  - не иметь. В принципе, должно работать и без групбоксов, но для гарантиии (групбоксы-то все равно есть), им тоже присвой стиль WS_GROUP. Т.е. грппа считается от первого контрола со стилем WS_GROUP до следующего  с ним же (но он уже не входит).



--------------------
...
PM   Вверх
VSB
Дата 19.7.2010, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Dem_max
И тем не менее, всё работает как у 586


Earnest
А не покажете в моем коде?

Это сообщение отредактировал(а) VSB - 19.7.2010, 10:23
PM MAIL   Вверх
Earnest
Дата 19.7.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Когда я вижу код вида "0x50000009" вместо символьных обозначений стилей, мне хочется немедленно застрелить автора. Чего тебе показать? Как WS_GROUP к флагам добавить? Если тебе надо это показывать, тебе пока рано писать программы, а нужно учебники поштудировать.
Цитата(VSB @  19.7.2010,  03:48 Найти цитируемый пост)
Сначала хотел добавить диалог в ресурсы, но не понял как на нём разделить RadioButton в независимые группы. 

Я ведь написала, как. Использование редактора ресурсов - лучший путь в данном случае. Динамическое создание диалогов и контролов иногда бывает полезным, но не в данном случае. Код функции create_wnd_content0 вызывает одно желание - немедленно убить автора. smile 
Впрочем, я повторяюсь.


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


Шустрый
*


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

Репутация: нет
Всего: 2



Earnest
Код не мой, это генератор http://codege.ru/projects/visg/
PM MAIL   Вверх
Dem_max
Дата 19.7.2010, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 1
Всего: 39



Цитата

Когда я вижу код вида "0x50000009" вместо символьных обозначений стилей, мне хочется немедленно застрелить автора

Тогда застрели Била Гейца ибо таких значений в DLL винды полно.


Цитата

И тем не менее, всё работает как у 586

Ты сам себе противоречишь, либо пытаешься нас ввести в заблуждение.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
VSB
Дата 19.7.2010, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Цитата(Dem_max @  19.7.2010,  17:45 Найти цитируемый пост)
Ты сам себе противоречишь, либо пытаешься нас ввести в заблуждение.

Даже и н знаю
Основная программа - Total Commander
WCX Writer's Reference.hlp утверждает, что плагин загружается через LoadLibrary()
Компилятор/отладчик - MS Visual Studio.
Линковка CRT - Multi-threaded Debug DLL (/MDd)
hInstance поставил как NULL (поскольку отладчик показывает, что DllMain не вызывается, а Вызываемый методы не содержат параметра hInstance)

При таком раскладе всё вроде работает, но что делать с hInstance?

А вообще хотел просто узнать как такое сделать через диалог в ресурсах

Earnest, как сделать на чистом WinAPI понял, а как через ресурс диалога - не очень
PM MAIL   Вверх
Earnest
Дата 20.7.2010, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(VSB @  19.7.2010,  20:55 Найти цитируемый пост)
Earnest, как сделать на чистом WinAPI понял, а как через ресурс диалога - не очень 

Ну, добавляешь в ресурс диалога все нужные радио-батоны, выстраиваешь их в нужном порядке (там команда такая есть в меню Format - TabOrder), потом расставляешь стили: как уже было сказано, первой кнопке каждой группе ставишь Group = true (в свойствах контрола), всем последующим - false. Групбоксы расположи до или после каждой группы кнопок, и тоже поставь им Group = true. Кстати, в редакторе ресурсов есть команда Test Dialog, с ее помощью можно проверить как функционируют группы кнопок (они должны правильно переключаться). Ах да, радиобатоны должны меть стиль Auto, но по-меоему они так и создаются по-умолчанию.


--------------------
...
PM   Вверх
VSB
Дата 20.7.2010, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Earnest
Это хорошо, но как это всё показать и обрабатывать?
PM MAIL   Вверх
Earnest
Дата 20.7.2010, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Кому показать-то? В смысле, создать диалог из ресурсов? Если чистый АПИ, то смотри функции DialogBox или CreateDialog, в зависимости от того, модальный тебе нужен диалог или нет. А обрабатывать - так диалоговая процедура для этого пишется.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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