• Nenhum resultado encontrado

4 DESCRIÇÃO DO PROJETO

4.7 O Módulo de Janelas

O módulo de janelas consiste em um conjunto de classes C++ que implementam o controle de exibição, das funcionalidades e dos dados internos das janelas do programa. Existem, para cada uma das janelas, duas interfaces: a CBaseWindowAbstractInterface e a sua respectiva interface avançada. Enquanto a CBaseWindowAbstractInterface é uma interface comum a todas as janelas, as interfaces avançadas apresentam variações para cada janela de acordo com seus dados e funcionalidades específicas implementadas.

Não existe relação hierárquica entre a interface avançada de uma janela e sua CBaseWindowAbstractInterface. A implementação da classe da janela, entretanto, herda e implementa indiretamente ambas as classes.

Como mencionado na Seção 4.6, a partir do módulo Kernel do programa, através do método GetWindow desse módulo, obtém-se acesso a um objeto que implementa a interface CBaseWindowAbstractInterface. A forma de determinar exatamente qual objeto, e portanto qual janela esse objeto controla, é utilizando o parâmetro “szWindowName” do método GetWindow. Esse parâmetro é o nome do objeto da janela sobre o qual se deseja operar. Cada classe de janela possui um nome e ele é único em todo o programa. O registro do nome é feito no construtor do objeto da janela e o registro de nomes é realizado antes da execução da função principal do programa (WinMain).

Segue a interface CBaseWindowAbstractInterface:

class CBaseWindowAbstractInterface { public: CBaseWindowAbstractInterface(){}; virtual ~CBaseWindowAbstractInterface(){};

7 O tipo de dados unsigned int é um tipo de dados para números inteiros positivos e o 0 padrão da linguagem C. Ele, nesta implementação, tem 32 bits de largura de dados podendo, portanto, representar até 232 números.

8 O tipo de dados float é um tipo de dados para a representação de números reais da linguagem C. Ele é implementado utilizando o padrão de 32bits de ponto flutuante do IEEE.

virtualconstbool IsInit()=0;

virtualconstchar* GetName()=0;

virtualconstbool Run()=0;

virtualvoid* GetAdvancedInterface()=0;

};

O método GetAdvancedInterface é o mais importante desta interface. Através da sua utilização é possível ter acesso as interfaces avançadas de cada janela. Note-se, entretanto, que este método tem como tipo de retorno “void*”. O compilador, para este tipo de dado, não faz qualquer verificação em tempo de compilação para que outro tipo de dado ele seja convertido e, portanto, requer que quem utilizar esta interface conheça a que nome que interface avançada está associada para que seja feita a correta conversão. As interfaces avançadas e seus respectivos nomes serão listados posteriormente neste Seção.

O principal ponto de acesso do módulo de janelas é a classe que representa a janela principal do programa. O nome deste módulo é “MainWindow” e sua interface é a CMainWindowAdvancedInterface expressa a seguir:

class CMainWindowAdvancedInterface

{

public:

typedef void(*TDCallback)(void *);

virtualbool* GetInformationDisplayStatus()=0;

virtualbool* GetInformationDisplay()=0;

virtualbool* GetInformationDisplayChangedStatus()=0;

virtualconstbool SetInformationTagDisplayMode(EImageInformationTags eTag,constbool

boShow)=0;

virtualconstbool GetInformationTagDisplayMode(EImageInformationTags eTag, bool&

boStatus)=0;

virtualconstbool ToggleInformationTagDisplayMode(EImageInformationTags

eTag)=0;

virtual CImageWindowAdvancedInterface* GetSelectedImageWindow()=0;

virtualconstbool SetSelectedImageWindow(CImageWindowAdvancedInterface*

poImageWindow)=0;

virtualvoid NotifyImageWindowClick(CImageWindowAdvancedInterface*

poImageWindow)=0;

virtualconstbool RegisterPluginCommand(constchar*

szCommandName,CMainWindowAdvancedInterface::TDCallback pfnCallback,void* poOwner=NULL)=0;

virtualconstbool RegisterPluginCommand(constchar* szCommandName,constchar**

szMenuPath,const size_t nLevels,CMainWindowAdvancedInterface::TDCallback pfnCallback,void* poOwner=NULL)=0;

virtualvoid KillWindow(CImageWindowAdvancedInterface* poWindow)=0;

virtual HWND GetWindowHandle()=0;

virtualvoid RedistribuiSeries(constunsignedint nLinhas, constunsignedint nColunas,constunsigned

int nLinhasImagens, constunsignedint nColunasImagens)=0; };

O acesso às janelas foi projetado para acontecer sobre as janelas de imagem. Ele pode ser obtido através do método GetSelectedImageWindow, que retorna uma interface para objeto CImageWindowAdvancedInterface ou NULL, valor 0, caso não haja nenhuma janela de imagem selecionada. É necessário, sempre que este método for chamado, verificar se seu valor de retorno é NULL para evitar falhas catastróficas do sistema.

