Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Cambalinho

[c++ - win32] - fazer 1 class form

Recommended Posts

eu estou a fazer 1 class form, mas estou a ter vários problemas :(

 void setParent(HWND parent=GetDesktopWindow())    {            WNDCLASSEX FormClass;            char classname[]="form";            HINSTANCE mod = (HINSTANCE)GetModuleHandle(NULL);            FormClass.cbSize        = sizeof(WNDCLASSEX);            FormClass.style         = 0;            FormClass.lpfnWndProc   = WndProcForm;            FormClass.cbClsExtra    = 0;            FormClass.cbWndExtra    = 0;            FormClass.hInstance     = mod;            FormClass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);            FormClass.hCursor       = LoadCursor(NULL, IDC_ARROW);            FormClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);            FormClass.lpszMenuName  = NULL;            FormClass.lpszClassName = classname;            FormClass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);            // register the new window class"            RegisterClassEx(&FormClass);            SetProp(hwnd, formpropname, (HANDLE)FormClass.lpfnWndProc);            hwnd = CreateWindowEx(0, classname, "The title of my window", WS_OVERLAPPEDWINDOW | WS_TABSTOP, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, parent, NULL, mod, (LPVOID) this);            if (hwnd == NULL)                MessageBox(NULL, "Can't create the control", "error", MB_OK);            SetProp(hwnd, formclassprop, (HANDLE)this);            ShowWindow(hwnd, SW_NORMAL);            UpdateWindow(hwnd);            clrBackColor= GetBkColor(GetDC(parent));            clrTextColor = GetTextColor(GetDC(parent));        RECT a;        GetClientRect(hwnd,&a);        intTop=a.top;        intLeft=a.left;        intWidth=a.right-a.left;        intHeight=a.bottom-a.top;    }

o form é mostrado, mas tenho alguns problemas com o procedimento de menssagens.

static LRESULT CALLBACK WndProcForm(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)    {        static POINT PreviousLocation, Location;        static bool Tracking = false;        static MouseButtons MBButtons;        static bool blControl=false;        static bool blShift=false;        static bool blResize=false;        static int xPos=0;        static int yPos=0;        static UINT_PTR timerid;        static bool blnDrag=false;       //preparing the message loop for be used in super class way        //Getting the parent procedure        WNDPROC oldproc = (WNDPROC)GetProp(GetDesktopWindow(), formpropname);        if (oldproc == NULL)            MessageBox(NULL, "Can't find old procedure", "error", MB_OK | MB_ICONEXCLAMATION);        //add the instance class to inst pointer        form *inst = (form*)GetProp(hwnd, formclassprop);                if (inst == NULL && msg == WM_NCCREATE)        {            inst = (form*)(((LPCREATESTRUCT)lParam)->lpCreateParams);            SetProp(hwnd, formclassprop, (HANDLE)inst);        }        if (inst == NULL)            MessageBox(NULL, "Can't find the instance pointer", "error", MB_OK);        //Working with messages        switch(msg)        {            case WM_CREATE:            {                RECT a;                GetWindowRect(hwnd,&a);                Create(a.left, a.top);            }            break;            case WM_COMMAND:            {                SendMessage(hwnd,WM_COMMAND,wParam,lParam);            }            break;

1 - porque nao obtenho o oldproc(eu penso que isso tem haver de poder ter varias instancias do objecto\control)?
2 - porque nao obtenho o ponteiro inst?

(estas 2 questoes funcionam bem com butoes e outros)

3 - quando meto 1 butao e clico, o SendMessage() deveria fazer o seu trabalho, mas em vez disso o sistema operativo da-me 1 mensagem de erro e encerra o programa :(

o que estou a fazer de errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • como fazer 1 super class:

    1 - ao criar 1 objecto com a funçao CreateWindowEx(), mandamos o 'this' como o ultimo parametro:

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE|CS_HREDRAW | CS_VREDRAW , classname, strCaption.c_str(), WS_OVERLAPPEDWINDOW | BS_NOTIFY,                                  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, parent, NULL, mod, this);

    2 - no procedimento das mensagens criamos o pointeiro da class:

    form *inst = (form *)GetWindowLongPtr(HandleWindow, GWLP_USERDATA);

    3 - na mesagem WM_NCCREATE, nós damos o valor ao ponteiro:

    switch(msg)            {                case WM_NCCREATE:                {                    CREATESTRUCT *p = (CREATESTRUCT *)lParam;                    inst = (form *)p->lpCreateParams;                    SetWindowLongPtr(HandleWindow, GWLP_USERDATA, (LONG_PTR)inst);                    inst->hwnd = HandleWindow;                }                break;

    agora vou vos dar mais umas dicas:

    1 - imagem que o BS_NOTIFY do butao(ou outro objecto) nao funciona(no procedimento de mensagens do butao):

    case WM_COMMAND:            {                switch(HIWORD(wParam))                {                    case BN_CLICKED:                    {                        inst->MouseClick();                    }                    break;                }                break;            }            break;

    então no procedimento de mensagens do form, fazemos:

    case WM_COMMAND:                {                    SendMessage((HWND)lParam , WM_COMMAND, wParam, lParam);                }                break;

    1 - derem conta que vos falha alguma tecla das mensagens do teclado ou outra mensagem do procedimento, revejam o Ciclo de Mensagens:

    while(GetMessage(&Msg, NULL, 0, 0) > 0)    {        TranslateMessage(&Msg);        DispatchMessage(&Msg);    }

    este ciclo pode ser alterado e tambem pode fazer-mos perder algumas funcionalidades... eu uso o ciclo desta forma e nao tenho problemas.

    muito obrigado e fiquem

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×