Ola.Hoje estive vendo e estudando sobre subclassing, e estarei ensinando de um modo facil a entender e usar subclassing.Subclassing serve para receber os comandos de uma janela em uma funcao especifica;nessa funcao o programador pode, por exemplo, criar menus personalizados, limitar o tamanho ou posicao de uma janela, enfim, o que ser possivel, atraves das variaveis que tal funcao recebe.Criando um subclassing localPara se criar um subclassing, use a API SetWindowLong com a constante GWL_WNDPROC = (-4), sendo o terceiro parametro o endereco da funcao que ira receber as mensagens do subclassing, como mostrado abaixo:Dim OldProcAddr as LongPrivate Const GWL_WNDPROC = (-4)Sub SubclassTo(ByVal hWnd As Long)OldProcAddr = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc)End SubOBSERVACOES IMPORTANTES: antes de definir um subclassing, e necessario obter o endereco da funcao de subclassing padrao. Para isso, simplismente atribua o SetWindowLong com tais parametros acima, a uma variavel do tipo Long. A variavel, entao, recebera o valor antigo do endereco que processa por padrao as mensagens da janela. Isso e importante para quando finalizarmos o formulario, restaurarmos a funcao padrao, para nao ocorrer um crash no sistema.Recebendo dados atraves do subclassingNa secao acima aprendemos a configurar o formulario para enviar as mensagens para nossa funcao. Nesta secao aprenderemos a MONTAR essa funcao.A funcao, seja ela com qual nome for (isso vai do gosto do programador), tem obrigatoriamente QUATRO parametros, entre eles:ByVal Hwnd as Long: ira retornar a handle do formularioByVal wMsg as Long: ira retornar o WM relacionado ao comando atual da janela (explicarei na proxima secao)ByVal wParam as Long: ira retornar um valor relacionado ao wmsg, tipo como um parametroByVal lParam as Long: dependendo do wMsg, retorna o endereco de uma estrutura, seja ela WINDOWPOS ou KBDSTRUCT. So temos de declarar o tipo que sera usado para a finalidade desejada.A funcao deve ter essa estrutura: [Private/Public] Function [NomeDaFuncao] (ByVal hWnd as Long, ByVal wMsg as Long, ByVal wParam as Long, ByVal lParam as Long)'Aqui serao feitas as condicoes para executar determinada acaoIf wMsg = WM_MENSAGEMDESEJADA then'executa uma acao caso o wmsg seja a constante desejadaNomeDaFuncao=1 'Continua recebendo os valores, entretanto, executa a propria acao definida pelo programadorElseNomeDaFuncao = CallWindowProc(OldProcAddr, hWnd, wMsg, wParam, lParam) 'necessario para fazer a acao padrao relacionada ao wMsg.End If End FunctionHwnd, wParam, wmsg e lparam podem receber outros nomes, mas tem necessariamente que estarem na mesma posicao padrao.Entendendo o wMsg e as constantes WM_Como vimos na secao anterior, o wMsg (ou seja la qual for o nome escolhido pelo programador para declarar tal variavel na funcao) recebe um valor oriundo das constantes iniciadas por "WM_". Irei explicar algumas delas e pra que servem.WM_ACTIVATE (&H6): mensagem executada quando o formulario e ativado.WM_SHOWWINDOW (&H18): mensagem executada quando o formulario aparece. E o primeiro comando executado quando o formulario se iniciaWM_WINDOWPOSCHANGING (&H46): mensagem executada quando o sistema processa a posicao e tamanho da janela. Sucedido por:WM_WINDOWPOSCHANGED (&H47): mensagem executada apos o sistema processar a posicao e tamanho da janela. Ambos (WINDOWPOSCHANGING e WINDOWPOSCHANGED) recebem como lParam o endereco de uma estrutura WINDOWPOS.WM_KILLFOCUS (&H8): mensagem executada quando o usuario deixa o formulario em questao.WM_MOUSEMOVE (&H200): mensagem executada quando