Форум программистов, компьютерный форум CyberForum.ru

Создание диалогового окна из DLL - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
5hev
1 / 1 / 0
Регистрация: 30.10.2011
Сообщений: 6
07.05.2012, 18:32     Создание диалогового окна из DLL #1
Доброго всем времени!
Ситуация следующая:
Создаю DLL для внешнего приложения, которая обменивается с ним сообщениями (плагин). Возникла необходимость настройки моего плагина, решил сделать диалоговое окно с настройками, которое должно появляться в ответ на запрос этого самого внешнего приложения.
Из-за нехватки опыта, для меня пока непонятно, есть ли разница для сабжа в расширении моей программы (exe, dll)?
В MSVS2010 доступно только создание мастером форм MS и MFC, что для меня лес темный. При этом, создавая элемент MS Forms, получаю что-то вообще ужасное и пока неясное в лице C++/CLI.

В то же время, на этом же форуме нашел много тем, где (как я понял) используется WinAPI:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
#include <windows.h>                     //Два файла с определениями, макросами
#include <windowsx.h>                  //и прототипами функций Windows
//глобальные переменные для рисования окна
HINSTANCE hInstance; HINSTANCE hPrevInst; 
LPSTR lpszArgs; int nWinMode;
/*Прототип используемой в программе оконной функции */
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM); 
/*Произвольный класс*/
class exemple
{
    public: 
        /*Главная функция приложения WinMain*/
        int  WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInst, 
        LPSTR lpszArgs, int nWinMode) {
        char szWinName[ ]="MyWindow";      //Произвольное имя класса главного окна
        char szTitle[ ]="Программа";               //Произвольный заголовок окна
        MSG msg;                    //Структура msg типа MSG для получения сообщений Windows
        WNDCLASS wc;                                  //Структура wc типа WNDCLASS для задания 
                                    //характеристик окна
        /*Заполнение структуры wc типа WNDCLASS для описания класса главного окна*/
        ZeroMemory(&wc,sizeof(wc));                             //Обнуление всех членов структуры wc
        wc.hInstance= hInstance;                                       // Дескриптор приложения
        wc.lpszClassName=szWinName;                           // Имя класса окна
        wc.lpfnWndProc=WindowFunc;                           // Определение оконной функции 
        wc.style=0;                                                            // Стиль по умолчанию
        wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);           //Стандартная пиктограмма
        wc.hCursor=LoadCursor(NULL,IDC_ARROW);              //Стандартный курсор мыши
        wc.hbrBackground=GetStockBrush(WHITE_BRUSH);         // Белый фон окна
        wc.lpszMenuName=NULL;                                  // Без меню
        wc.cbClsExtra=0;                                                  // Без дополнительной информации
        wc.cbWndExtra=0;                                                // Без дополнительной информации
        /*Регистрация класса главного окна*/
        if(!RegisterClass (&wc))                                         //Если класс окна не регистрируется
        {                                    // выводим сообщение и заканчиваем выполнение программы
        MessageBox (NULL,"Окно нерегестрируется","Ошибка",MB_OK);
        return 1;}                                                           // возвращаем код ошибки
        /*Создание главного окна и отображение его на мониторе*/
        HWND hwnd = CreateWindow (                           //Вызов функции API для создания ок-на
        szWinName,                                             // имя класса главного окна
                        szTitle,                                                       // заголовок окна
                        WS_OVERLAPPEDWINDOW,               // Стиль окна 
                        100,                                                            // x-координата левого угла окна
                        100,                                                            // y-координата левого угла окна
                        500,                                                            // Ширина окна
                        100,                                                            // Высота окна
                        HWND_DESKTOP,                                  // Без родительского окна
                        NULL,                                                       // Без меню
                        hInstance,                                                  // Дескриптор приложения
                        NULL);                                                     // Без дополнительных аргументов
        ShowWindow (hwnd, SW_SHOWNORMAL);       //  Вызов функции API
                                            // для отображения окна 
        /*Организация цикла обнаружения сообщений*/
        while(GetMessage(&msg,NULL,0,0))               // Если есть сообщение, передать его
                    // нашему приложению
        DispatchMessage(&msg);                               //и вызвать оконную функцию WindowFunc 
        return 0;                                                     //После выхода из цикла вернуться в Windows
        }                                                                    //Конец функции WinMain
        
};
 
/*Оконная функция WindowFunc главного окна, вызываемая Windows и получающая в качестве параметра сообщение из очереди сообщений данного приложения */
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message,
                                WPARAM wParam, LPARAM lParam)  {
switch(message) {                                      // выбор по значению сообщения (message)
case WM_DESTROY:                           //При завершении приложения пользователем
PostQuitMessage (0);                           //вызвать функцию API завершения приложения
break; 
default:                                    // Все сообщения, не обрабатываемые данной функцией,
                                            // направляются на обработку по умолчанию 
return DefWindowProc (hwnd,message,wParam,lParam);
}                                                           //Конец оператора switch
return 0;
}
//главная функция консольного приложения
int main(void)
{
    
    setlocale(LC_ALL,"Russian_Russia.1251");//изменения кодировки для вывода русского языка 
    SYSTEMCRASH: //точка возврата
    std::cout<<"Введите 1 что бы нарисовать окно, \nдля выхода нажмите клавишу 2 :";
    char ch_chose = '\0';
    std::cin>>ch_chose;
    class exemple val;
    switch(ch_chose)
    {
    case '2':
            exit(0);
            break;
    case '1':
        val.WinMain( hInstance,  hPrevInst, 
         lpszArgs,  nWinMode);
            break;
    default:
        std::cout<<"Недопустимый символ попробуйте ещё! \n";
        goto SYSTEMCRASH;
    }
}
Вопрос в том, могу ли я использовать такой же подход у себя в DLL?
Если да, то куда сувать WinMain (применительно к приведенному коду)? Если же так нельзя, то как же делают другие люди?
Неужели все так сложно и нужно попотеть, чтобы создать простое окошко, которое в VBA, например, за пару минут выполняется?
ЗЫ. Прошу прощения, если со стороны мои умопостроения похожи на бред
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2012, 18:32     Создание диалогового окна из DLL
Посмотрите здесь:

C++ передать значение из одного поля диалогового окна в другое поле
C++ Создание диалогового окна в Dev-C++
Создание dll C++
C++ CDocument::OnSaveDocument указать фильтр для диалогового окна сохранения файла
C++ Создание DLL
Как выводить графику во фрагменте диалогового окна? C++
Изменение ProgressBar диалогового окна из любого места C++
Проблема с методом OnOk для диалогового окна C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 22:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru