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