Poprawność kodu winapi

0

Czy poniższy sposób tworzenia dwóch okienek na bazie jednej klasy jest poprawny od strony samego standardu?
Jeśli nie, to jak powinno się to zrobić?

#include "stdafx.h"
#include <windows.h>

TCHAR className[] = TEXT("nazwa klasy");
TCHAR appName[] = TEXT("nazwa programu");
TCHAR appName2[] = TEXT("nazwa programu drugiego");

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {   
    case WM_CREATE:
        MessageBox(hWnd, TEXT("WM_CREATE"), appName, MB_OK);
        break;
    case WM_DESTROY:
        MessageBox(hWnd, TEXT("WM_DESTROY"), appName, MB_OK);
        PostQuitMessage(0);
        break;
    case WM_CLOSE:
        if(MessageBox(hWnd, TEXT("Zakończyć działanie aplikacji"), appName, MB_YESNO)==IDYES)
        {
            return DefWindowProc(hWnd, msg, wParam, lParam);
        }
        else return 0;
    default: return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    WNDCLASSEX wc;
    wc.cbClsExtra = 0;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.hCursor = 0;
    wc.hIcon = 0;
    wc.hIconSm = 0;
    wc.hInstance = hInstance;
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = className;
    wc.lpszMenuName = 0;
    wc.style = CS_HREDRAW | CS_VREDRAW;

    if(!RegisterClassEx(&wc))
    {
        MessageBox(0, TEXT("Błąd funkcji RegisterClassEx"), appName, MB_OK);
        return 1;
    }

    HWND h = CreateWindowEx(0, className, appName, WS_OVERLAPPEDWINDOW, 0, 0, 300, 200, 0, 0, hInstance, 0);
    HWND h2 = CreateWindowEx(0, className, appName, WS_OVERLAPPEDWINDOW, 300, 200, 300, 200, 0, 0, hInstance, 0);,

    if(!h)
    {
        MessageBox(0, TEXT("Błąd funkcji CreateWindowEx"), appName, MB_OK);
        return 2;
    }
    if (!h2)
    {
        MessageBox(0, TEXT("Błąd funkcji CreateWindowEx 2"), appName2, MB_OK);
        return 2;
    }
    ShowWindow(h, nShowCmd);
    ShowWindow(h2, nShowCmd);
    UpdateWindow(h);
    UpdateWindow(h);
    MSG msg;

    while(GetMessage(&msg, 0, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg); 
    }
    UnregisterClass(className, hInstance);
    return msg.wParam;
}
0

Zdefiniuj osobne procedury przetwarzania wiadomości dla każdego z okien.

0

nie zrobię tego, jeśli oba okna bazują na tej samej klasie

0

Możesz to zrobić przy użyciu funkcji SetWindowLong.

0

Dlaczego osobne skoro to ma być ta sama klasa czyli to samo okno? O.o Jak okna mają być różne to i niech klasy będą różne.

0

Wszystko zależy od tego co chcemy robic z tymi oknami. Jeśli chcemy utworzyć kilka takich samych okien, z tym samym kontekstem roboczym i tymi samymi, obsługiwanymi zdarzeniami to rzeczywiście jedna procedura przetwarzania wiadomości wystarczy. Tym niemniej jeśli chcemy utworzyć kilka okien na bazie tej samej klasy okna, ale z np. różnym kontekstem roboczym dla każdego z okna osobna, to trzeba wtedy utworzyć tyle procedur przetwarzania wiadomości, co liczba okien.

0

Zmiana procedury komunikatów przyda się przy subclassing'u czyli tworzeniu całkiem nowych okien bazujących na wspólnym szkielecie. Jeśli chcemy dać możliwość "dostrojenia" okna możemy to wykonać na wiele sposobów. Przez przekazanie i zapisanie sobie jakichś parametrów czy funkcji callback (z pomocą GWL_WINDOW_LONG) i/lub wysłanie jakiegoś komunikatu do okna lub z okna do jego parent'a lub innego okna (WM_NOTIFY, WM_USER+...).

0

Ok, masz większą wiedzę, więc poddaje się i przynaję Ci rację :) Z mojej strony dodam tylko, że WINAPI poznawałem głównie przy pomocy książki pana Piotra Besty, a w jego książce zawarty był właśnie przykład tworzenia kilku okien na bazie tej samej klasy z osobnymi procedurami przetwarzającymi wiadomości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0