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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2012, 21:21   #1
EnterFix
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 22
Вопрос Type name expected

Начал учить ВинАПИ. Естественно первое, что захотелось понять- создание окна. Код написал по книге "Ганеев. Проектирование интерфейса пользователя средствами WIN32 API".
Код:
#include <windows.h>

BOOL RegClass(WNDPROC,LPCTSTR,UNIT);
LRESULT CALLBACK WndProc(HWND,UNIT,WPARAM,LPARAM);

HINSTANCE hInst;
char szClassName[]="WindowAppClass";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
					LPSTR lpszCmdLine,int nCmdShow)
{
	MSG msg; HWND hwnd; hInst=hInstance;
	if(!RegClass(WndProc,szClassName,COLOR_WINDOW))
		return FALSE;
	hwnd=CreateWindow(szClassName,"Моё приложение",
					 WS_OVERLAPPEDWINDOW|WS_VISIBLE,
					 CW_USEDEFAULTE,CW_USEDEFAULTE,
					 CW_USEDEFAULTE,CW_USEDEFAULTE
					 0,0,hInstance,NULL);
	if(!hwnd)
		return FALSE;
	while(GetMessage(&msg,0,0,0))
		DispatchMessage(&msg);
	return msg.wParam;
}

 BOOL RegClass(WNDPROC Proc,LPCTSTR szName,UNIT brBackground)
 {
	WNDCLASS wc;
	wc.style=wc.ClsExtra=wc.cbWndExtra=0;
	wc.lpfnWndProc=Proc;
	wc.hInstance=hInst;
	wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wc.hCursor=LoadCursor(NULL,IDC_ARROW);
	wc.hbrBackground=(HBRUSH)(brBackground+1);
	wc.lpszMenuName=NULL;
	wc.lpszClassName=szName;
	return (RegisterClass(&wc)!=0;)
 }

 LRESULT CALLBACK WndProc(HWND hwnd,UNIT msg,WPARAM wParam,LPARAM lParam)
{
	switch (msg)
	{
		case WM_DESTROY:
			{
				PostQuitMessage(0);return 0;
			}
	}
	return DefWindowProc(hwnd,msg,wParam,lParam);
}
Ошибка: [BCC32 Error] source.cpp(3): E2303 Type name expected
Т.е. в строке BOOL RegClass(WNDPROC,LPCTSTR,UNIT);
В чём дело?
Среда разработки: Embarcadero RAD Studio

Последний раз редактировалось EnterFix; 22.12.2012 в 21:23.
EnterFix вне форума Ответить с цитированием
Старый 22.12.2012, 21:27   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вероятнее всего, компилятор ругается на UNIT, т.к. должно быть UINT (от Unsigned INTeger)
netrino вне форума Ответить с цитированием
Старый 22.12.2012, 22:19   #3
EnterFix
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 22
По умолчанию

Вы правы. Исправил. Код принял такой вид:
Код:
#include <windows.h>

BOOL RegClass(WNDPROC,LPCTSTR,UINT);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE hInst;
char szClassName[]="WindowAppClass";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
					LPSTR lpszCmdLine,int nCmdShow)
{
	MSG msg; HWND hwnd; hInst=hInstance;
	if(!RegClass(WndProc,szClassName,COLOR_WINDOW))
		return FALSE;
	hwnd=CreateWindow(szClassName,"Моё приложение",
					 WS_OVERLAPPEDWINDOW|WS_VISIBLE,
					 CW_USEDEFAULT,CW_USEDEFAULT,
					 CW_USEDEFAULT,CW_USEDEFAULT,
					 0,0,hInstance,NULL);
	if(!hwnd)
		return FALSE;
	while(GetMessage(&msg,0,0,0))
		DispatchMessage(&msg);
	return msg.wParam;
}

 BOOL RegClass(WNDPROC Proc,LPCTSTR szName,UINT brBackground)
 {
	WNDCLASS wc;
	wc.style=wc.cbClsExtra=wc.cbWndExtra=0;
	wc.lpfnWndProc=Proc;
	wc.hInstance=hInst;
	wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wc.hCursor=LoadCursor(NULL,IDC_ARROW);
	wc.hbrBackground=(HBRUSH)(brBackground+1);
	wc.lpszMenuName=NULL;
	wc.lpszClassName=szName;
	return (RegisterClass(&wc)!=0);
 }

 LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	switch (msg)
	{
		case WM_DESTROY:
			{
				PostQuitMessage(0);return 0;
			}
	}
	return DefWindowProc(hwnd,msg,wParam,lParam);
}
Но теперь другая проблема:
source.cpp(13): error C2664: RegClass: невозможно преобразовать параметр 2 из "char [15]" в "LPCTSTR"
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции

Это в Visual Studio 2010
EnterFix вне форума Ответить с цитированием
Старый 22.12.2012, 22:23   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Замените
Код:
char szClassName[]="WindowAppClass";
На
Код:
TCHAR szClassName[]=_T("WindowAppClass");
И все литералы строки обрамляйте макровыражением _T
Код:
hwnd=CreateWindow(szClassName, _T("Моё приложение"),
				 WS_OVERLAPPEDWINDOW|WS_VISIBLE,
				 CW_USEDEFAULT,CW_USEDEFAULT,
				 CW_USEDEFAULT,CW_USEDEFAULT,
				 0,0,hInstance,NULL);
Связано это с использованием Unicode- или ANSI-совместимых функций (оперируют wchar_t и char соответственно, задаётся в настройках студии). Можете почитать на эту тему больше в интернете.
netrino вне форума Ответить с цитированием
Старый 22.12.2012, 22:52   #5
EnterFix
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 22
По умолчанию

netrino, спасибо. Всё заработало. Забыли только упомянуть, что нужно подключить
Код:
#include <tchar.h>
Может кому-то понадобится.
EnterFix вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при объявлении массива(Ordinal type expected). Leshii Паскаль, Turbo Pascal, PascalABC.NET 12 31.07.2012 21:03
Ошибка Unit1.pas(100): Statement expected, but expression of type 'Boolean' found sedoq Общие вопросы Delphi 3 08.02.2012 01:27
Could not convert variant of type (Olestr) into type (Double) java_91 Общие вопросы Delphi 1 18.02.2011 18:46
Type name expected почему? ImmortalAlexSan Общие вопросы C/C++ 3 10.02.2011 21:32
Could not convert variant of type (UnicodeString) into type (Double) postaveche БД в Delphi 11 13.12.2010 16:41