Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Переделать встроенный класс...


Автор: ShurikA 9.8.2006, 09:29
Можно ли переделать внешний вид, и частично функциональность встроенного в SDK диалога?
ну на пример:

хотелось бы в диалог класса ColorDialog вставить ещё один контроль и пользоваться эго данными.

Автор: Romikgy 9.8.2006, 10:00
А что мешает те его туда добавить?

Автор: ShurikA 9.8.2006, 10:07
Kak?

Автор: Romikgy 9.8.2006, 10:13
как и всегда создаешь контрол и в родителях указываешь нужный те диалог

Автор: ShurikA 9.8.2006, 10:30
Цитата(Romikgy @  9.8.2006,  09:13 Найти цитируемый пост)
как и всегда

никогда это не делал, без понятия как всегда...


Цитата(Romikgy @  9.8.2006,  09:13 Найти цитируемый пост)
создаешь контрол и в родителях указываешь нужный те диалог 

это понятно, 
но куда он вставит этот контрол?
если не сложно можно простайший пример...

Автор: Romikgy 9.8.2006, 11:15
Цитата(ShurikA @  9.8.2006,  09:30 Найти цитируемый пост)
это понятно, но куда он вставит этот контрол?если не сложно можно простайший пример...

Код

HWND CreateWindow(

    LPCTSTR lpClassName,    // pointer to registered class name какой класс контрола
    LPCTSTR lpWindowName,    // pointer to window name название 
    DWORD dwStyle,    // window style  стиль окна/контрола
    int x,    // horizontal position of window  горизонталь
    int y,    // vertical position of window вертикаль
    int nWidth,    // window width ширина 
    int nHeight,    // window height высота
    HWND hWndParent,    // handle to parent or owner window родитель
    HMENU hMenu,    // handle to menu or child-window identifier меню
    HANDLE hInstance,    // handle to application instance приложени
    LPVOID lpParam    // pointer to window-creation data юзер даные
   );


терь понятно?

Автор: ShurikA 9.8.2006, 11:17
Цитата(Romikgy @  9.8.2006,  10:15 Найти цитируемый пост)
терь понятно?

нет...

Добавлено @ 11:19 
Поставлю вопрос по другому:
Если я создаю новый класс отталкиваясь от ColorDialog , как мне обратиться к его существующим контролям?

Автор: Romikgy 9.8.2006, 11:32
Цитата(ShurikA @  9.8.2006,  10:17 Найти цитируемый пост)
Если я создаю новый класс отталкиваясь от ColorDialog , как мне обратиться к его существующим контролям?

Исходный код в студию

Автор: ShurikA 9.8.2006, 11:41
Код

// TextFontDialog.cpp : implementation file
//

#include "stdafx.h"
#include "FibIm.h"
#include "TextFontDialog.h"

#ifndef _WIN32_WCE // CFontDialog is not supported for Windows CE.

// CTextFontDialog

IMPLEMENT_DYNAMIC(CTextFontDialog, CFontDialog)

CTextFontDialog::CTextFontDialog(LPLOGFONT lplfInitial, DWORD dwFlags, CDC* pdcPrinter, CWnd* pParentWnd) : 
    CFontDialog(lplfInitial, dwFlags, pdcPrinter, pParentWnd)
{

}

CTextFontDialog::~CTextFontDialog()
{
}


BEGIN_MESSAGE_MAP(CTextFontDialog, CFontDialog)
END_MESSAGE_MAP()



// CTextFontDialog message handlers


#endif // !_WIN32_WCE

Автор: Earnest 9.8.2006, 11:44
Цитата(MSDN)

To customize the dialog box, derive a class from CColorDialog, provide a custom dialog template, and add a message map to process the notification messages from the extended controls. Any unprocessed messages should be passed to the base class.

Шаблон диалога нужно указать в m_cc, например в конструкторе производного класса. В шаблон нужно поместить только добавочные контролы. Я так делала с CFileDialog. Нужно иметь в виду, что твой диалог будет дочерним по отношению к стандартному.

Добавлено @ 11:49 
Хотя с ColorDialog может быть не совсем так: возможно, там нужно полностью заменять шаблон.

Автор: ShurikA 9.8.2006, 12:05
На самом деле в данный момент я веду речь о CFontDialog но это не важно.
 
интересная вещь: Я попробовал воспользоваться тем классом что написам выше без изменений, и при этом он ругается на то что не установлрнны фонты...  smile 


Цитата(Earnest @  9.8.2006,  10:44 Найти цитируемый пост)
возможно, там нужно полностью заменять шаблон. 

Как это делается?

Автор: Earnest 9.8.2006, 12:28
В классе CFontDialog есть член m_cf. Это struct CHOOSEFONT, у которой есть поле lpTemplateName. Кроме того, нужно установить соответствующий флаг (см. ниже) и указать в hInstance тот модуль где находится ресурс.
Это все можно сделать, например, в конструкторе производного класса. Рисуешь свой шаблон, главное, чтобы все поля имели те же идентификаторы и тип, надо полагать.

Цитата

lpTemplateName
Pointer to a null-terminated string that names the dialog box template resource in the module identified by the hInstance member. This template is substituted for the standard dialog box template. For numbered dialog box resources, lpTemplateName can be a value returned by the MAKEINTRESOURCE macro. This member is ignored unless the CF_ENABLETEMPLATE flag is set in the Flags member. 

Автор: ShurikA 9.8.2006, 12:34
Earnest, 
ещё пару вопросов и я догонюsmile
1.
Цитата(Earnest @  9.8.2006,  11:28 Найти цитируемый пост)
главное, чтобы все поля имели те же идентификаторы и тип

как я могу знать идентификаторы и тип?

Автор: Earnest 9.8.2006, 12:54
А Спай на что?

Добавлено @ 12:54 
Тип - в смысле Window Class (не надо вместо лист-бокса ставить статик)

Автор: ShurikA 9.8.2006, 13:20
Сделал так:
1. Скопировал шаблон как есть из SDK (FONT.dlg) в мой ресорс фаил.
2. В конструкторе своего класса:
Код

CTextFontDialog::CTextFontDialog(LPLOGFONT lplfInitial, DWORD dwFlags, CDC* pdcPrinter, CWnd* pParentWnd) : 
    CFontDialog(lplfInitial, dwFlags, pdcPrinter, pParentWnd)
{
    m_cf.lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG_TEXT);
    m_cf.Flags |=CF_ENABLETEMPLATE;
}


теперь далаю с ним чего хочу smile
спасибо!

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