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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2012, 18:41   #1
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию Класс-обложка для диалогового окна на WINAPI.

Добрый день!

Задача: выполнить диалоговое окно в форме класса.

Листинг TDLG.h
Код:
#ifndef TDLG_H_INCLUDED
#define TDLG_H_INCLUDED
#include <windows.h>

class TDlg
{
public:
        TDlg(UINT nID, HWND hwndDlg, HINSTANCE hInst);
};

#endif // TDLG_H_INCLUDED

Листинг TDLG.cpp
Код:
#include "TDLG.h"

BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_INITDIALOG:
            /*
             * TODO: Add code to initialize the dialog.
             */
            return TRUE;

        case WM_CLOSE:
            EndDialog(hwndDlg, 0);
            return TRUE;

        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                /*
                 * TODO: Add more control ID's, when needed.
                 */
//                case IDC_BTN_QUIT:
//                    EndDialog(hwndDlg, 0);
//                    return TRUE;
//                case IDC_BTN_OPEN_DLGWIN:
//                    CallDlg(hwndDlg);
//                    return TRUE;
            }
    }

    return FALSE;
}

TDlg::TDlg(UINT nID, HWND hwndDlg, HINSTANCE hInst)
{
    DialogBox(hInst, MAKEINTRESOURCE(nID), hwndDlg, DLGPROC(DlgProc));
}
Вопросы:
1. Как в TDLG получить дескриптор окна? Думаю что хорошо бы при сообщении

WM_INITDIALOG, но после долгих мучений не получилось. Предполагал завести переменную

константу private типа, но из диалоговой процедуры изменить эту переменную не как.
2. Вообще для решения этой задачи я на правильном пути?

Заранее благодарен за помощь, Алексей.
KemanSR вне форума Ответить с цитированием
Старый 15.12.2012, 18:55   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

А почему именно константу? Умрет окно - хендл будет недействительным. Пусть будет protected. Возможное решение - хук WH_CBT и передача ему адреса объекта TDlg. И тогда даже до первого захода в процедуру окна объект уже имеет валидный хендл.
ps Или вот : процедуру DlgProc сделать дружественной классу.

Последний раз редактировалось EUGY; 15.12.2012 в 19:01.
EUGY вне форума Ответить с цитированием
Старый 15.12.2012, 19:16   #3
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Пусть будет protected.
Попробовал, не получилось, можно код.
KemanSR вне форума Ответить с цитированием
Старый 15.12.2012, 19:43   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Можно и не протектед, а вообще приват, но тады наследные принцы не получат доступа к хендлу. на скорую руку так:
Код:
#include "resource.h"
#include <windows.h>

class TDlg
{
	HWND hwnd;
public:	
	friend BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
	TDlg()
	{
		DialogBoxParam(0, MAKEINTRESOURCE(IDD_DIALOG1), 0, DLGPROC(DlgProc), (LPARAM)this);
	}
};

BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_INITDIALOG:
			((TDlg*)lParam)->hwnd=hwndDlg;
			return TRUE;
    }
    return FALSE;
}

int WINAPI WinMain(HINSTANCE , HINSTANCE, LPTSTR,int)
{
	TDlg Td;    
	return TRUE;
}
Но это конечно баловство. Для себя так бы не стал писать. Повторюсь, лучше хук и выяснение хендла до захода в процедуру.
EUGY вне форума Ответить с цитированием
Старый 15.12.2012, 20:58   #5
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Но это конечно баловство.
Да уж, решение не стандартное. Может я что то не так делаю? Вообще просто хотел не загромождать файл main.cpp. Скорее всего надо смотреть в сторону модульности?
KemanSR вне форума Ответить с цитированием
Старый 15.12.2012, 21:42   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

нет. это как раз стандартное решение - в DialogBoxParam передать последним параметром что-то, что проявится как LPARAM при WM_INITDIALOG.
Кто говорит, что надо загромождать cpp? Я просто для краткости так написал. А ты делай правильно. Прототипы в *.h - реализация в *.cpp. В чем проблема? Спрашивай ...
EUGY вне форума Ответить с цитированием
Старый 15.12.2012, 21:59   #7
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Спрашивай ...
Да, нет Ваш ответ я понял. У меня огромный текст в main.cpp ( в проекте он один из срр и в этой теме не его текст) и мне еще необходимо вызвать диалоговое окно. Так вот что бы не загромождать main.cpp я надумал убрать работу с диалоговым окном в другой файл. Пытаюсь убрать в класс. Спасибо за Ваши ответы!
PS: Как это сделать по-грамотней?
KemanSR вне форума Ответить с цитированием
Старый 15.12.2012, 22:19   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Так вот что бы не загромождать main.cpp я надумал убрать работу с диалоговым окном в другой файл. Пытаюсь убрать в класс.
Ну дык, правильно мыслишь! Отдельно от main.cpp создаем хидер и cpp и в нем реализуем функционал окна. Но штука вот в чем. Это C++. Какую выгоду можно получить от класса, который гвоздями прибит к одной оконной процедуре. Не правильнее ли создать нечто более абстарктное, чем окно диалога - просто класс окно. И уже в наследниках специфицировать: диалог это или какое-то дочернее окно типа кнопки. И если это будет так, то что же - в разных оконных процедурах будет дублироваться присвоение хендла? А если я сторонний пользователь этого класса и переопределю оконную процедуру, то что тогда будет с хендлом?
EUGY вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Размер диалогового окна Samir_ Win Api 0 15.03.2012 11:30
Создание диалогового окна для указания пути к рабочей книге igsxor Microsoft Office Excel 6 29.03.2011 01:01
Код диалогового окна "обзора папок" (для C++) >>arty<< Общие вопросы C/C++ 3 26.12.2010 15:49
Вызов диалогового окна Sapsan Общие вопросы C/C++ 6 30.03.2009 23:03
Собственный класс диалогового окна на чистом WinApi в Delphi Iber Win Api 19 01.12.2008 15:40