Ir ao conteúdo
  • Cadastre-se

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


Cambalinho

Posts recomendados

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?

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois...

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

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...