Olá, estou criando um programa que utiliza a Windows API e estou com um problema:
Tenho uma Clase CFrame, que deriva da classe Control, ao inicializar, a classe CFrame guarda o HWND nela mesma e aciona um método global, chamado "AddWindow", que está no arquivo WindowManager.cpp, esse método armazena o HWND e o objeto CFrame, depois, quando o WndProc é acionado, o WindowManager.cpp procura um CFrame que corresponda ao HWND solicitado (Control *GetFrameByHandle(HWND hwnd)) numa classe chamada Hashtable, na primeira janela criada, funciona perfeitamente, mas se eu quiser criar outra janela, a janela é criada, mas durante o WndProc, o CFrame correspondente ao HWND não é encontrado, consequentemente, isso acontece:
A janela da direita foi criada primeiro, durante o método WinMain, a da esquerda foi criada em outro método.
Pergunta
Igor Lira
Olá, estou criando um programa que utiliza a Windows API e estou com um problema:
Tenho uma Clase CFrame, que deriva da classe Control, ao inicializar, a classe CFrame guarda o HWND nela mesma e aciona um método global, chamado "AddWindow", que está no arquivo WindowManager.cpp, esse método armazena o HWND e o objeto CFrame, depois, quando o WndProc é acionado, o WindowManager.cpp procura um CFrame que corresponda ao HWND solicitado (Control *GetFrameByHandle(HWND hwnd)) numa classe chamada Hashtable, na primeira janela criada, funciona perfeitamente, mas se eu quiser criar outra janela, a janela é criada, mas durante o WndProc, o CFrame correspondente ao HWND não é encontrado, consequentemente, isso acontece:
A janela da direita foi criada primeiro, durante o método WinMain, a da esquerda foi criada em outro método.
WndProc:
LRESULT CALLBACK GlobalWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { LRESULT result = -1; switch( message ) { [...] } Control *frame = GetFrameByHandle(hwnd); if(frame && frame->ready == true)// != NULL) { LRESULT r = frame->WndProc(message, wparam, lparam); if(r != -1) return r; if(result != -1) return result; } else { int i = 0; } return DefWindowProc( hwnd, message, wparam, lparam ); }AddWindow:void AddWindow(HWND hwnd, Control* frame) { windowList.add(hwnd, frame); }GetFrameByHandle:Control *GetFrameByHandle(HWND hwnd) { std::vector<Control*> wnds = windowList.GetValues(); for(int i = 0; i < wnds.size(); i++) { Control* frame = wnds[i]; if(frame->hwnd == hwnd) return frame; } return NULL; }Uma observação é que os valores do HWND do CFrame mudam espontaneamente, por um motivo que desconheço:
Notem que o [0] é a única janela que funciona corretamente.
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.