Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2013, 00:48   #1
Zooma
Пользователь
Пользователь
 
Аватар для Zooma
 
Регистрация: 06.06.2011
Сообщений: 18
Подмигивание Не регистрирует класс окна

Написал пример с книги Юрия Щупака он скомпилировался без ошибок, при выполнение программы обнаруживается невозможность зарегистрировать класс окна.
Я погугхлил и нашёл подобный пример и модифицировал его, стал рабочий. Вопрос - почему тот код не пашет?
Пример с книги Юрия Щупака.
Код:
#include <windows.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine, int nCmdShow)
{
	HWND hMainWnd;
	char szClassName[] = "MyClass";
	MSG msg;
	
        WNDCLASSEX wc;
        
	    // Заполняем структура класса
	    wc.cbSize 		 = sizeof(wc);
	    wc.style		 = CS_HREDRAW | CS_VREDRAW;
	    wc.lpfnWndProc	 = WndProc;
	    wc.cbClsExtra 	 = 0;
	    wc.cbWndExtra	 = 0;
	    wc.hInstance 	 = hInstance;
	    wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
	    wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
 	    wc.lpszMenuName  = NULL;
	    wc.lpszClassName = szClassName;
	    wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION);
        
	// Регестрируем основной класс окна
	if (!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Cannot register class!", "Error", MB_OK | MB_ICONERROR);
		return 0;
		}
	// Создаём основное окно приложения
	hMainWnd = CreateWindow(
	szClassName, "A Hello Application", WS_OVERLAPPEDWINDOW,
	CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
	(HWND)NULL, (HMENU)NULL,
	(HINSTANCE)hInstance, NULL
	);
	
	if (!hMainWnd) {
	MessageBox(NULL, "Cannot create main window!", "Error", MB_OK | MB_ICONERROR);
	return 0;
	}
	
	
	ShowWindow(hMainWnd, nCmdShow);
	
	
	
	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	
	return msg.wParam;
}

	LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
	{       
        HDC hDC;
		PAINTSTRUCT ps;
		RECT rect;
		
		switch (uMsg)
	    {
		case WM_PAINT:
			hDC = BeginPaint(hWnd, &ps);
			
			GetClientRect(hWnd, &rect);
			DrawText(hDC, "Hello, World!", -1, &rect,
				DT_SINGLELINE | DT_CENTER | DT_VCENTER );
			EndPaint(hWnd, &ps);
			break;
			
		case WM_CLOSE:
			DestroyWindow(hWnd);
			break;
		
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
			
		default:
			return DefWindowProc(hWnd, uMsg, wParam, lParam);
		}
		return 0;
	}
Модифицированный пример. Регистрация класса окна запущена в отдельной фунцкии
Код:
#include <windows.h>

ATOM MyRegisterClass(HINSTANCE hInstance); 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine, int nCmdShow)
{
	HWND hMainWnd;
	//char szClassName[] = "MyClass";
	MSG msg;
	
/*	
        WNDCLASSEX wc;
        
	    // Заполняем структура класса
	    wc.cbSize 		 = sizeof(wc);
	    wc.style		 = CS_HREDRAW | CS_VREDRAW;
	    wc.lpfnWndProc	 = WndProc;
	    wc.cbClsExtra 	 = 0;
	    wc.cbWndExtra	 = 0;
	    wc.hInstance 	 = hInstance;
	    wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
	    wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
 	    wc.lpszMenuName  = NULL;
	    wc.lpszClassName = szClassName;
	    wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION);
 */  
      
	// Регестрируем основной класс окна
    MyRegisterClass(hInstance);
	// Создаём основное окно приложения
	hMainWnd = CreateWindow(
	"Hello", "A Hello Application", WS_OVERLAPPEDWINDOW,
	CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
	(HWND)NULL, (HMENU)NULL,
	(HINSTANCE)hInstance, NULL
	);
	
	if (!hMainWnd) {
	MessageBox(NULL, "Cannot create main window!", "Error", MB_OK | MB_ICONERROR);
	return 0;
	}
	
	
	ShowWindow(hMainWnd, nCmdShow);
	
	
	
	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	
	return msg.wParam;
}
// Вот она
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszClassName	= "Hello";
	wcex.hIconSm		= LoadIcon(wcex.hInstance, IDI_APPLICATION);

	return (RegisterClassEx(&wcex)!=0);
}


	LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
	{       
        HDC hDC;
		PAINTSTRUCT ps;
		RECT rect;
		
		switch (uMsg)
	    {
		case WM_PAINT:
			hDC = BeginPaint(hWnd, &ps);
			
			GetClientRect(hWnd, &rect);
			DrawText(hDC, "Hello, World!", -1, &rect,
				DT_SINGLELINE | DT_CENTER | DT_VCENTER );
			EndPaint(hWnd, &ps);
			break;
case WM_CLOSE:
			DestroyWindow(hWnd);
			break;
		
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, uMsg, wParam, lParam);
		}
		return 0;
	}

Последний раз редактировалось Stilet; 04.06.2013 в 08:24.
Zooma вне форума Ответить с цитированием
Старый 04.06.2013, 09:01   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Не работает, потому что не проинициализированы все переменные в wc.
waleri вне форума Ответить с цитированием
Старый 04.06.2013, 15:10   #3
Zooma
Пользователь
Пользователь
 
Аватар для Zooma
 
Регистрация: 06.06.2011
Сообщений: 18
По умолчанию

Спасибо, за ответ. Добавил в код
PHP код:
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
и всё заработало.
Zooma вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс-обложка для диалогового окна на WINAPI. KemanSR Win Api 7 15.12.2012 22:19
Получить хендл и класс окна по названию exe Lauri Общие вопросы Delphi 7 01.07.2011 16:29
Узнать к какому процессу принадлежит известный класс окна Человек_Борща Общие вопросы Delphi 4 05.09.2010 00:27
Как узнать класс окна? ImmortalAlexSan Общие вопросы Delphi 3 01.08.2010 17:11
Собственный класс диалогового окна на чистом WinApi в Delphi Iber Win Api 19 01.12.2008 15:40