A CMainWindowAdvancedInterface possui, também, outros métodos de significativa importância para uso em conjunto com os plug-ins. Estes métodos são as duas sobrecargas do RegisterPluginCommand. Ambos registram criam comandos de menu para os plug-ins cujo nome será a string C passada no parâmetro szCommandName e em ambos, quando o comando do plug-in for ativado a função pfnCallback será invocada com o parâmetro poOwner sendo passado. A diferença entre ambos é que a sobrecarga que aceita menos parâmetros insere, por facilidade para o usuário, comandos somente no sub-menu filtros enquanto a versão de mais parâmetros permite colocar o comando em qualquer sub-menu ou criar novos sub-menus.

Para criar um novo sub-menu utilizando a versão com mais parâmetros do método RegisterPluginCommand é necessário passar para ele um vetor9 de strings C e no parâmetro szMenuPath. No parâmetro nLevels o número de elementos do vetor deve ser passado.

A interface CImageWindowAdvancedInterface é a interface através da qual é possível obter o acesso a imagens e a dados de exibição da imagem. Ela é apresentada a seguir:

class CImageWindowAdvancedInterface

{

public:

virtualconstbool SetInformationTagDisplayMode(EImageInformationTags eTag,constbool

boShow)=0;

virtualconstbool GetInformationTagDisplayMode(EImageInformationTags eTag, bool&

boStatus)=0;

virtualconstbool ToggleInformationTagDisplayMode(EImageInformationTags eTag)=0;

9 O significado de vetor nesse ponto do texto diz respeito ao jargão de linguagens de programação referindo-se a um conjunto de posições de memória contígua que contém uma seqüência de elementos de um mesmo tipo de dados.

virtualconstbool SetCurrentImage(CImageAdvancedInterface* poImage)=0;

virtualconstbool UpdateImage()=0;

virtualvoid GetImageRect(unsignedint& nLeft,unsignedint& nTop,unsignedint& nRight,unsigned

int& nBottom)=0;

virtualvoid UpdateWindowDependencies()=0;

virtualconst HWND GetWindowHandle()=0;

virtual IDirect3DTexture9* GetCurrentImage()=0;

virtual CImageAdvancedInterface* GetImage()=0;

virtualdouble* GetImageComplexRepresentation()=0;

virtualconstbool ComputeFastFourrierTransform(constbool boReverse=false)=0;

virtualvoid GetComplexImageDimensions(unsignedint& nComplexWidth,unsignedint&

nComplexHeight)=0;

virtualconstbool UpdateImageFromComplexRepresentationUsingOnlyRealPart()=0;

virtualvoid SetMouseSelectionMode(constbool boSelectionMode)=0;

virtualconstbool GetMouseSelectionMode()=0;

virtualvoid ToggleMouseSelectionMode()=0;

virtualvoid SetMouseSelectionRectangle(int nLeft,int nTop,int nRight,int

nBottom)=0;

virtualconstbool CreateTempTexture()=0;

virtualconstbool CommitTempTexture()=0;

virtualconstbool DestroyTempTexture()=0;

virtualconstbool SetBrightValue(constdouble dValue)=0;

virtualconstbool SetSaturationValue(constdouble dValue)=0;

virtualconstbool Run()=0;

virtual CImageWindow* GetImplementation()=0;

virtualconstunsignedint GetNumberOfPaletteClasses()=0;

virtualconstunsignedint GetPaletteClassDescriptors(PALETTEENTRY* astColor,unsigned

char* anLowerLimit,unsigned char* anHigherLimit)=0; };

Existem duas formas através das quais o VPIM foi planejado para fornecer acesso dos dados de uma imagem para um plug-in: através da representação no domínio da freqüência da imagem e através da representação no domínio espaço. A representação no domínio do espaço pode ser obtida através do método GetCurrentImage, ele retorna a interface do DirectX através da qual é possível manipular a imagem em exibição na janela.

A representação no domínio da freqüência é obtida através do método GetImageComplexRepresentation. Este método, entretanto, só retornará um valor válido (diferente de NULL) caso antes o método ComputeFastFourrierTransform com o parâmetro boReverse com o valor false seja chamado.

É possível que as dimensões da imagem sejam diferentes de sua representação complexa. Em função disso, é sempre necessário chamar o método GetComplexImageDimensions para obter as dimensões da representação complexa. Uma vez que as operações sobre a representação da imagem em domínio freqüência estejam completas, é necessário invocar o método ComputeFastFourrierTransform mais uma vez passando como parâmetro o valor true.

A representação complexa da imagem obtida através do método GetImageComplexRepresentation é baseada em scanlines de elementos do tipo double do C++, planar. Ou seja, primeiramente todo o plano real da imagem é representado com as dimensões obtidas em GetComplexImageDimensions e nas posições de memória adjacentes todo o plano imaginário da imagem.

Documentos relacionados